如何解决Java窗口中添加背景图后,再添加图片无法显示?

Pool.java
package com_Tentact_FishGame; //捕鱼达人游戏

import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.swing.JPanel;

public class Pool extends JPanel{
Pool pool;
Fish fish;
Net net;
BufferedImage poolImage;
public Pool() throws IOException {
poolImage=ImageIO.read(new File("src/image/bg.jpg")); //读取图片
}
@Override //读取图片后画图片
public void paint(Graphics g) {
g.drawImage(poolImage,0,0,null);
//g.drawImage(fish.fishImage,fish.point.x,fish.point.y,null);
** //就是上面这行代码,添加进去后就无法正常显示图片了。**
** //求大佬解决呀**
//g.drawImage(net.netImage,net.point.x,net.point.y,null);
}
}

Fish.java
package com_Tentact_FishGame;

import java.awt.Point;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.Random;

import javax.imageio.ImageIO;

public class Fish {
Fish fish;
Point point;//用点来代替鱼的位置
BufferedImage fishImage;
Random random=new Random();//随机生成数
public Fish() throws IOException {
fishImage=ImageIO.read(new File("src/image/fish01_01.png"));
int x=random.nextInt(80);//生成x坐标
int y=random.nextInt(50);//生成y坐标
point=new Point(x,y);//生成鱼的位置
}
}

Windows.java
package com_Tentact_FishGame;

import java.io.IOException;

import javax.swing.JFrame;

public class Window extends JFrame{
public Window() throws IOException {
this.setSize(800,500);
this.setTitle("捕鱼达人");
this.setLocationRelativeTo(null);//居中
this.setResizable(false);//不可调节
this.setDefaultCloseOperation(DISPOSE_ON_CLOSE);
Pool pool=new Pool();
this.add(pool);
this.setVisible(true);
}
}

Test.java
package com_Tentact_FishGame;

import java.io.IOException;

public class Test {
public static void main(String[] args) throws IOException {
Window window= new Window();
}
}

1个回答

g.drawImage(poolImage,0,0,null); 这里已经绘制过一次图片了,这个图片已经显示了。
去掉这个,放开另一个绘图方法呢?

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
Java怎么给窗口添加背景图片
package Three; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPasswordField; import javax.swing.JTextField; public class CopyOfTest3 { JFrame frame = new JFrame("小小熊^_^管理系统>"); JTextField userName = new JTextField(); JPasswordField password = new JPasswordField(); JButton ok = new JButton("确定"); JButton cancel = new JButton("取消"); JLabel l1 = new JLabel("用户名:"); JLabel l2 = new JLabel("密 码:"); JLabel l3 = new JLabel("小小熊^_^管理系统> 登录"); private void initFrame() { frame.setLayout(null); frame.setBounds(400,150,600,400); l1.setBounds(150, 105, 150, 40); l2.setBounds(150, 165, 150, 40); l3.setBounds(220, 10, 500, 40); userName.setBounds(220,110,200,35); password.setBounds(220,170,200,35); ok.setBounds(220, 250, 80, 35); cancel.setBounds(340, 250, 80, 35); frame.add(l1); frame.add(l2); frame.add(l3); frame.add(userName); frame.add(password); frame.add(ok); frame.add(cancel); frame.setResizable(false); frame.setVisible(true); } public static void main(String[] args) { new CopyOfTest3().initFrame();; } } //怎么把D盘根目录下的 123.jpg添加到这个登录界面的背景
在java图形界面如何设置背景图片?
在java 图形界面中,怎么把一张图片设为窗口的背景,然后可以继续在上面添加其他组件,就是说后面添加的组件不会把那个背景图片给覆盖了?有谁能指教一二,谢谢了。
JAVA如何让背景图片适应窗口的大小变化
小弟学生党,最近要做一个课程设计,我做了一个简易的打地鼠游戏,老师说太简单不给过 让我添加更多的功能,譬如让背景图片随窗口大小的变化而变化,以及如何在原程序中设置控制游戏开始结束的按钮,和 游戏结束后的记数和等级,怎样重新开始等(本来想发点C币的,但是全换成下载积分了,所以麻烦各位高人了。。)
关于在JFrame中设置背景图片问题。
在写JAVA小游戏中新建了一个继承JFrame的类,然后重写了paint方法,在里面绘制了一个空白图像用于双缓冲,之后我想设置JFrame的背景图片,或是在其中添加组件都无法显示,如果在paint方法中加super(g)后,才会显示出来,但窗口会不停的闪烁。请问有什么办法可以解决么?
JFrame中使用JLabel添加背景图片不显示
import javax.swing.ImageIcon; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; public class image { public static void main(String[] args) { JFrame frame = new JFrame("image"); ImageIcon image = new ImageIcon("/img/timg.jpg"); JLabel la3 = new JLabel(image); la3.setBounds(0, 0, frame.getWidth(),frame.getHeight() );//添加图片,设置图片大小为窗口的大小。 frame.getLayeredPane().add(la3,new Integer(Integer.MIN_VALUE)); //将JLable加入到面板容器的最高层 JPanel jp = (JPanel)frame.getContentPane(); jp.setOpaque(false); //设置面板容器为透明 frame.setSize(100, 500); frame.setResizable(true); frame.setVisible(true); } } 如题,求助
java开发中我设置了一个JPanel里面装了图片作为背景 但是为什么没有显示出来背景图片
此段代码中什么地方出错了?为什么我的ip,h还有rs,drgl这三个地方的背景图片 无法显示或者切换? p4=new JPanel(new BorderLayout()); p2=new JPanel(new CardLayout()); //处理p2,p3,p4 p2_lab1=new JLabel(new ImageIcon("image/21.jpg")); p2_lab2=new JLabel(new ImageIcon("image/22.jpg")); //把以上俩加入到P2中 p2.add(p2_lab1,"0"); p2.add(p2_lab2,"1"); this.cardp3=new CardLayout(); p3=new JPanel(this.cardp3); //先给P3加入一个主界面的卡片 Image zhu_image=null; try { zhu_image = ImageIO.read(new File("image/11.jpg")); } catch (Exception e1) { // TODO Auto-generated catch block e1.printStackTrace(); } ImagePanel ip=new ImagePanel(zhu_image); p3.add(ip,"0"); //对P3添加几个JLabel JLabel rs=new JLabel(new ImageIcon("image/renshi.jpg")); p3.add(rs,"1"); JLabel drgl=new JLabel(new ImageIcon("image/dengru.jpg")); p3.add(drgl,"2"); //把p2 p3装入P4中 p4.add(p2,"West"); p4.add(p3,"Center"); //做一个拆分窗口分别存放P1 P4 jsp1=new JSplitPane(JSplitPane.HORIZONTAL_SPLIT,true,p1,p4); //指定左边的面板占多大像素 jsp1.setDividerLocation(120); //把边界线设为没有 jsp1.setDividerSize(0);
jdbc中向MySQL传String类型数据
jdbc中向MySQL传String类型数据,还有jdbc中添加,删除,修改信息的代码,以及然后添加窗口背景图片
java swing组件拖动和显示问题
两个问题(1)做出来的窗体组件运行后点击“添加”按钮,应该再窗体上生成一个JLabel标签,点击后能够生成但显示不出来,改变窗体大小才能显示出来。(2)生成的JLabel能够改变大小和拖动,先拖动到另一个位置,改变窗体大小后,又回到原来的位置去了。求大神知道下。 看了以前的帖子@raistlic说是重绘问题,但是按帖子方法把setVisible放在添加控件后面不起作用。使用getContentPane()invalidate.()总是提示找不到符号。 ``` import java.awt.*; import java.awt.event.*; import static java.awt.BorderLayout.*; import java.awt.event.ActionListener; import javax.swing.*; import javax.swing.SwingUtilities; import javax.swing.plaf.ButtonUI; class Win extends Frame { JButton jb1,jb2,jb3,jb4,jb5;//编辑、添加、修改、删除、调度 JPanel jp_button;//放置按钮的面板 JPanel jp_xianlu;//放置线路图的面板 JTextField jt; //添加 时用的text String str1; Win() { super("我的面板"); setExtendedState( Frame.MAXIMIZED_BOTH ); setLayout(new BorderLayout(30,5)); jp_button =new JPanel(); jp_button.setVisible(true); jp_button.setOpaque(true); jp_button.setBackground(Color.BLUE); add(jp_button,SOUTH); jp_xianlu =new JPanel(); jp_xianlu.setVisible(true); jp_xianlu.setOpaque(true); jp_xianlu.setBackground(Color.GREEN); add(jp_xianlu,CENTER); JTextField jt= new JTextField("我的标签"); jp_button.add(jt); jt.setOpaque(true); jt.setBackground(Color.RED); jb1 = new JButton("编辑"); jb2 = new JButton("添加"); jb3 = new JButton("修改"); jb4 = new JButton("删除"); jb5 = new JButton("调度"); jp_button.add(jb1); jp_button.add(jb2); jp_button.add(jb3); jp_button.add(jb4); jp_button.add(jb5); //Frame上添加windows监听,使之关闭按钮可用 addWindowListener(new WindowAdapter(){ public void windowClosing(WindowEvent e){ System.exit(0); } }); //点击“添加”按钮时在jp_xianlu面板上生成JLabel jb2.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { str1 = jt.getText(); setLab(str1,100,100); } }); } public void setLab(String str,int a,int b){ try { // BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); if(str==null) { System.out.println("输入不能不能为空"); } else { JLabel lab= new JLabel(str); //输入标签显示内容 lab.setOpaque(true); //label 是透明的 lab.setBackground(Color.RED); //设置背景色 lab.setBounds(a,b,80,80); //给生成的JLabel添加监听,使之可以自由改变大小并可以拖动 DnDAdapter dda =new DnDAdapter(); lab.addMouseMotionListener(dda); jp_xianlu.add(lab); } } catch(Exception e){ System.out.println(e.getMessage()); } } public static void main(String args[]) { SwingUtilities.invokeLater(new Runnable() { @Override public void run() { Win win=new Win(); //win.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); win.setLocationRelativeTo(null); win.setVisible(true); } }); } } //自定义的可以自由实现组件拖动的监听器(摘自网络,还未完全理解) class DnDAdapter extends MouseAdapter { //每个组件的信息,在进入组件时获得。 private JComponent jcom; private Point jcomOriginPoint;//组件在容器内的坐标 private int jcomWidth,jcomHeight; //与定位、缩放相关信息 private int a=10;//鼠标检测边沿大小 private Point pointMoved;//移动时,容器内坐标 private CurType curCuror;// private enum CurType {LeftTop,LeftBottom,RightTop,RightBottom,Top,Bottom,Left,Right,Center} //光标区域判断 private CurType getCurType(MouseEvent e) { Point p=e.getPoint();//getPoint返回组件内的坐标 //左上角 0<x<a,0<y<a if((p.x>=0 && p.x<=a)&&(p.y>=0&&p.y<=a)) return CurType.LeftTop; //右下角 w-a<x<w h-a<y<h else if((p.x>=jcomWidth-a&&p.x<=jcomWidth)&&(p.y>=jcomHeight-a&&p.y<=jcomHeight)) return CurType.RightBottom; //右上角w-a<x<w,0<y<a else if((p.x>=jcomWidth-a&&p.x<=jcomWidth)&&(p.y>=0&&p.y<=a)) return CurType.RightTop; //左下角0<x<a,h-a<y<h else if((p.x>=0&&p.x<=a)&&(p.y>=jcomHeight-a&&p.y<=jcomHeight)) return CurType.LeftBottom; //垂直:w-a<x<w && a<y<h-a 右边 else if( p.x>=jcomWidth-a && p.x<=jcomWidth && p.y>=a && p.y<=jcomHeight-a) return CurType.Right; //垂直:0<x<a,a<y<h-a 左边 else if(p.x>=0 && p.x<=a && p.y>=a && p.y<=jcomHeight-a) return CurType.Left; //水平 a<x<w-a && 0<y<a 上边 else if((p.x>=a&&p.x<=jcomWidth-a) &&p.y>=0&&p.y<=a) return CurType.Top; //水平 a<x<w-a &&h-a<y<h 下边 else if((p.x>=a&&p.x<=jcomWidth-a) &&p.y>=jcomHeight-a&&p.y<=jcomHeight) return CurType.Bottom; //中间 else //jcom.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));//没有这句鼠标会一直保持形状 return CurType.Center; } private void setCurType(MouseEvent e) { switch(getCurType(e)) { case LeftTop: jcom.setCursor(Cursor.getPredefinedCursor(Cursor.NW_RESIZE_CURSOR)); curCuror=CurType.LeftTop; break; case LeftBottom: jcom.setCursor(Cursor.getPredefinedCursor(Cursor.SW_RESIZE_CURSOR)); curCuror=CurType.LeftBottom; break; case RightTop: jcom.setCursor(Cursor.getPredefinedCursor(Cursor.NE_RESIZE_CURSOR)); curCuror=CurType.RightTop; break; case RightBottom: jcom.setCursor(Cursor.getPredefinedCursor(Cursor.SE_RESIZE_CURSOR)); curCuror=CurType.RightBottom; break; case Top: jcom.setCursor(Cursor.getPredefinedCursor(Cursor.N_RESIZE_CURSOR)); curCuror=CurType.Top; break; case Bottom: jcom.setCursor(Cursor.getPredefinedCursor(Cursor.N_RESIZE_CURSOR)); curCuror=CurType.Bottom; break; case Left: jcom.setCursor(Cursor.getPredefinedCursor(Cursor.E_RESIZE_CURSOR)); curCuror=CurType.Left; break; case Right: jcom.setCursor(Cursor.getPredefinedCursor(Cursor.E_RESIZE_CURSOR)); curCuror=CurType.Right; break; default: jcom.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); curCuror=CurType.Center; break; } } private void setPosition(MouseEvent e) { Point pointNow=e.getLocationOnScreen(); int incX=pointNow.x-pointMoved.x;//增量是相对于最后一次移动的点。 int incY=pointNow.y-pointMoved.y; /// //System.out.print("PointNow:("+pointNow.x+","+pointNow.y+")\t"); //System.out.println("PointMoved:("+pointMoved.x+","+pointMoved.y+")\t"); Rectangle rect=new Rectangle(); switch(curCuror) { case LeftTop: rect.x=jcomOriginPoint.x+incX; rect.y=jcomOriginPoint.y+incY; rect.width=jcomWidth-incX; rect.height=jcomHeight-incY; break; case LeftBottom: rect.x=jcomOriginPoint.x+incX; rect.y=jcomOriginPoint.y; rect.width=jcomWidth-incX; rect.height=jcomHeight+incY; break; case RightTop: rect.x=jcomOriginPoint.x; rect.y=jcomOriginPoint.y+incY; rect.width=jcomWidth+incX; rect.height=jcomHeight-incY; break; case RightBottom: rect.x=jcomOriginPoint.x; rect.y=jcomOriginPoint.y; rect.width=jcomWidth+incX; rect.height=jcomHeight+incY; break; //////////////////////////////////////////// case Top: rect.x=jcomOriginPoint.x; rect.y=jcomOriginPoint.y+incY; rect.width=jcomWidth; rect.height=jcomHeight-incY; break; case Bottom: rect.x=jcomOriginPoint.x; rect.y=jcomOriginPoint.y; rect.width=jcomWidth; rect.height=jcomHeight+incY; break; case Left: rect.x=jcomOriginPoint.x+incX; rect.y=jcomOriginPoint.y; rect.width=jcomWidth-incX; rect.height=jcomHeight; break; case Right://右缩放 rect.x=jcomOriginPoint.x; rect.y=jcomOriginPoint.y; rect.width=jcomWidth+incX; rect.height=jcom.getHeight(); break; /////////////////////////////////////////////// case Center://移动 rect.x=jcomOriginPoint.x+incX; rect.y=jcomOriginPoint.y+incY; rect.width=jcom.getWidth();//防止出现恢复原大小问题。 rect.height=jcom.getHeight(); break; default: break; } jcom.setBounds(rect); } @Override public void mouseMoved(MouseEvent e) { pointMoved=e.getLocationOnScreen(); jcom=(JComponent)e.getSource();//防止抖动关键在这一点 jcomOriginPoint=jcom.getLocation();//获取组件在父窗口的位置 jcomWidth=jcom.getWidth(); jcomHeight=jcom.getHeight(); /////////////////////////////////////////// setCurType(e); //super.mouseMoved(e); } public void mouseDragged(MouseEvent e) { //相对于移动最后一点的增量 setPosition(e); super.mouseDragged(e); } } ```
如何将java的JScrollPane容器中的行设置为透明,求大神帮助
,我输入了JSP.setOpaque(false);JSP.getViewport().setOpaque(false);但是容器中的每一行还是不透明 JScrollPane JSP; JTable table; Object[][] tableData; Object[] tableTitle = {"编号", "名称", "管理员", "数量","时间" }; String keyWord = ""; Font font = new Font("字体", Font.BOLD, 20); DB db = new DB(); public InputFrame() { setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); ImageIcon img = new ImageIcon("C:\\Users\\95738\\Pictures\\Saved Pictures\\黑寡妇.jpg"); //这是背景图片 JLabel imgLabel = new JLabel(img); //将背景图放在标签里。 getLayeredPane().add(imgLabel, new Integer(Integer.MIN_VALUE)); //注意这里是关键,将背景标签添加到jfram的LayeredPane面板里。 imgLabel.setBounds(0,0,img.getIconWidth(), img.getIconHeight()); //设置背景标签的 Container cp=getContentPane(); cp.setLayout(new BorderLayout()); ((JComponent) cp).setOpaque(false); //注意这里,将内容面板设为透明。这样LayeredPane面板中的背景才能显示出来。 setSize(800,600); setSize(800, 600); // 设置标题 setTitle("入库记录"); // 设置窗口的初始位置 setLocationRelativeTo(null); // 窗口大小固定不变 setResizable(false); //设置关闭窗口应用程序结束 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // 把默认的布局方式去掉 setLayout(null); JButton btnHP = new JButton("主页"); btnHP.setFont(font); btnHP.setBounds(680, 460, 80, 40); btnHP.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { // TODO Auto-generated method stub MainFrame mf = new MainFrame(keyWord); } }); getData(keyWord); add(btnHP); setVisible(true); } public void getData(String keyWord) { //remove(JSP); tableData = db.queryInput(); // 创建表格数据 table = new JTable(tableData, tableTitle); table.setFont(font); // table.setBounds(10,150,780,450); table.setRowHeight(30); // 创建一个新的滚动的容器 JSP = new JScrollPane(table); JSP.setOpaque(false); JSP.getViewport().setOpaque(false); JSP.setBounds(20, 100, 760, 350); add(JSP); } ![图片说明](https://img-ask.csdn.net/upload/201904/19/1555666656_821978.png)
JAVA布局中的控件问题
设置FlowLayout布局后,添加了若干个组件,但只有第一个显示出来,不设置布局也是只显示第一个,而且设置的窗口背景色也没效果,为什么? 代码如下: public class WindowUI extends JFrame { JLabel biaoqian1,biaoqian2,biaoqian3; JTextField textinput,textout; JComboBox combox; JButton button; public WindowUI (){ setBackground(Color.white); setBounds(500,100,800,800); setVisible(true); setDefaultCloseOperation(EXIT_ON_CLOSE); init(); } private void init(){ this.setLayout(new FlowLayout()); biaoqian1=new JLabel("工资/提成:"); add(biaoqian1); textinput=new JTextField(9); add(textinput); biaoqian2=new JLabel("员工类型:"); add(biaoqian2); combox=new JComboBox(); combox.addItem("月职工"); combox.addItem("件职工"); combox.addItem("提成职工"); add(combox); biaoqian3=new JLabel("合计工资:"); add(biaoqian3); textout=new JTextField(9); add(textout); button=new JButton("确定"); add(button); } } ``` ```
java swing 一个窗口打开新创口 加上go()程序就死掉了
import javax.swing.*; import java.awt.Rectangle; import java.awt.event.*; public class Swing7 extends JFrame implements ActionListener { JButton jb = new JButton(); public Swing7() { this.setTitle("Java——"); jb.setText("确定"); jb.setMnemonic('a'); this.add(jb); this.setBounds(200, 300, 250, 300); this.setVisible(true); jb.addActionListener(this); //由于Swing7实现了ActionListener接口,所以给jb添加的ActionListener就是Swing7实例。 } public void actionPerformed(ActionEvent e) {// 实现ActionListener接口的actionPerformed接口。 yidengjiang frame=new yidengjiang(); frame.setVisible(true); } public static void main(String args[]) { Swing7 s = new Swing7(); } } import java.awt.*; import java.awt.event.*; import java.util.Random; import javax.swing.*; public class yidengjiang extends JFrame implements ActionListener { /** * */ private static final long serialVersionUID = -8560277451929244119L; JTextField tf = new JTextField(); JButton b1 = new JButton("开始"); JButton b2 = new JButton("停止"); boolean isGo = false; String path = "223.jpg"; ImageIcon background = new ImageIcon(path); JTextArea jiang1= new JTextArea(); int choujiangcishu=1; public yidengjiang() { this.getContentPane().setLayout(null); Dimension srcDim = Toolkit.getDefaultToolkit().getScreenSize(); System.out.println(srcDim.width+" "+srcDim.height); this.setExtendedState(JFrame.MAXIMIZED_BOTH); this.getContentPane().add(tf); this.getContentPane().add(b1); ImageIcon background = new ImageIcon(path);// 背景图片 JLabel jlbg = new JLabel(background);// 把背景图片显示在一个标签里面 jlbg.setBounds(0, 0, srcDim.width, srcDim.height);// 把标签的大小位置设置为图片刚好填充整个面板 JPanel imagePanel = (JPanel) this.getContentPane(); imagePanel.setOpaque(false); this.getLayeredPane().add(jlbg, new Integer(Integer.MIN_VALUE)); tf.setFont(new Font("Courier", Font.PLAIN, 110)); tf.setHorizontalAlignment(JLabel.CENTER); tf.setOpaque(false); //tf.setBackground(Color.red);// 按钮红色背景 tf.setEditable(false);//不可编辑 tf.setBorder(BorderFactory.createEmptyBorder());//无边框 tf.setBounds(srcDim.width/2-srcDim.width/3/2, srcDim.height/2+srcDim.height/10/2, srcDim.width/3, srcDim.height/10); b1.setBounds(0,0,0,0); b2.setBounds(0,0,0,0); jiang1.setBounds(srcDim.width/30, srcDim.height/20,800,800); jiang1.setOpaque(false); jiang1.setFont(new Font("Courier",Font.PLAIN,22)); jiang1.setEditable(false); this.getContentPane().add(tf); this.getContentPane().add(b1); this.getContentPane().add(b2); this.getContentPane().add(jiang1); b1.setActionCommand("start"); b1.addActionListener(this); b2.addActionListener(this); SymListener sy = new SymListener(); b1.registerKeyboardAction(sy,KeyStroke.getKeyStroke(KeyEvent.VK_SPACE, 0), JComponent.WHEN_IN_FOCUSED_WINDOW); b2.registerKeyboardAction(sy,KeyStroke.getKeyStroke(KeyEvent.VK_SPACE, 0), JComponent.WHEN_IN_FOCUSED_WINDOW); //jButton.setMnemonic(KeyEvent.VK_ENTER); b2.setEnabled(false); super.setUndecorated(true);// 无标题栏 this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.setLocation(0, 0); Cursor cu = new Cursor(Cursor.HAND_CURSOR); this.setCursor(cu); this.setVisible(true); tf.setText("888888"); go(); } public void go() { while (true) { if (isGo == true) { String s = ""; Random rand = new Random(); for (int j = 1; j <= 1; j++) { int i = (int) (Math.random()*260000+1);//设定奖项总数 if (i < 10) { s = s + "00000" + i; } else if(i<100 & i>=10) { s = s + "0000" + i; }else if(i<1000 & i>=100) { s = s + "000" + i; }else if(i<10000 & i>=1000) { s = s + "00" + i; }else if(i<100000 & i>=10000) { s = s + "0" + i; }else { s = s + i; } } tf.setText(s); } try { Thread.sleep(10); } catch (java.lang.InterruptedException e) { e.printStackTrace(); } } } public void actionPerformed(ActionEvent e) { String s = e.getActionCommand(); if (s.equals("start")) { isGo = true; b1.setEnabled(false); b2.setEnabled(true); } else { isGo = false; jiang1.setText(jiang1.getText()+"\n"+tf.getText()); b2.setEnabled(false); b1.setEnabled(true); } } /*public static void main(String[] args) { Dimension srcDim = Toolkit.getDefaultToolkit().getScreenSize(); ImgUtil image =new ImgUtil(); image.createThumb("3.png", "223.jpg",(int)srcDim.getWidth(), (int)srcDim.getHeight()); new yidengjiang(); } */ class SymListener implements ActionListener { public void actionPerformed(ActionEvent e) { Object obj = e.getSource(); if (obj == b1) { isGo = true; b1.setEnabled(false); b2.setEnabled(true); } else if (obj == b2) { isGo = false; operdata aaa =new operdata(); String bb= aaa.getuserdata(tf.getText()); jiang1.setText(jiang1.getText()+"\n"+""+(choujiangcishu++)+": "+tf.getText()+bb); b2.setEnabled(false); b1.setEnabled(true); } } } }
java如何停止当前正在运行的线程,新手求解答
最近想做一个无线数据监控服务端,用java做的,面板Jframe设置了一个Jpanel,我称这个为Jpanel 1 ,在Jpanel 1中我定义了一个多选JCheckbox,有四种监控方式可选:Bluetooth,Wifi,GPRS,Zigbee。还定义了一个JButton,分为开始ON,结束OFF,然后在JPanel 1中定义了JPanel 2,JPanel 2 中我定义了JScrollPane,scrollAndSetCursor用于实现滚动以及光标相关效果,程序运行的大致过程是这样的,我先选择监控方法,(方法是多选的,我想能够同步实现这几个方法),然后点击ON按钮就开始运行服务器程序了, **重点来了** , **我现在的问题是** ,停止按钮OFF不知道怎么设置方法能够让程序停止当前的线程,我想实现的是点击OFF后,当前的监控方式运行全部停止,(就跟刚开始巡行这个程序一样,可以重新开始选择监控方式,在重新点击ON又可以重新运行),现在就是不知道怎么在jbArray[1](ON按钮的监控事件)中定义,感觉自己写的jbArray[0](ON按钮)也有问题。(我其实是想实现这四种方法可以同步运行,互不干扰,多线程运行)希望各位哥哥姐姐帮帮忙,帮我改一改jbArray[0](按钮的监听事件)以及实现jbArray[1](OFF结束当前监控方式线程事件),谢谢各位了,代码稍微有点长,我全贴上来了,辛苦各位了 package SystemTray; import java.awt.AWTException; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Menu; import java.awt.MenuItem; import java.awt.PopupMenu; import java.awt.Rectangle; import java.awt.SystemTray; import java.awt.Toolkit; import java.awt.TrayIcon; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.URL; import java.util.Timer; import java.util.TimerTask; import javax.microedition.io.StreamConnection; import javax.swing.BorderFactory; import javax.swing.ButtonGroup; import javax.swing.ImageIcon; import javax.swing.JButton; import javax.swing.JCheckBox; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JMenu; import javax.swing.JMenuBar; import javax.swing.JMenuItem; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JRadioButton; import javax.swing.JScrollPane; import javax.swing.JTextArea; import BluetoothChatServer.*; import GPRSChatServer.*; import WifiChatServer.*; import ZigbeeChatServer.*; public class SystemTrayDemo extends JFrame { protected JTextArea ta = new JTextArea(20,42); protected Timer timer = new Timer(); protected boolean jbarry = false; protected TrayIcon trayIcon = null; protected SystemTrayDemo(){ this.setTitle("Data monitoring server"); TrayInit(); WinInit(); //取得当前屏幕的宽度和高度 int width=Toolkit.getDefaultToolkit().getScreenSize().width; int height=Toolkit.getDefaultToolkit().getScreenSize().height; //设置窗体大小 this.setSize(610, 470); //设置窗体初始显示的位置 this.setLocation((width-610)/2, (height-470)/2); this.setResizable(false);//设置窗体不可调整大小 //this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//设置窗体关闭方式,关闭窗体时同时结束程序 final JPanel jp1 = new JPanel(); jp1.setLayout(null);//不设置的话是无法设置jp2的大小。等同于窗口的大小。 JPanel jp2=new JPanel(); jp2.setBounds(110,20,480,390); //jp2.setBounds(new Rectangle(110,15,450,350));//设置jp2的左边距、上边距、长度、高度,在jp1没设置setLayout(null);是无效的 //jp2.setBackground(Color.gray);//设置框体的背景色 //jp2.setBorder(BorderFactory.createEtchedBorder(Color.black, Color.BLUE)); //设置框体的边框 final JScrollPane jsp = new JScrollPane(ta); jp2.add(jsp,BorderLayout.CENTER); jp1.add(jp2); /*ta.setText("Start.....\n"); TimerTask task = new TimerTask(){ public void run(){ ta.append("Time: " + (System.currentTimeMillis() / 1000) + "\n"); scrollAndSetCursor(); } }; time.schedule(task, 0, 1000);*/ //super(); //enableEvents(AWTEvent.WINDOW_EVENT_MASK); //创建标签数组 JLabel[] jlArray = {new JLabel("Switch"),new JLabel("Mode")}; //创建复选框数组 final JCheckBox[] jcbArray = {new JCheckBox("Bluetooth",true),new JCheckBox("Wifi"),new JCheckBox("GPRS"), new JCheckBox("Zigbee")}; //创建按钮数组 final JButton[] jbArray = {new JButton("ON"),new JButton("OFF")}; //设置布局管理器 for(int i=0;i<4;i++){ //设置复选按钮的大小位置 jcbArray[i].setBounds(10,185+i*30,80,30); //将复选按钮添加到JPanel中 jp1.add(jcbArray[i]); //设置标签与普通按钮的大小位置 if(i>1){ continue; } //continue后的语句不在执行。。 jlArray[i].setBounds(30,20+i*140,80,30); jbArray[i].setBounds(10,50+i*45,80,30); //将标签与普通按钮添加到JPanel中 jp1.add(jlArray[i]); jp1.add(jbArray[i]); } this.add(jp1); //为普通按钮注册动作事件监听器。 //开始按钮 **感觉这地方有问题,如何修改?????** jbArray[0].addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e) { jbArray[0].setEnabled(jbarry); int result= JOptionPane.showConfirmDialog(null,"Start monitoring program now?","Message",JOptionPane.YES_NO_OPTION); if(result==0){ //是 StringBuffer temp0 = new StringBuffer(); for(int i = 0;i<4;i++){ if(jcbArray[i].isSelected()){ String tmpstr; tmpstr = jcbArray[i].getText()+" monitoring method "; ta.append(tmpstr + "\n"); temp0.append(tmpstr); } } if(temp0.length()==0){ JOptionPane.showMessageDialog(null,"The monitoring method can't be empty!","Message",JOptionPane.WARNING_MESSAGE); jbArray[0].setEnabled(!jbarry); } //蓝牙线程 Thread Bluetooth = new Thread(){ public void run() { if(jcbArray[0].isSelected()){ new BluetoothRemoteServer(); } } }; //Bluetooth.setName("Bluetooth"); //String name0 = Bluetooth.getName(); //ta.append(name0+" start\n"); Bluetooth.start(); //Wifi线程 Thread Wifi = new Thread(){ public void run() { if(jcbArray[1].isSelected()){ new WifiRemoteServer(); } } }; //Wifi.setName("Wifi"); // String name1 = Wifi.getName(); // ta.append(name1+" start\n"); Wifi.start(); //GPRS线程 Thread GPRS = new Thread(){ public void run() { if(jcbArray[2].isSelected()){ new GPRSRemoteServer(); } } }; //GPRS.setName("GPRS"); //String name2 = GPRS.getName(); //ta.append(name2+" start\n"); GPRS.start(); //Zigbee线程 Thread Zigbee = new Thread(){ public void run() { if(jcbArray[3].isSelected()){ new ZigbeeRemoteServer(); } } }; //Zigbee.setName("Zigbee"); //String name3 = Zigbee.getName(); //ta.append(name3+" start\n"); Zigbee.start(); } if(result==1){ //否 jbArray[0].setEnabled(!jbarry); } } }); //结束按钮 **如何实现点击jbArray[1]后能够停止前面jbArray[0]中选择的监控方式的线程?????** jbArray[1].addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { int result= JOptionPane.showConfirmDialog(null,"End monitoring program now?","Message",JOptionPane.YES_NO_OPTION); if(result==0){ //是 for(int i=0; i<jcbArray.length; i++){ jcbArray[i].setSelected(false); } ta.setText(null); //后续功能完善 jbArray[0].setEnabled(!jbarry); } if(result==1){ //否 } } }); } //托盘的功能选项设置 public void TrayInit(){ if(SystemTray.isSupported()){ //检查当前系统是否支持系统托盘 SystemTray tray = SystemTray.getSystemTray();//获取表示桌面托盘区的 SystemTray 实例。 URL imageUrl=SystemTrayDemo.class.getResource("java.png"); ImageIcon icon = new ImageIcon(imageUrl); //Image image = Toolkit.getDefaultToolkit().getImage("D:\\kissjava.gif"); PopupMenu popupMenu = new PopupMenu(); //为托盘添加右键菜单 MenuItem exitItem = new MenuItem("Exit"); //退出exitItem按钮 exitItem.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e){ try{ System.exit(0); }catch(Exception ex) { ex.printStackTrace(); } } }); popupMenu.add(exitItem); //创建带指定图像、工具提示和弹出菜单的 TrayIcon trayIcon = new TrayIcon(icon.getImage(), "System is running", popupMenu); trayIcon.addMouseListener(new java.awt.event.MouseAdapter(){ @Override public void mouseClicked(MouseEvent e) { if(e.getClickCount()==2){ showIT(true); } } }); try{ tray.add(trayIcon); // 将 TrayIcon 添加到 SystemTray。 } catch (AWTException e) { System.err.println(e); } }else{ JOptionPane.showMessageDialog(null,"The operating system does not support tray","Message",JOptionPane.ERROR_MESSAGE); } } //窗体的菜单功能选项设置 public void WinInit(){ JMenuBar menubar = new JMenuBar();//为窗体添加菜单功能 setJMenuBar(menubar); //开关option选项 /*前端添加小图标 * JMenu option = new JMenu("开关"); * Icon startIcon = new ImageIcon("image/bluetooth.png"); JMenuItem start = new JMenuItem("开始",startIcon); */ //设置setting选项 JMenu setting = new JMenu("Setting"); JMenu language = new JMenu("Language"); setting.add(language); JMenuItem language1 = new JMenuItem("中文"); language.add(language1); JMenuItem language2 = new JMenuItem("English"); language.addSeparator(); language.add(language2); JMenu update = new JMenu("Update"); setting.addSeparator(); setting.add(update); JMenuItem update1 = new JMenuItem("Version update"); update.add(update1); update1.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { JOptionPane.showMessageDialog(null,"please send the mail to zhouwenquan2012552061@Gmail.com","Message",JOptionPane.PLAIN_MESSAGE); } }); //关于help选项 JMenu help = new JMenu("Help"); JMenuItem about = new JMenuItem("About"); help.add(about); //后续功能完善 about.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { JOptionPane.showMessageDialog(null," Copyright @2013 popcorn\n All Right Reserved\n author popcorn\n version 1.0","Message",JOptionPane.PLAIN_MESSAGE); } }); menubar.add(setting); menubar.add(help); } /** 该方法用于实现滚动以及光标相关效果 */ public void scrollAndSetCursor(){ // ta.requestFocus(); ta.setSelectionStart(ta.getText().length()); } public void showIT(boolean visable){ if(this.isVisible() != visable) this.setVisible(visable); } public static void main(String[] args) { javax.swing.SwingUtilities.invokeLater(new Runnable(){ public void run(){ new SystemTrayDemo().setVisible(true);//设置窗体显示 } }); } }
JFrame的JButton点击事件无法正确显示另外的界面
网上找了个程序,自己改,是一个小游戏,本来只有一个游戏界面,我想添加一个登录页面,结果就刚加了个界面就卡住了。从Fishlord类中使用main()函数可以正确显示,但是通过另外一个JFrame通过JButton点击事件调用Fishlord时无法显示,而且连右上角的关闭按钮都不能点击! 代码在下面: 这个界面有按钮,点击按钮跳转到下面那个iframe,在JButton点击事件里使用new的方法 package fishhh; import java.awt.Color; import java.awt.Container; import java.awt.Font; import java.awt.Graphics; import java.awt.Rectangle; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.ImageIcon; import javax.swing.JButton; import javax.swing.JCheckBox; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JPasswordField; import javax.swing.JTextField; public class Login { private static JFrame frame; public static void main(String[] args) throws Exception { // 窗体大小 frame = new JFrame(); frame.setSize(800, 480); frame.setLayout(null);//设置布局管理器为空 JButton button = new JButton("登 录"); button.setBounds(new Rectangle(280, 210, 220, 30));//参数分别是坐标x,y,宽,高 frame.add(button); JTextField tfUser = new JTextField(); tfUser.setBounds(new Rectangle(280, 140, 220, 25)); frame.add(tfUser); JPasswordField tfPwd = new JPasswordField(); tfPwd.setBounds(new Rectangle(280, 170, 220, 25)); frame.add(tfPwd); // 显示窗体 frame.setVisible(true); ImageIcon img = new ImageIcon("bg.jpg");// 这是背景图片 JLabel imgLabel = new JLabel(img);// 将背景图放在标签里。 frame.getLayeredPane().add(imgLabel, new Integer(Integer.MIN_VALUE)); imgLabel.setBounds(0, 0, frame.getWidth(), frame.getHeight()); Container cp = frame.getContentPane(); cp.setLayout(null); ((JPanel) cp).setOpaque(false); // 这样就能显示出背景图片出来了 button.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { //创建新的窗口 frame.setVisible(false); try { new Fishlord(); } catch (Exception e1) { e1.printStackTrace(); } } }); } public void close(){ frame.dispose(); } } 跳转到这个界面 package fishhh; import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import java.util.Random; import javax.imageio.ImageIO; import javax.swing.JFrame; import javax.swing.JPanel; public class Fishlord { public static void main(String[] args) throws Exception { new Fishlord(); } public Fishlord() throws Exception{ JFrame frame = new JFrame("捕鱼达人"); Pool pool = new Pool(); frame.add(pool); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);// 关闭窗口时关闭程序 frame.setSize(800, 480); frame.setLocationRelativeTo(null);// 设置窗口居中,必须放在setSize之后 frame.setResizable(false);// 不允许用户改变窗口大小 frame.setVisible(true); pool.action(); } } class Pool extends JPanel { BufferedImage background = null; Fish fish = null;; Fish[] fishs = new Fish[9]; Net net = null; int score = 0; int fontsize = 20; Font font = new Font("楷体", Font.BOLD, fontsize); Pool() throws IOException { // background = ImageIO.read(new File("bg.jpg")); //读取工程目录图片 background = ImageIO.read(getClass().getResourceAsStream("/images/bg.jpg")); /** * 1)getClass().getResourceAsStream()方法读取的是src/images包下的图片 2)background * = ImageIO.read(new File("images/bg.jpg")); * 这个方法读取的是工程CatchFish/images文件夹下的图片 */ for (int i = 0; i < 9; i++) { fish = new Fish("fish0" + (i + 1)); fishs[i] = fish; fish.start(); } } public void paint(Graphics g) { // paint什么时候调用? // System.out.println("paint"); g.drawImage(background, 0, 0, null); for (int i = 0; i < fishs.length; i++) { Fish tempfish = fishs[i]; g.drawImage(tempfish.fishimage, tempfish.x, tempfish.y, null); } if (net.show) { g.drawImage(net.netimage, net.x - net.width / 2, net.y - net.height / 2, null); } g.setFont(font); g.setColor(Color.white); g.drawString("SCORE:", 10, 20); g.setColor(Color.red); g.drawString(" " + score, 10, 20); } public void action() throws Exception { net = new Net(); MouseAdapter m = new MouseAdapter() { public void mouseEntered(MouseEvent e) { net.show = true; } public void mouseExited(MouseEvent e) { net.show = false; } // 在鼠标移动时候执行 public void mouseMoved(MouseEvent e) { // MouseEvent 鼠标事件:鼠标事件发生时间地点人物 long time = e.getWhen(); int x = e.getX(); int y = e.getY(); // Object o=e.getSource();//发生事件的物体pool net.x = x; net.y = y; } public void mousePressed(MouseEvent e) { catchFish();// catch:抓鱼 在鼠标按下的时候,进行抓鱼操作 } }; // 在当前方法中代表当前的 这个(this)pool对象 this.addMouseListener(m); // 处理这个pool对象鼠标动作 this.addMouseMotionListener(m); net.show = true;// 调试代码 while (true) { // System.out.println("repaint"); repaint(); try { Thread.sleep(80); } catch (Exception e) { e.printStackTrace(); } } } protected void catchFish() { // 鱼在不在网的范围内?在的话就让鱼消失 for (int i = 0; i < fishs.length; i++) { fish = fishs[i]; if (fish.contains(net.x, net.y)) {// 判断在不在网的范围 fish.getOut(); score += fish.width / 10; } } } } class Fish extends Thread { int x, y, index = 0, width, height, step; BufferedImage fishimage; BufferedImage[] fishimages = new BufferedImage[9]; Random r; Fish(String fishname) throws IOException { // System.out.println("Fish()"); for (int i = 0; i < 9; i++) { // BufferedImage tempfishimage = ImageIO.read(new File(fishname + // "_0" // + (i + 1) + ".png")); BufferedImage tempfishimage = ImageIO.read(getClass() .getResourceAsStream( "/images/" + fishname + "_0" + (i + 1) + ".png")); fishimages[i] = tempfishimage; } fishimage = fishimages[index]; r = new Random();// 不写数字表示的是int范围内的一个数字 width = fishimage.getWidth(); height = fishimage.getHeight(); x = 790; y = r.nextInt(470 - height); step = r.nextInt(4) + 1; } public void run() { while (true) { try { Thread.sleep(50); index++; fishimage = fishimages[index % fishimages.length]; // 现在要动,所以要改变图片?300 x = x - step; if (x <= 0 || y <= 0 || y >= 480) getOut(); } catch (Exception e) { } } } // 检查(netx,nety)的坐标是否在鱼的范围之内 public boolean contains(int netx, int nety) { int dx = netx - x; int dy = nety - y; return dx >= 0 && dx <= width && dy >= 0 && dy <= height; } void getOut() { Random r = new Random(); x = 790; y = r.nextInt(470 - height); step = r.nextInt(4) + 1; } } class Net { // 网的位置随着鼠标指针的移动而移动 BufferedImage netimage = null; int x = 0, y = 0, width, height; boolean show;// 是否显示当前网对象 Net() throws Exception { // netimage = ImageIO.read(new File("net09.png")); netimage = ImageIO.read(getClass().getResourceAsStream( "/images/net09.png")); show = false; width = netimage.getWidth(); height = netimage.getHeight(); } }
刚学的java,写了个压缩文件的小程序,一直没有成功
public class f2Test { public static void main(String[] args){ frame02 f2=new frame02(); } } import java.awt.BorderLayout; import java.awt.Color; import java.awt.Image; import java.awt.Menu; import java.awt.MenuBar; import java.awt.MenuItem; import java.awt.event.*; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.net.URL; import java.util.List; import java.util.Scanner; import java.util.zip.ZipEntry; import java.util.zip.ZipInputStream; import javax.swing.JComboBox; import javax.swing.JFileChooser; import javax.swing.JFrame; import javax.swing.JScrollPane; import javax.swing.JTextArea; import javax.swing.SwingWorker; public class frame02 extends JFrame{ private static final long serialVersionUID = 1L; private int width=800; private int height=600; private int screen_width; private int screen_height; private JFrame f; private MenuBar mb; private Menu mfile; private MenuItem iopen; private MenuItem iExit; private String zipname; private JComboBox fCombo; private JTextArea fText; public frame02(){ f=new JFrame("压缩文件"); //窗口名称 mb=new MenuBar(); //菜单栏 mfile=new Menu("文件"); //菜单 iopen=new MenuItem("打开"); //菜单项 iExit=new MenuItem("退出"); fCombo=new JComboBox(); f.setVisible(true); //可见性 f.setSize(width,height); //尺寸 f.setBackground(Color.darkGray); //背景颜色 f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //窗口关闭设置 screen_width=(int)f.getToolkit().getScreenSize().getWidth(); //获得当前屏幕宽度 screen_height=(int)f.getToolkit().getScreenSize().getHeight(); //获得当前屏幕高度 f.setLocation((screen_width-width)/2,((screen_height-height)/2)); //将窗口设在屏幕中间 URL url=getClass().getResource("zip.jpg.jpg"); //图标路径 Image img=f.getToolkit().getImage(url); //图片对象 f.setIconImage(img); //设置图标 f.setMenuBar(mb); //设置菜单栏 mb.add(mfile); //设置菜单 mfile.add(iopen); //添加菜单项 打开 iopen.addActionListener(new ActionListener(){ //添加 打开 选项的时间监听器 public void actionPerformed(ActionEvent event){ JFileChooser fch=new JFileChooser(); //文件选择对象 fch.setCurrentDirectory(new File(".")); //以当前目录生成一个文件目录实例,然后设置为当前目录 int r=fch.showOpenDialog(frame02.this); //打开选择文件对话框 if(r==JFileChooser.APPROVE_OPTION){ zipname=fch.getSelectedFile().getPath(); fCombo.removeAllItems(); scanZipfile( ); } } }); mfile.addSeparator(); //添加分隔符 mfile.add(iExit); //添加菜单项 退出 iExit.addActionListener(new ActionListener(){ //添加 退出 选项的事件监听器 public void actionPerformed(ActionEvent event){ System.exit(0); } }); fCombo.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent event){ loadZipFile((String)fCombo.getSelectedItem()); } }); add(fCombo,BorderLayout.SOUTH); add(new JScrollPane(fText),BorderLayout.CENTER); } public void scanZipfile( ){ //文件浏览程序 new SwingWorker<Void,String>(){ protected Void doInBackground()throws Exception{ //实现抽象方法 ZipInputStream zin=new ZipInputStream(new FileInputStream(zipname)); ZipEntry entry; while((entry=zin.getNextEntry())!=null){ publish(entry.getName()); //将压缩文件的内容登载到List zin.closeEntry(); } zin.close(); return null; } protected void process(List<String>names) { //将List entry名数组加到下拉列表中 for(String name:names)fCombo.addItem(name); } }.execute(); //执行该工作线程 } private void loadZipFile(final String name){ fCombo.setEnabled(false); fText.setText(""); new SwingWorker<Void,Void>(){ protected Void doInBackground()throws Exception{ try{ ZipInputStream zin=new ZipInputStream(new FileInputStream(zipname)); ZipEntry entry; while((entry=zin.getNextEntry())!=null) { if(entry.getName().equals(name)){ Scanner in=new Scanner(zin); while(in.hasNextLine()){ fText.append(in.nextLine()); fText.append("\n"); } } zin.closeEntry(); } zin.close(); } catch(IOException e) { e.printStackTrace(); } return null; } protected void done(){ fCombo.setEnabled(true); } }.execute(); } }
构造的方法在main外无法执行如何解决
我是java初学者 我想在button的响应中,登录成功后跳转到birdgame的页面,但是panel中的action方法只能在main方法中执行才有效,在button响应的方法里new birdframe时action不能正常执行,点击界面没反应,请问应该如何修改这个代码 出问题的代码如下 login页面 import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.*; public class Login extends JFrame implements ActionListener{ String username="a"; String password="a"; BirdPanel panel; JFrame loginframe; JLabel label1,label2; JTextField user; JPasswordField pass; JPanel jp1,jp2,jp3; JButton jb; public Login(){ super("登录"); loginframe=new JFrame(); label1 = new JLabel("姓名"); label2 = new JLabel("密码"); user = new JTextField("a", 10); pass = new JPasswordField("a", 10); jp1 = new JPanel(); jp2 = new JPanel(); jp3 = new JPanel(); jb = new JButton("登录"); panel = new BirdPanel(); } public void init(){ //setLayout设置为null即为清空布局管理器,允许组件自由布局 loginframe.setLayout(null); loginframe.setSize(432,674); loginframe.setLocationRelativeTo(null); loginframe.setVisible(true); loginframe.setResizable(false); loginframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); loginframe.add(jb); jp1.add(label1); jp1.add(user); jp1.setBounds(0,150,432,50); jp2.add(label2); jp2.add(pass); jp2.setBounds(0, 225, 432, 50); jp3.add(jb); jp3.setBounds(0,300,432,50); loginframe.add(jp1); loginframe.add(jp2); loginframe.add(jp3); jb.addActionListener(this); } public static void main(String[] args) { new Login().init(); // BirdFrame.main(args); // BirdFrame frame = new BirdFrame(); // frame.init(); // frame.panel.action(); } @Override public void actionPerformed(ActionEvent e) { if(username.equals(user.getText()) && password.equals(pass.getText())){ JOptionPane.showMessageDialog(null,"登录成功!", "提示", JOptionPane.INFORMATION_MESSAGE); //关闭登录窗口 loginframe.dispose(); // BirdFrame birdframe = new BirdFrame(); // birdframe.init(); // birdframe.panel.action(); }else{ //输入错误时报错并清空输入框 JOptionPane.showMessageDialog(null, "错误", "提示", JOptionPane.ERROR_MESSAGE); user.setText(""); pass.setText(""); } } } 游戏窗口页面 import javax.swing.JFrame; public class BirdFrame extends JFrame{ //定义游戏面板 BirdPanel panel ; //构造方法,初始化窗体属性 public BirdFrame(){ //创建面板对象 panel = new BirdPanel(); } public void init(){ this.setTitle("笨鸟"); this.setSize(432,674); //设置位置(据中) this.setLocationRelativeTo(null); //设置不允许改变窗体大小 this.setResizable(false); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.setVisible(true); this.add(panel); } public static void main(String[] args) { BirdFrame frame = new BirdFrame(); frame.init(); } } 游戏面板页面 import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import java.awt.image.BufferedImage; import java.io.IOException; import javax.imageio.ImageIO; import javax.swing.JPanel; public class BirdPanel extends JPanel implements MouseListener{ Colum c1,c2;//定义两个柱子 BufferedImage background;//背景图片 BufferedImage startImage;//开始图片 BufferedImage overImage;//结束图片 Ground ground;//定义地板对象 Bird bird;//定义鸟对象 int score;//分数 boolean gameover;//判断游戏是否结束的boolean数 boolean start;// 判断游戏是否开始的boolean数 public BirdPanel(){ c1 = new Colum(1);//第一根柱子 c2 = new Colum(2); ground = new Ground(); bird = new Bird(); try { background = ImageIO.read(this.getClass().getResource("/img/bg.png")); startImage = ImageIO.read(this.getClass().getResource("/img/start.png")); overImage = ImageIO.read(this.getClass().getResource("/img/gameover.png")); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } //将监听器添加到面板中 this.addMouseListener(this); } //加@Override重写paint同名函数 @Override public void paint(Graphics g){ super.paint(g); //drawImage(image img,x,y,ImageObserver observer); //drawImage(图像对象,x位置,y位置,异步信息通知的对象 g.drawImage(background, 0, 0, null);//画背景图片 if(!start){ //游戏没开始的话就画开始图片 g.drawImage(startImage,0,0,null); } //先画哪个哪个就在下面 //画柱子 g.drawImage(c1.img,c1.x-c1.width/2,c1.y-c1.height/2,null); g.drawImage(c2.img,c2.x-c2.width/2,c2.y-c2.height/2,null); //画鸟 g.drawImage(bird.img,bird.x-bird.width/2,bird.y-bird.height/2, null); //画地板 g.drawImage(ground.img, ground.x, ground.y, null); //设置界面中文字格式 Font font=new Font("楷体",Font.BOLD,30); g.setFont(font); g.setColor(Color.white); //画界面分数 g.drawString("分数:" + score, 10, 30); //判断游戏是否结束,如果gameover传入true则结束 if(gameover){ g.drawImage(overImage, 0, 0, null); } } @Override public void mousePressed(MouseEvent e) { if(gameover){ //如果游戏结束 //重新启动游戏 reStart(); }else{ //游戏没结束 //游戏开始 start = true; bird.flappy(); } } public void action(){ //一直刷新界面 while(true){ if(!gameover){ if(start){ //如果游戏没有结束,并且游戏开始了 //让地板移动 ground.setup(); //让鸟飞 bird.setup(); bird.fly(); //让主子移动 c1.setup(); c2.setup(); //增加难度,让第二根柱子上下移动 //c2.setupY(); } //穿过一个柱子得一分 if(bird.x==c1.x || bird.x==c2.x){ score ++; } } //如果鸟撞击柱子或者地面,游戏结束 if(bird.hit(c1)||bird.hit(c2)||bird.hit(ground)){ gameover = true;//游戏结束 } this.repaint(); try { Thread.sleep(10); } catch (InterruptedException e1) { e1.printStackTrace(); } } } public void reStart(){ c1 = new Colum(1); c2 = new Colum(2); ground = new Ground(); bird = new Bird(); start = false; gameover =false; score = 0; } @Override public void mouseClicked(MouseEvent e) { // TODO Auto-generated method stub } @Override public void mouseEntered(MouseEvent e) { // TODO Auto-generated method stub } @Override public void mouseExited(MouseEvent e) { // TODO Auto-generated method stub } @Override public void mouseReleased(MouseEvent e) { // TODO Auto-generated method stub } }
一个JFrame上添加2个JPanel之后,第一个JPanel上的画东西会在第二个JPanel上显示
![图片说明](https://img-ask.csdn.net/upload/201707/12/1499846738_463403.png) 右上角那个小的JPanel我是没有加网格的,还有就是左边那个正在掉的“L”也出现在右边了。 下面贴上我有关的代码: main方法里关于JFrame和JPanel的设置, JFrame jf=new JFrame("Tetirs"); TetirsGame game=new TetirsGame(); jf.setLayout(null);//设置为空布局,自定义 jf.getContentPane().setBackground(Color.cyan);//设置窗口的背景色 jf.setSize(600, 657);//设置窗口大小 jf.setVisible(true); jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); jf.setAlwaysOnTop(true); jf.setLocationRelativeTo(null); game.setBackground(Color.white); game.setBounds(5, 5, WIDTH, HEIGHT);//将game放在jf的哪个位置,宽高 game.action(jf); jf.getContentPane().add(game);//将game添加到jf上 drawOther(jf,game);//画其他的JLabel等东西 jf.getContentPane().add(scbd); scbd.setBackground(Color.cyan);//scbd是一个静态的小面板的对象 scbd.setBounds(460, 50, 80, 80); 我在大的JPanel里面的定时器里调用了这个: scbd.drawScoreBoard(tetrominos[1]);//在大面板的定时器里调用小面板的画“下一个”的方法 这个方法是这样的: public void drawScoreBoard(Tetromino tero) { this.t=tero; repaint(); } public void paint(Graphics g) { if(t!=null && t.state ==Tetromino.INACTIVE) { while(t.centerCell.getRow() >60 ||t.cell_1.getRow()>60 || t.cell_2.getRow()>60 || t.cell_3.getRow()>60 ) { t.leftMove(); } while(t.centerCell.getRow() <0 ||t.cell_1.getRow() < 0 || t.cell_2.getRow()<0 || t.cell_3.getRow()<0 ) { t.rightMove(); } while(t.centerCell.getCol() >60 ||t.cell_1.getCol() >60 || t.cell_2.getCol() >60 || t.cell_3.getCol() >60 ) { t.centerCell.setCol(t.centerCell.getCol()-20); t.getTetromino(); } while(t.centerCell.getCol()<0 ||t.cell_1.getCol() <0 || t.cell_2.getCol() <0 || t.cell_3.getCol() <0 ) { t.downMove(); } BufferedImage image=t.getImage(); g.drawImage(image, t.centerCell.getRow(), t.centerCell.getCol(), null); g.drawImage(image, t.cell_1.getRow(), t.cell_1.getCol(), null); g.drawImage(image, t.cell_2.getRow(), t.cell_2.getCol(), null); g.drawImage(image, t.cell_3.getRow(), t.cell_3.getCol(), null); } } 我的game是继承了JPanel的,主要逻辑也都在这里面, 因为我要在小的JPanel里面画game里面的Tetrominos[1],而且Tetrominos[1]是不断变化的。我就在game里面的定时器里面重复调用了方法,我觉得问题可能就出在这附近,但不是很懂,请各路大神指点下咯。
java.lang.ArrayIndexOutOfBoundsException: -1
这个怎么解决啊 弄了两天啦小白一个 ,做了一个推箱子的做了一半出错做不下去了,求助 public class MainFrame extends Frame implements KeyListener { public MainFrame() { tagetinit(); //笼子 personinit();//人物 Boxinit();//箱子 Treeinit();//树 backgroundInde();//背景初始化 setMainFrameUI();//主窗体 this.addKeyListener(this); //键盘监听器 } //用二维数组定义障碍 int[][] datas = { {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}, {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1}, {1,0,1,1,0,0,0,0,0,1,1,0,0,0,0,1}, {1,0,1,1,0,0,0,0,0,1,1,0,0,0,0,1}, {1,0,1,1,0,1,1,0,0,1,1,0,0,0,0,1}, {1,0,1,1,0,1,1,0,0,1,1,0,0,0,0,1}, {1,0,1,1,0,1,1,0,0,1,0,0,0,0,0,1}, {1,0,1,1,0,1,1,0,0,0,0,0,0,0,0,1}, {1,0,1,1,0,1,1,0,0,0,0,0,0,0,0,1}, {1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1}, {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1}, {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1} }; int wx; int wy; private void Treeinit() { Icon ic =new ImageIcon("tree.png"); //二维数组的遍历 for(int i=0;i<datas.length;i++) { for(int j=0;j<datas[i].length;j++) { if(datas[i][j] ==1) { JLabel lab_tree=new JLabel(ic); lab_tree.setBounds(12+50*j, 36+50*i, 50, 50); this.add(lab_tree); } } } } //笼子 private void tagetinit() { Icon i = new ImageIcon("lz.png"); JLabel lab_lz =new JLabel(i); this.add(lab_lz); lab_lz.setBounds(612, 436, 50, 50); JLabel lab_lz2 =new JLabel(i); lab_lz2.setBounds(612, 486, 50, 50); this.add(lab_lz2); JLabel lab_lz3 =new JLabel(i); lab_lz3.setBounds(612, 386, 50, 50); this.add(lab_lz3); } //背景 private void backgroundInde() { Icon i =new ImageIcon("bg1.jpg"); JLabel lag_bg = new JLabel(i); //设置位置与大小 lag_bg.setBounds(12,36,800,600); this.add(lag_bg); } //窗口 private void setMainFrameUI() { this.setLayout(null);// 设置自由布局 this.setTitle("推箱子1.1");//设置窗口名称 this.setLocation(300, 400); //窗口的位置 this.setSize(850, 650); //窗口大小 this.setVisible(true); //窗口可见 } // 人物 private void personinit() { int wx=1; int wy=8; Icon i = new ImageIcon("htl-zm.png"); lab_person = new JLabel(i); lab_person.setBounds(12+wx*50,36+wy*50,50,50 ); //设置位置 this.add(lab_person); //添加 } JLabel lab_person;//本来该法放在方法里面 放在这里让变量的作用范围变大一级 //箱子 private void Boxinit() { Icon i=new ImageIcon("lyy.png"); JLabel lab_box1= new JLabel(i); lab_box1.setBounds(212, 236, 50, 50); this.add(lab_box1); JLabel lab_box2= new JLabel(i); lab_box2.setBounds(412, 236, 50, 50); this.add(lab_box2); JLabel lab_box3= new JLabel(i); lab_box3.setBounds(612, 236, 50, 50); this.add(lab_box3); } //键盘监听器 @Override public void keyPressed(KeyEvent e) { //左 37 上38 右39 下40 int key = e.getKeyCode(); //用于获取键码值 //右移 if(key == 39) { if(datas[wy][wx+1] == 1) { return; } wx=wx+1; int x=(int)lab_person.getLocation().getX(); int y=(int)lab_person.getLocation().getY(); lab_person.setLocation(x+50,y); Icon i = new ImageIcon("htl-right.png"); lab_person.setIcon(i); } //左移 if(key == 37) { if(datas[wy][wx-1] == 1) { return; } wx=wx-1; //让人物移动首先要知道人物的位置 int x=(int)lab_person.getLocation().getX(); //得到的是走上叫 int y=(int)lab_person.getLocation().getY(); //确定一步移动多少 //右移x增加 y不变 lab_person.setLocation(x-50,y); //人物移动会改变方向 也就是改变一张图片 Icon i = new ImageIcon("htl-left.png"); lab_person.setIcon(i); } //上移 if(key == 38) { if(datas[wy-1][wx] == 1) { return; } wy=wy-1; int x=(int)lab_person.getLocation().getX(); int y=(int)lab_person.getLocation().getY(); lab_person.setLocation(x,y-50); Icon i = new ImageIcon("htl-back.png"); lab_person.setIcon(i); } //下移 if(key == 40) { if(datas[wy+1][wx]==1) { return; } wy=wy+1; int x=(int)lab_person.getLocation().getX(); int y=(int)lab_person.getLocation().getY(); lab_person.setLocation(x,y+50); Icon i = new ImageIcon("htl-zm.png"); lab_person.setIcon(i); } } @Override public void keyReleased(KeyEvent e) { // TODO Auto-generated method stub } @Override public void keyTyped(KeyEvent e) { // TODO Auto-generated method stub } }
JAVA小白求救:坦克大战-多关卡咋做?没思路。。。
坦克大战-多关卡咋做: 自己代码如下: //坦克大战:-换关卡,-IO声音流,把爆炸换成外面的图片,有BUG继续游戏的时候看不到爆炸一下才能看到地方坦克, import java.awt.*; import javax.swing.*; import java.awt.event.*; import java.util.*; import java.io.*; public class Tank1 extends JFrame implements ActionListener{ MyPanel mp=null; StartPanel gkmp=null; //Record record=null; JMenuBar cd=null;//??不熟 JMenu cd1=null;//??不熟 JMenu cd2=null; JMenuItem cd1xl1=null;//菜单栏1系列的1 JMenuItem cd1xl2=null;//菜单栏1系列的2 JMenuItem cd1xl3=null;//菜单栏1系列的1 JMenuItem cd1xl4=null;//菜单栏1系列的2 JMenuItem cd2xl1=null;//菜单栏2系列的1 JLabel imageJLabel=null; String newGame="newGame";//? //Image tp1=null; public static void main(String[] args) { Tank1 t1=new Tank1(); } public Tank1(){ gkmp=new StartPanel(); mp=new MyPanel(newGame);//?? Record record=new Record();//创建一个记录对象 Thread t=new Thread(gkmp); t.start(); cd=new JMenuBar();//菜单栏 不熟 cd1=new JMenu("游戏(G)");//第一个菜单栏的第一个菜单 cd1.setMnemonic('G');//快界键 cd2=new JMenu("设置(Z)"); cd2.setMnemonic('Z'); cd1xl1=new JMenuItem("开始新游戏(N)");//菜单系列 cdxl cd1xl1.setMnemonic('N'); cd1xl1.addActionListener(this);//加组件监听 cd1xl1.setActionCommand("newGame");//设置键值,和上文同名参数有啥关系没? cd1.add(cd1xl1); cd1xl2=new JMenuItem("继续游戏(H)");//菜单系列 cdxl cd1xl2.setMnemonic('H'); cd1xl2.addActionListener(this);//加组件监听 cd1xl2.setActionCommand("goonGame");//设置键值 cd1.add(cd1xl2); cd1xl3=new JMenuItem("保存退出(S)");//菜单系列 cdxl cd1xl3.setMnemonic('S'); cd1xl3.addActionListener(this);//加组件监听 cd1xl3.setActionCommand("saveOut");//设置键值 cd1.add(cd1xl3); cd1xl4=new JMenuItem("退出(Q)"); cd1xl4.setMnemonic('Q'); cd1xl4.addActionListener(this);//加组件监听 cd1xl4.setActionCommand("exit");//设置键值 cd1.add(cd1xl4); cd.add(cd1);//给菜单栏 cd 添加菜单 cd1 cd2xl1=new JMenuItem("速度(F)");//菜单系列 cdxl 没做好效果? cd1xl4.setMnemonic('F'); cd1xl4.addActionListener(this);//加组件监听 cd1xl4.setActionCommand("FSpeed");//设置键值 cd2.add(cd2xl1); cd.add(cd2); ImageIcon img = new ImageIcon("E:/Tank1/tankebig.PNG"); JLabel imageJLabel = new JLabel(img); gkmp.add(imageJLabel); this.add(gkmp); this.setJMenuBar(cd); this.setTitle("坦克大战"); ImageIcon tp1=new ImageIcon("E:/Tank1/tankexiao.PNG");//设置小图标地址要写全路径 this.setIconImage(tp1.getImage()); this.setSize(700,620); this.setLocation(300,80); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.setVisible(true);//可见 this.setResizable(false);//可调 // this.setResizable(true); } public void actionPerformed(ActionEvent e){ //boolean flag=true; if(e.getActionCommand().equals("newGame")) { this.remove(gkmp);//取消界面 gkmp if(mp.flag==false)//因为在主类构造函数开始就创建了mp,所以可以引用flag变量 { this.remove(mp); mp=new MyPanel("newGame"); } this.add(mp); this.addKeyListener(mp); Thread t=new Thread(mp);//启动我的MyPanel模板对象mp的线程 t.start();//叫醒线程 this.setVisible(true);//因为默认的是不可见,必须写这个!! Record.bcjl();//???? }else if(e.getActionCommand().equals("saveOut")) { Record record0=new Record(); // record0.setDtk(mp.dtk); record0.cunpan();///?????? System.exit(0);//游戏退出 }else if(e.getActionCommand().equals("exit")) { Record.bcjl(); System.exit(0);//游戏退出 }else if(e.getActionCommand().equals("goonGame")){ this.remove(gkmp); if(mp.flag==false)//因为在主类构造函数开始就创建了mp,所以可以引用flag变量 { this.remove(mp); mp=new MyPanel("goonGame"); } Thread t=new Thread(mp); t.start(); this.add(mp); this.addKeyListener(mp); this.setVisible(true); } } class StartPanel extends JPanel implements Runnable //开始界面类 { int time=0; public void paint(Graphics g){ super.paint(g); // g.fillRect(0, 0, 600, 500);//设置画布 g.setColor(Color.black);//设置颜色 Color mycolor1=new Color(250,50,0);//自定义红色 g.setFont(new Font("华文琥珀",Font.BOLD,80));//设置字体//? g.drawString("坦克大战",190 , 460);//绘字符串 g.setColor(Color.black);//设置颜色 g.setFont(new Font("黑体",1,14));//设置字体 g.drawString("李晋祥",648 , 552);//绘字符串 if(time%2==0) { g.setColor(Color.white);//设置颜色 g.setFont(new Font("华文行楷",3,35));//字体:华康楷体, Ravie, OCR A Extended g.drawString("准备战斗",270 , 345);//绘字符串 } } StartPanel(){ } public void run(){ while(true){ try{ Thread.sleep(400); }catch(Exception e){} time++; this.repaint(); } } } class MyPanel extends JPanel implements KeyListener,Runnable { //Vector<MyTank> mts=new Vector<MyTank>();//建立一个我的坦克集合类可以出无限个坦克 MyTank mt=null; MyTank mt0=null; MyTank mt01=null; MyTank mt02=null; Vector<DiTank> dtk=new Vector<DiTank>();//建立一个敌坦克集合类 Props props=null; Vector<Baozha> bzjh=new Vector<Baozha>();//创建一个爆炸类的集合 Vector<Weizhi> wzjh=new Vector<Weizhi>();//建立一个位置集合类,为啥建立这集合类 int tksl=3;//坦克数量 int a=122; int b=455; int n=10; int myzdNum=4;//? int propsSort=5; int time=0; boolean flag=true;//标记是不是已经创建过MyPanel类 boolean b1=false; int x=1;//总关卡数? int rocket=1;//没用? int huopao=0;//? Color mycolor1=new Color(250,50,0);//自定义红色 Color mycolor2=new Color(0,250,50);//自定义绿色 Color mycolor3=new Color(0,50,250);//自定义兰色 Color mycolor11=new Color(130,200,0);//自定义土黄 Color mycolor31=new Color(0,100,200);//自定义兰色 Color mycolor21=new Color(0,250,0);//自定义绿色 JLabel imageJLabel0=null; JLabel imageJLabel1=null; ImageIcon img0=null;//? ImageIcon img1=null;//? public MyPanel(String ss) { ImageIcon img0 = new ImageIcon("e:/Tank1/background.jpg"); JLabel imageJLabel0 = new JLabel(img0); this.add(imageJLabel0); Record.dqjl();//? mt=new MyTank(600,280);//new多个可改为多个坦克,循环数组 mt0=new MyTank(550,280);//new多个可改为多个坦克,循环数组 mt01=new MyTank(550,330);//new多个可改为多个坦克,循环数组 mt02=new MyTank(600,330);//new多个可改为多个坦克,循环数组 props=new Props(30,30);//没有实际意义,为了new对象,必须要有个参数? if(ss.equals("newGame")){ // record=new Record(); for(int i=0;i<tksl;i++){ DiTank dt=new DiTank((i)*a,b);//添加出场敌坦 // dt.dtkxl(dtk);///???是不是敌人坦克血量 dt.setFangxiang(1);//给一个初始值,调drawTank()赋初值要用 Thread t2=new Thread(dt); t2.start(); Zidan zd=new Zidan(dt.x,dt.y,1);//?这是干啥加子弹元素吗? Thread t3=new Thread(zd);//? t3.start(); dtk.add(dt); } }else if(ss.equals("goongame")){//继续游戏有问题 感觉读取存盘信息有问题 wzjh=Record.dupan(); for(int i=0;i<wzjh.size();i++){ Weizhi wz=wzjh.get(i); DiTank dt=new DiTank(wz.x,wz.y);//添加出场敌坦 dt.setFangxiang(wz.fangxiang); // dt.dtkxl(dtk);//?敌坦克血量,好像暂时用不着 // dt.setFangxiang(1);//给一个初始值,调drawTank()赋初值要用 Thread t2=new Thread(dt); t2.start(); Zidan zd=new Zidan(dt.x,dt.y,1);//?这是干啥加子弹元素吗? Thread t3=new Thread(zd);//? t3.start(); dtk.add(dt); } } flag=false;//MyPanel类的mp创建过一次就标记为假 // this.repaint(); // Record.next(); // if(Record.next()%2!=0){ // Record.reMtNum();//需要吗? // Record.reDtNum();//需要吗? // Record.reAddMtNum(); // } } public void outNum(Graphics g)//画出统计数据的方法也即使显示数量的函数 { g.setColor(Color.cyan); this.drawTank(500,150,g,0,0);//引用drawtank()的不能是g,而是this this.drawTank(570,150,g,0,1); this.drawTank(500,70,g,0,1); g.setColor(Color.black); g.setFont(new Font("仿宋",2,20));//??换换字体效果 g.drawString(Record.getDtNum()+"",600,170); if((Record.getMtNum()+Record.getAddMtNum())>=0){ g.drawString((Record.getMtNum()+Record.getAddMtNum())+"",530,170);// }else{ g.drawString((Record.getAddMtNum())+"",530,170); } g.setColor(Color.blue); g.setFont(new Font("方正小标宋",1,17)); g.drawString("干掉的坦克总数:",510,40); g.setColor(Color.black); g.setFont(new Font("仿宋",2,20)); g.drawString(Record.getSumDtNum()+"",530,90); g.setColor(Color.MAGENTA);//设置颜色 g.setFont(new Font("隶书",0,20));//设置字体 g.drawString("第"+x+"关",500 , 200);//绘字符串 } public void paint(Graphics g){//这个方法每当窗口激活,最小化,调用repaint()方法都会运行,线程中调用就一直显示 super.paint(g); // g.fillRect(0,0,400,300);//做个背景画布,默认黑色 this.outNum(g);//调用显示数量的函数 g.setColor(Color.red);//设置颜色 g.fillRect(530, 210, 30, 20); g.setColor(Color.black);//设置颜色 g.drawLine(530, 210, 530, 320); g.setColor(mycolor11);//设置颜色 if(mt.live==true){ this.drawTank(mt.getX(),mt.getY(),g,mt.fangxiang,0); } if(mt0.live==true){ this.drawTank(mt0.getX(),mt0.getY(),g,mt0.fangxiang,2); } if(mt01.live==true){ this.drawTank(mt01.getX(),mt01.getY(),g,mt01.fangxiang,2); } if(mt02.live==true){ this.drawTank(mt02.getX(),mt02.getY(),g,mt02.fangxiang,2); } if(mt.getLive()==false){ g.setColor(mycolor11);//设置颜色 g.setFont(new Font("Gill Sans Ultra Bold Condensed",1,40));//字体:华康楷体, Ravie, OCR A Extended g.drawString("game over...",200 , 220);//绘字符串 this.repaint(); } if(Record.getDtNum()%6==0&&(Record.getDtNum()>10)){ // if(time%2==0) // { g.setColor(Color.blue);//设置颜色 g.setFont(new Font("华文行楷",1,35));//字体:华康楷体, Ravie, OCR A Extended g.drawString("你行不行?",310 , 265);//绘字符串 // } } if(Record.getDtNum()==0){ g.setColor(Color.red);//设置颜色 g.setFont(new Font("华文行楷",1,35));//字体:华康楷体, Ravie, OCR A Extended g.drawString("过关!",300 , 265);//绘字符串 } for(int i=0;i<dtk.size();i++)//画敌人坦克asd { DiTank dt=dtk.get(i); if(dt.live==true){ this.drawTank(dt.getX(),dt.getY(),g,dt.fangxiang,1);//??!!注意用法用dtk 还是dt调用 } } for(int i=0;i<mt.aa.size();i++)//画我的子弹 { Zidan zd=mt.aa.get(i); if(mt.zd!=null&&mt.zd.live==true) //???画子弹的条件 { //g.fill3DRect((mt.zd.x-2),(mt.zd.y-2), 8, 8, false); //???画子弹火力圈 g.setColor(Color.black);//子弹颜色设置为白色 g.fillOval(zd.x+1,zd.y+1, 4,4); } if(zd.live==false) { mt.aa.remove(zd); } } //this.repaint();//? for(int i=0;i<dtk.size();i++)//画敌人的子弹 { DiTank dt=dtk.get(i); for(int j=0;j<dt.dzd.size();j++) { Zidan zd=dt.dzd.get(j); if(zd!=null&&dtk.get(i).live==true) { g.setColor(Color.red);//子弹颜色设置为红色,次处不进循环是不是更好? g.fillOval(zd.x+1,zd.y+1, 4,4); } if(zd.live==false)//删除生命为假的敌人子弹???? { dt.dzd.remove(zd); } } } for(int i=0;i<bzjh.size();i++) //画爆炸 { Baozha bz=bzjh.get(i); if(bzjh.get(i).livetime>140){ g.setColor(Color.red); g.fillOval(bz.x, bz.y+5, 20,20 );//代替上面的句子 //g.fillOval(bz.x, bz.y, 20,5 );//可以用来做合成图形,但是要定好坐标点 }else if((bzjh.get(i).livetime<=100)&&(bzjh.get(i).livetime>50)){ g.setColor(Color.orange); g.fillOval(bz.x+4, bz.y+9, 12,12 ); }else if((bzjh.get(i).livetime<=50)&&(bzjh.get(i).livetime>20)){ g.setColor(Color.yellow); g.fillOval(bz.x+7, bz.y+11,5,5 ); }else{ g.setColor(Color.pink); g.fillOval(bz.x+10, bz.y+13,2,2 ); } bz.ltjs(); //生存时间减少函数 if(bz.livetime==0){ bzjh.remove(bz); } } // if(props.live==true){//画道具 this.drawProps(props.getX(),props.getY(),g,props.getleixing()); } //} this.repaint();//教学视频少了这句,子弹无法自主运行,主类启动线程后仍然可动 } public void keyPressed(KeyEvent e)//键盘输入事件 { if(mt.getLive()==true){ if(e.getKeyCode()==KeyEvent.VK_W){ this.mt.setFangxiang(0); this.mt.xiangshang(); }else if(e.getKeyCode()==KeyEvent.VK_S){ this.mt.setFangxiang(1); this.mt.xiangxia(); }else if(e.getKeyCode()==KeyEvent.VK_A){ this.mt.setFangxiang(2); this.mt.xiangzuo(); }else if(e.getKeyCode()==KeyEvent.VK_D){ this.mt.setFangxiang(3); this.mt.xiangyou(); } if(e.getKeyCode()==KeyEvent.VK_J) { if((mt.aa.size()<myzdNum)&&(mt.live==true))//子弹设置最多 myzdNum 发 { this.mt.fszd();//调用发射子弹函数 } } } } public void crash(){ } public boolean addprops(Props props,MyTank mt)//吃道具触发 方法 (道具功能触发模型为边长20的正方形) { boolean b2=false; switch(props.leixing){ case 0://我的坦克速度提高//mt.fangxiang 0\1\2\3 if((mt.getX()+10>props.getX()&&mt.getX()+10<props.getX()+20&&mt.getY()+15<props.getY()+20&&mt.getY()+15>props.getY())||(mt.getX()+10>props.getX()&&mt.getX()+10<props.getX()+20&&mt.getY()+15>props.getY()&&mt.getY()+15<props.getY()+20)||(mt.getX()+10>props.getX()&&mt.getX()+10<props.getX()+20&&mt.getY()+15>props.getY()&&mt.getY()+15<props.getY()+20)||(mt.getX()+15>props.getX()&&mt.getX()+15<props.getX()+20&&mt.getY()+10>props.getY()&&mt.getY()+10<props.getY()+20)){ props.live=false; mt.sudu=20; b2=true; } break; case 1://效果回到出生地 if((mt.getX()+10>props.getX()&&mt.getX()+10<props.getX()+20&&mt.getY()+15<props.getY()+20&&mt.getY()+15>props.getY())||(mt.getX()+10>props.getX()&&mt.getX()+10<props.getX()+20&&mt.getY()+15>props.getY()&&mt.getY()+15<props.getY()+20)||(mt.getX()+10>props.getX()&&mt.getX()+10<props.getX()+20&&mt.getY()+15>props.getY()&&mt.getY()+15<props.getY()+20)||(mt.getX()+15>props.getX()&&mt.getX()+15<props.getX()+20&&mt.getY()+10>props.getY()&&mt.getY()+10<props.getY()+20)){ props.live=false; mt.setX(630); mt.setY(280); b2=true; } break; case 2://提高我可以发射的子弹数目 //mt.fangxiang 0\1\2\3 if((mt.getX()+10>props.getX()&&mt.getX()+10<props.getX()+20&&mt.getY()+15<props.getY()+20&&mt.getY()+15>props.getY())||(mt.getX()+10>props.getX()&&mt.getX()+10<props.getX()+20&&mt.getY()+15>props.getY()&&mt.getY()+15<props.getY()+20)||(mt.getX()+10>props.getX()&&mt.getX()+10<props.getX()+20&&mt.getY()+15>props.getY()&&mt.getY()+15<props.getY()+20)||(mt.getX()+15>props.getX()&&mt.getX()+15<props.getX()+20&&mt.getY()+10>props.getY()&&mt.getY()+10<props.getY()+20)){ props.live=false; this.myzdNum=30; this.huopao=1; this.n=4; b2=true; } break; case 3://显示的敌人坦克全死,但实际效果是..是不出敌方坦克了!!!! if((mt.getX()+10>props.getX()&&mt.getX()+10<props.getX()+20&&mt.getY()+15<props.getY()+20&&mt.getY()+15>props.getY())||(mt.getX()+10>props.getX()&&mt.getX()+10<props.getX()+20&&mt.getY()+15>props.getY()&&mt.getY()+15<props.getY()+20)||(mt.getX()+10>props.getX()&&mt.getX()+10<props.getX()+20&&mt.getY()+15>props.getY()&&mt.getY()+15<props.getY()+20)||(mt.getX()+15>props.getX()&&mt.getX()+15<props.getX()+20&&mt.getY()+10>props.getY()&&mt.getY()+10<props.getY()+20)){ props.live=false; for(int i=0;i<dtk.size();i++){ if(dtk.get(i).live==true){ dtk.get(i).live=false; Record.setDtNum();//有几个活坦克生命变假,就累计几辆dtNum } } b1=true; b2=true; } break; case 4://吃道具加命 if((mt.getX()+10>props.getX()&&mt.getX()+10<props.getX()+20&&mt.getY()+15<props.getY()+20&&mt.getY()+15>props.getY())||(mt.getX()+10>props.getX()&&mt.getX()+10<props.getX()+20&&mt.getY()+15>props.getY()&&mt.getY()+15<props.getY()+20)||(mt.getX()+10>props.getX()&&mt.getX()+10<props.getX()+20&&mt.getY()+15>props.getY()&&mt.getY()+15<props.getY()+20)||(mt.getX()+15>props.getX()&&mt.getX()+15<props.getX()+20&&mt.getY()+10>props.getY()&&mt.getY()+10<props.getY()+20)){ props.live=false; Record.setAddMtNum(); b2=true; // System.out.println("吃道具加命程序,正常运行"); } break; } return b2; } // addMyTank++; //MyTank mt1=new MyTank(mt.getX(),mt.getY());//??创建另一个MyTank对象 // public void setAddMytank(){ // addMyTank++; // }; // public static int getAddMytank(){ // return addMyTank; // }; public void run() //我的画板的 线程函数 { while(true){ try{ Thread.sleep(50);// }catch(Exception e){} for(int i=0;i<mt.aa.size();i++)//我的子弹集中敌坦克的线程 { Zidan myzd=mt.aa.get(i); if(myzd.live){ for(int j=0;j<dtk.size();j++){ DiTank dt=dtk.get(j); // Zidan zd=dt.dzd.get(j);//为啥dzd可以直接用,不用创建// ||(b1==true&&Record.getDtNum()>0) if(dt.live)//内关联敌人坦克重生的一种情况,有敌人坦克被打中 { if(this.jzsf(myzd,dt)&&((Record.getDtNum()-tksl)>=0)){//调用jzsf(),打中同时,坦克定点?及时重生 DiTank dt0=new DiTank((int)(Math.random()*50+5)*10,(int)(Math.random()*100+450)); Thread t2=new Thread(dt0); t2.start(); Zidan zd0=new Zidan(dt0.x,dt0.y,dt0.fangxiang); Thread t3=new Thread(zd0); t3.start(); dt0.dzd.add(zd0); dtk.add(dt0); } } } } } if(Record.getDtNum()>=tksl&&b1==true){ //炸弹爆炸,敌坦克按条件重生, for(int i=0;i<tksl;i++){ DiTank dt1=new DiTank((int)(Math.random()*20)*10,(int)(Math.random()*100+450)); Thread t6=new Thread(dt1); t6.start(); Zidan zd1=new Zidan(dt1.x,dt1.y,dt1.fangxiang); Thread t7=new Thread(zd1); t7.start(); dt1.dzd.add(zd1); dtk.add(dt1); } b1=false; } if((Record.getDtNum()==(tksl-1))&&(b1==true)){ for(int i=0;i<tksl-1;i++){ DiTank dt1=new DiTank((int)(Math.random()*20)*10,(int)(Math.random()*100+450)); Thread t6=new Thread(dt1); t6.start(); Zidan zd1=new Zidan(dt1.x,dt1.y,dt1.fangxiang); Thread t7=new Thread(zd1); t7.start(); dt1.dzd.add(zd1); dtk.add(dt1); } b1=false; } if((Record.getDtNum()==(tksl-2))&&(b1==true)){ // for(int i=0;i<tksl-1;i++){ DiTank dt1=new DiTank((int)(Math.random()*20)*10,(int)(Math.random()*100+450)); Thread t6=new Thread(dt1); t6.start(); Zidan zd1=new Zidan(dt1.x,dt1.y,dt1.fangxiang); Thread t7=new Thread(zd1); t7.start(); dt1.dzd.add(zd1); dtk.add(dt1); b1=false; } for(int j=0;j<dtk.size();j++)//敌人的子弹击中我的坦克的线程 { DiTank dt=dtk.get(j);//取出所有敌方坦克 for(int i=0;i<dt.dzd.size();i++) { Zidan zd=dt.dzd.get(i);//? if(zd.live) { if(this.jzsf(zd,mt)==true){//调用 击中敌坦 函数 } } } } if((this.time%120)==0){//6秒发生1次 道具随机重置//draw mt hit props props.live=true; // props.leixing=2; props.leixing=(int)(Math.random()*propsSort); props.x=(int)(Math.random()*370); props.y=(int)(Math.random()*270); props.livetime=100;//道具生存期 } if(props.livetime>0){//道具生存期变化 props.livetime--; }else{ props.live=false; } if(mt.live==true&&props.live==true){//调用 吃道具 方法 this.addprops(props,mt); } time++; // if(SaveData.getSumDtNum()%20==0){ // Record.next(); // } this.repaint();//线程运行中重绘?? } } public void jzwf()//敌人子弹集中我方坦克的方法 { for(int i=0;i<this.dtk.size();i++){ DiTank dt=dtk.get(i); for(int j=0;j<dt.dzd.size();j++){ Zidan zd=dt.dzd.get(j); this.jzsf(zd, mt); } } } public void jzdf() //我的子弹击中坦克的方法 { for(int i=0;i<mt.aa.size();i++){ Zidan zd=mt.aa.get(i);//从我的子弹集合类取我的各个子弹 if(zd.live==true){ for(int j=0;j<dtk.size();j++){ DiTank dt=dtk.get(j);//从敌坦克集合类取出各个敌坦克 if(dt.live){ this.jzsf(zd,dt); // levelDtNum--; } } } this.repaint(); } } public boolean jzsf(Zidan zd,Tank tk)//击中双方的方法 { boolean b2=false; switch(tk.fangxiang) { case 0: case 1: if(zd.x>tk.x&&zd.x<tk.x+20&&zd.y>tk.y&&zd.y<tk.y+30)//分辨率判断? { if(tk instanceof DiTank){//只改这就实现 判断tk是不是DiTank的实例 Record.setDtNum(); Record.setSumDtNum(); // Record.setAddMtNum(); tk.live=false; b2=true; }else{ // System.out.println("Record.getMtNum()="+Record.getMtNum()); Record.setMtNum();//Record.getSumMtNum()一直小于0 ?bug if(Record.getMtNum()+1<=0){ Record.lowAddMtNum(); } // System.out.println("Record.getMtNum()="+Record.getMtNum()); // System.out.println("Record.AddMtNum()="+Record.getAddMtNum()); if(Record.getMtNum()+Record.getAddMtNum()>0){//bug 被打一下就游戏结束 已经解决 mt.setX(140); mt.setY(232); } if(Record.getMtNum()+Record.getAddMtNum()<=0){ tk.live=false; } } zd.live=false; Baozha bz=new Baozha(tk.x,tk.y); bzjh.add(bz); } break; case 2: case 3: if(zd.x>tk.x&&zd.x<tk.x+30&&zd.y>tk.y&&zd.y<tk.y+20){ if(tk instanceof DiTank){//只改这就实现 判断tk是不是DiTank的实例 Record.setDtNum();//每次敌人坦克数量-1 Record.setSumDtNum(); // Record.setAddMtNum(); tk.live=false; b2=true; }else{ // System.out.println("Record.getMtNum()="+Record.getMtNum()); Record.setMtNum();//Record.getSumMtNum()一直小于0 ?bug if(Record.getMtNum()+1<=0){ Record.lowAddMtNum(); } // System.out.println("Record.getMtNum()="+Record.getMtNum()); // System.out.println("Record.AddMtNum()="+Record.getAddMtNum()); if(Record.getMtNum()+Record.getAddMtNum()>0){//bug 被打一下就游戏结束 已经解决 mt.setX(550); mt.setY(270); } if(Record.getMtNum()+Record.getAddMtNum()<=0){ tk.live=false; } } zd.live=false; Baozha bz=new Baozha(tk.x,tk.y); bzjh.add(bz); } break; } return b2; } public void keyTyped(KeyEvent e){} public void keyReleased(KeyEvent e){} public void drawTank(int x,int y,Graphics g,int fangxiang,int leixing)//画坦克函数 { int m=10; //double n=1; switch(leixing)//不同阵营坦克 { case 0://我的坦克 g.setColor(Color.yellow);// 我的坦克颜色 黄色 // g.fillOval(170*huopao, 240*huopao, 30*huopao, 30*huopao); m=11; break; case 1://敌人的坦克 g.setColor(mycolor3);//敌人坦克颜色 蓝色 // m=15; break; case 2://玩家2的坦克 g.setColor(mycolor1);//敌人坦克颜色 绿色 break; } switch(fangxiang)//不同方向的坦克(0,1,2,3)分别代表上下左右,中心原点不变做坐标变换 { case 0://上 g.fill3DRect(x,y,5,30,true); g.fill3DRect(x+15,y,5,30,true); g.fill3DRect(x+5,y+5,10,20,true); g.drawLine(x+10,y-5,x+10,(y+10)); g.setColor(Color.black); g.fillOval(x+5,y+10,10,10); break; case 1://下 g.fill3DRect(x,y,5,30,true); g.fill3DRect(x+15,y,5,30,true); g.fill3DRect(x+5,y+5,10,20,true); g.drawLine(x+10,y+10,x+10,(y+35)); g.setColor(Color.black); g.fillOval(x+5,y+10,10,10); break; case 2://左 g.fill3DRect(x-5,y+5,30,5,true); g.fill3DRect(x-5,y+20,30,5,true); g.fill3DRect(x,y+10,20,10,true); g.drawLine((x-10)+n-m,y+15,(x+10),(y+15)); g.setColor(Color.black); g.fillOval(x+5,y+10,10,10); break; case 3://右 g.fill3DRect(x-5,y+5,30,5,true); g.fill3DRect(x-5,y+20,30,5,true); g.fill3DRect(x,y+10,20,10,true); g.drawLine((x+10)-n+m,y+15,(x+30),(y+15)); g.setColor(Color.black); g.fillOval(x+5,y+10,10,10); break; } } public void drawProps(int x,int y,Graphics g,int leixing)//画道具 { if(time%8==0){ switch(leixing) { case 0://画车轮对应坦克加速 g.setColor(Color.white); g.fillOval(x, y, 21, 21); g.setColor(Color.black); g.fillOval(x+2,y+2,16,16); g.setColor(Color.white); g.drawOval(x+2,y+2,16,16); g.drawLine(x+2,y+10,x+18,y+10); g.drawLine(x+10,y+2,x+10,y+18); g.drawLine(x+16,y+4,x+4,y+16); g.drawLine(x+4,y+4,x+16,y+16); break; case 1://画回出生地道具图标 g.setColor(Color.white); g.drawRoundRect(x, y, 20, 20, 5, 5); g.setColor(mycolor3); g.fillRoundRect(x+5, y+5, 10, 10, 5, 5); break; case 2://画增加子弹数目道具//? g.setColor(mycolor2); g.fill3DRect(x-15,y+8,30,5,false); g.fill3DRect(x-15,y+6,10,10,true); g.fillOval(x+15,y+7,7,7); break; case 3://画炸弹 g.setColor(mycolor2); g.fillRect(x, y, 21, 21); g.setColor(Color.black); g.fillRect(x+8,y+6,6,2); g.fillOval(x+3,y+7,14,14); g.drawLine(x+11, y+3, x+11, y+6); g.setColor(Color.white); g.drawLine(x+11, y+15, x+8, y+14); break; case 4://画小坦克道具 g.setColor(Color.yellow); g.fill3DRect(x,y,20,3,true); g.fill3DRect(x,y+10,20,3,true); g.fill3DRect(x+3,y+3,14,7,false); g.fillOval(x+6,y+3,7,7); g.drawLine(x-7,y+6,x+7,y+6); break; } } } } } //坦克大战: 不会做多关卡??!! //IO声音流没做,IO流存储也有点问题,有BUG继续游戏的时候看不到爆炸一下才能看到地方坦克, import java.awt.*; import javax.swing.*; import java.awt.event.*; import java.util.*; import java.io.*; public class Tank1 extends JFrame implements ActionListener{ MyPanel mp=null; StartPanel gkmp=null; //Record record=null; JMenuBar cd=null;//??不熟 JMenu cd1=null;//??不熟 JMenu cd2=null; JMenuItem cd1xl1=null;//菜单栏1系列的1 JMenuItem cd1xl2=null;//菜单栏1系列的2 JMenuItem cd1xl3=null;//菜单栏1系列的1 JMenuItem cd1xl4=null;//菜单栏1系列的2 JMenuItem cd2xl1=null;//菜单栏2系列的1 JLabel imageJLabel=null; String newGame="newGame";//? //Image tp1=null; public static void main(String[] args) { Tank1 t1=new Tank1(); } public Tank1(){ gkmp=new StartPanel(); mp=new MyPanel(newGame);//?? Record record=new Record();//创建一个记录对象 Thread t=new Thread(gkmp); t.start(); cd=new JMenuBar();//菜单栏 不熟 cd1=new JMenu("游戏(G)");//第一个菜单栏的第一个菜单 cd1.setMnemonic('G');//快界键 cd2=new JMenu("设置(Z)"); cd2.setMnemonic('Z'); cd1xl1=new JMenuItem("开始新游戏(N)");//菜单系列 cdxl cd1xl1.setMnemonic('N'); cd1xl1.addActionListener(this);//加组件监听 cd1xl1.setActionCommand("newGame");//设置键值,和上文同名参数有啥关系没? cd1.add(cd1xl1); cd1xl2=new JMenuItem("继续游戏(H)");//菜单系列 cdxl cd1xl2.setMnemonic('H'); cd1xl2.addActionListener(this);//加组件监听 cd1xl2.setActionCommand("goonGame");//设置键值 cd1.add(cd1xl2); cd1xl3=new JMenuItem("保存退出(S)");//菜单系列 cdxl cd1xl3.setMnemonic('S'); cd1xl3.addActionListener(this);//加组件监听 cd1xl3.setActionCommand("saveOut");//设置键值 cd1.add(cd1xl3); cd1xl4=new JMenuItem("退出(Q)"); cd1xl4.setMnemonic('Q'); cd1xl4.addActionListener(this);//加组件监听 cd1xl4.setActionCommand("exit");//设置键值 cd1.add(cd1xl4); cd.add(cd1);//给菜单栏 cd 添加菜单 cd1 cd2xl1=new JMenuItem("速度(F)");//菜单系列 cdxl 没做好效果? cd1xl4.setMnemonic('F'); cd1xl4.addActionListener(this);//加组件监听 cd1xl4.setActionCommand("FSpeed");//设置键值 cd2.add(cd2xl1); cd.add(cd2); ImageIcon img = new ImageIcon("E:/Tank1/tankebig.PNG"); JLabel imageJLabel = new JLabel(img); gkmp.add(imageJLabel); this.add(gkmp); this.setJMenuBar(cd); this.setTitle("坦克大战"); ImageIcon tp1=new ImageIcon("E:/Tank1/tankexiao.PNG");//设置小图标地址要写全路径 this.setIconImage(tp1.getImage()); this.setSize(700,620); this.setLocation(300,80); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.setVisible(true);//可见 this.setResizable(false);//可调 // this.setResizable(true); } public void actionPerformed(ActionEvent e){ //boolean flag=true; if(e.getActionCommand().equals("newGame")) { this.remove(gkmp);//取消界面 gkmp if(mp.flag==false)//因为在主类构造函数开始就创建了mp,所以可以引用flag变量 { this.remove(mp); mp=new MyPanel("newGame"); } this.add(mp); this.addKeyListener(mp); Thread t=new Thread(mp);//启动我的MyPanel模板对象mp的线程 t.start();//叫醒线程 this.setVisible(true);//因为默认的是不可见,必须写这个!! Record.bcjl();//???? }else if(e.getActionCommand().equals("saveOut")) { Record record0=new Record(); // record0.setDtk(mp.dtk); record0.cunpan();///?????? System.exit(0);//游戏退出 }else if(e.getActionCommand().equals("exit")) { Record.bcjl(); System.exit(0);//游戏退出 }else if(e.getActionCommand().equals("goonGame")){ this.remove(gkmp); if(mp.flag==false)//因为在主类构造函数开始就创建了mp,所以可以引用flag变量 { this.remove(mp); mp=new MyPanel("goonGame"); } Thread t=new Thread(mp); t.start(); this.add(mp); this.addKeyListener(mp); this.setVisible(true); } } class StartPanel extends JPanel implements Runnable //开始界面类 { int time=0; public void paint(Graphics g){ super.paint(g); // g.fillRect(0, 0, 600, 500);//设置画布 g.setColor(Color.black);//设置颜色 Color mycolor1=new Color(250,50,0);//自定义红色 g.setFont(new Font("华文琥珀",Font.BOLD,80));//设置字体//? g.drawString("坦克大战",190 , 460);//绘字符串 g.setColor(Color.black);//设置颜色 g.setFont(new Font("黑体",1,14));//设置字体 g.drawString("李晋祥",648 , 552);//绘字符串 if(time%2==0) { g.setColor(Color.white);//设置颜色 g.setFont(new Font("华文行楷",3,35));//字体:华康楷体, Ravie, OCR A Extended g.drawString("准备战斗",270 , 345);//绘字符串 } } StartPanel(){ } public void run(){ while(true){ try{ Thread.sleep(400); }catch(Exception e){} time++; this.repaint(); } } } class MyPanel extends JPanel implements KeyListener,Runnable { //Vector<MyTank> mts=new Vector<MyTank>();//建立一个我的坦克集合类可以出无限个坦克 MyTank mt=null; MyTank mt0=null; MyTank mt01=null; MyTank mt02=null; Vector<DiTank> dtk=new Vector<DiTank>();//建立一个敌坦克集合类 Props props=null; Vector<Baozha> bzjh=new Vector<Baozha>();//创建一个爆炸类的集合 Vector<Weizhi> wzjh=new Vector<Weizhi>();//建立一个位置集合类,为啥建立这集合类 int tksl=3;//坦克数量 int a=122; int b=455; int n=10; int myzdNum=4;//? int propsSort=5; int time=0; boolean flag=true;//标记是不是已经创建过MyPanel类 boolean b1=false; int x=1;//总关卡数? int rocket=1;//没用? int huopao=0;//? Color mycolor1=new Color(250,50,0);//自定义红色 Color mycolor2=new Color(0,250,50);//自定义绿色 Color mycolor3=new Color(0,50,250);//自定义兰色 Color mycolor11=new Color(130,200,0);//自定义土黄 Color mycolor31=new Color(0,100,200);//自定义兰色 Color mycolor21=new Color(0,250,0);//自定义绿色 JLabel imageJLabel0=null; JLabel imageJLabel1=null; ImageIcon img0=null;//? ImageIcon img1=null;//? public MyPanel(String ss) { ImageIcon img0 = new ImageIcon("e:/Tank1/background.jpg"); JLabel imageJLabel0 = new JLabel(img0); this.add(imageJLabel0); Record.dqjl();//? mt=new MyTank(600,280);//new多个可改为多个坦克,循环数组 mt0=new MyTank(550,280);//new多个可改为多个坦克,循环数组 mt01=new MyTank(550,330);//new多个可改为多个坦克,循环数组 mt02=new MyTank(600,330);//new多个可改为多个坦克,循环数组 props=new Props(30,30);//没有实际意义,为了new对象,必须要有个参数? if(ss.equals("newGame")){ // record=new Record(); for(int i=0;i<tksl;i++){ DiTank dt=new DiTank((i)*a,b);//添加出场敌坦 // dt.dtkxl(dtk);///???是不是敌人坦克血量 dt.setFangxiang(1);//给一个初始值,调drawTank()赋初值要用 Thread t2=new Thread(dt); t2.start(); Zidan zd=new Zidan(dt.x,dt.y,1);//?这是干啥加子弹元素吗? Thread t3=new Thread(zd);//? t3.start(); dtk.add(dt); } }else if(ss.equals("goongame")){//继续游戏有问题 感觉读取存盘信息有问题 wzjh=Record.dupan(); for(int i=0;i<wzjh.size();i++){ Weizhi wz=wzjh.get(i); DiTank dt=new DiTank(wz.x,wz.y);//添加出场敌坦 dt.setFangxiang(wz.fangxiang); // dt.dtkxl(dtk);//?敌坦克血量,好像暂时用不着 // dt.setFangxiang(1);//给一个初始值,调drawTank()赋初值要用 Thread t2=new Thread(dt); t2.start(); Zidan zd=new Zidan(dt.x,dt.y,1);//?这是干啥加子弹元素吗? Thread t3=new Thread(zd);//? t3.start(); dtk.add(dt); } } flag=false;//MyPanel类的mp创建过一次就标记为假 // this.repaint(); // Record.next(); // if(Record.next()%2!=0){ // Record.reMtNum();//需要吗? // Record.reDtNum();//需要吗? // Record.reAddMtNum(); // } } public void outNum(Graphics g)//画出统计数据的方法也即使显示数量的函数 { g.setColor(Color.cyan); this.drawTank(500,150,g,0,0);//引用drawtank()的不能是g,而是this this.drawTank(570,150,g,0,1); this.drawTank(500,70,g,0,1); g.setColor(Color.black); g.setFont(new Font("仿宋",2,20));//??换换字体效果 g.drawString(Record.getDtNum()+"",600,170); if((Record.getMtNum()+Record.getAddMtNum())>=0){ g.drawString((Record.getMtNum()+Record.getAddMtNum())+"",530,170);// }else{ g.drawString((Record.getAddMtNum())+"",530,170); } g.setColor(Color.blue); g.setFont(new Font("方正小标宋",1,17)); g.drawString("干掉的坦克总数:",510,40); g.setColor(Color.black); g.setFont(new Font("仿宋",2,20)); g.drawString(Record.getSumDtNum()+"",530,90); g.setColor(Color.MAGENTA);//设置颜色 g.setFont(new Font("隶书",0,20));//设置字体 g.drawString("第"+x+"关",500 , 200);//绘字符串 } public void paint(Graphics g){//这个方法每当窗口激活,最小化,调用repaint()方法都会运行,线程中调用就一直显示 super.paint(g); // g.fillRect(0,0,400,300);//做个背景画布,默认黑色 this.outNum(g);//调用显示数量的函数 g.setColor(Color.red);//设置颜色 g.fillRect(530, 210, 30, 20); g.setColor(Color.black);//设置颜色 g.drawLine(530, 210, 530, 320); g.setColor(mycolor11);//设置颜色 if(mt.live==true){ this.drawTank(mt.getX(),mt.getY(),g,mt.fangxiang,0); } if(mt0.live==true){ this.drawTank(mt0.getX(),mt0.getY(),g,mt0.fangxiang,2); } if(mt01.live==true){ this.drawTank(mt01.getX(),mt01.getY(),g,mt01.fangxiang,2); } if(mt02.live==true){ this.drawTank(mt02.getX(),mt02.getY(),g,mt02.fangxiang,2); } if(mt.getLive()==false){ g.setColor(mycolor11);//设置颜色 g.setFont(new Font("Gill Sans Ultra Bold Condensed",1,40));//字体:华康楷体, Ravie, OCR A Extended g.drawString("game over...",200 , 220);//绘字符串 this.repaint(); } if(Record.getDtNum()%6==0&&(Record.getDtNum()>10)){ // if(time%2==0) // { g.setColor(Color.blue);//设置颜色 g.setFont(new Font("华文行楷",1,35));//字体:华康楷体, Ravie, OCR A Extended g.drawString("你行不行?",310 , 265);//绘字符串 // } } if(Record.getDtNum()==0){ g.setColor(Color.red);//设置颜色 g.setFont(new Font("华文行楷",1,35));//字体:华康楷体, Ravie, OCR A Extended g.drawString("过关!",300 , 265);//绘字符串 } for(int i=0;i<dtk.size();i++)//画敌人坦克asd { DiTank dt=dtk.get(i); if(dt.live==true){ this.drawTank(dt.getX(),dt.getY(),g,dt.fangxiang,1);//??!!注意用法用dtk 还是dt调用 } } for(int i=0;i<mt.aa.size();i++)//画我的子弹 { Zidan zd=mt.aa.get(i); if(mt.zd!=null&&mt.zd.live==true) //???画子弹的条件 { //g.fill3DRect((mt.zd.x-2),(mt.zd.y-2), 8, 8, false); //???画子弹火力圈 g.setColor(Color.black);//子弹颜色设置为白色 g.fillOval(zd.x+1,zd.y+1, 4,4); } if(zd.live==false) { mt.aa.remove(zd); } } //this.repaint();//? for(int i=0;i<dtk.size();i++)//画敌人的子弹 { DiTank dt=dtk.get(i); for(int j=0;j<dt.dzd.size();j++) { Zidan zd=dt.dzd.get(j); if(zd!=null&&dtk.get(i).live==true) { g.setColor(Color.red);//子弹颜色设置为红色,次处不进循环是不是更好? g.fillOval(zd.x+1,zd.y+1, 4,4); } if(zd.live==false)//删除生命为假的敌人子弹???? { dt.dzd.remove(zd); } } } for(int i=0;i<bzjh.size();i++) //画爆炸 { Baozha bz=bzjh.get(i); if(bzjh.get(i).livetime>140){ g.setColor(Color.red); g.fillOval(bz.x, bz.y+5, 20,20 );//代替上面的句子 //g.fillOval(bz.x, bz.y, 20,5 );//可以用来做合成图形,但是要定好坐标点 }else if((bzjh.get(i).livetime<=100)&&(bzjh.get(i).livetime>50)){ g.setColor(Color.orange); g.fillOval(bz.x+4, bz.y+9, 12,12 ); }else if((bzjh.get(i).livetime<=50)&&(bzjh.get(i).livetime>20)){ g.setColor(Color.yellow); g.fillOval(bz.x+7, bz.y+11,5,5 ); }else{ g.setColor(Color.pink); g.fillOval(bz.x+10, bz.y+13,2,2 ); } bz.ltjs(); //生存时间减少函数 if(bz.livetime==0){ bzjh.remove(bz); } } // if(props.live==true){//画道具 this.drawProps(props.getX(),props.getY(),g,props.getleixing()); } //} this.repaint();//教学视频少了这句,子弹无法自主运行,主类启动线程后仍然可动 } public void keyPressed(KeyEvent e)//键盘输入事件 { if(mt.getLive()==true){ if(e.getKeyCode()==KeyEvent.VK_W){ this.mt.setFangxiang(0); this.mt.xiangshang(); }else if(e.getKeyCode()==KeyEvent.VK_S){ this.mt.setFangxiang(1); this.mt.xiangxia(); }else if(e.getKeyCode()==KeyEvent.VK_A){ this.mt.setFangxiang(2); this.mt.xiangzuo(); }else if(e.getKeyCode()==KeyEvent.VK_D){ this.mt.setFangxiang(3); this.mt.xiangyou(); } if(e.getKeyCode()==KeyEvent.VK_J) { if((mt.aa.size()<myzdNum)&&(mt.live==true))//子弹设置最多 myzdNum 发 { this.mt.fszd();//调用发射子弹函数 } } } } public void crash(){ } public boolean addprops(Props props,MyTank mt)//吃道具触发 方法 (道具功能触发模型为边长20的正方形) { boolean b2=false; switch(props.leixing){ case 0://我的坦克速度提高//mt.fangxiang 0\1\2\3 if((mt.getX()+10>props.getX()&&mt.getX()+10<props.getX()+20&&mt.getY()+15<props.getY()+20&&mt.getY()+15>props.getY())||(mt.getX()+10>props.getX()&&mt.getX()+10<props.getX()+20&&mt.getY()+15>props.getY()&&mt.getY()+15<props.getY()+20)||(mt.getX()+10>props.getX()&&mt.getX()+10<props.getX()+20&&mt.getY()+15>props.getY()&&mt.getY()+15<props.getY()+20)||(mt.getX()+15>props.getX()&&mt.getX()+15<props.getX()+20&&mt.getY()+10>props.getY()&&mt.getY()+10<props.getY()+20)){ props.live=false; mt.sudu=20; b2=true; } break; case 1://效果回到出生地 if((mt.getX()+10>props.getX()&&mt.getX()+10<props.getX()+20&&mt.getY()+15<props.getY()+20&&mt.getY()+15>props.getY())||(mt.getX()+10>props.getX()&&mt.getX()+10<props.getX()+20&&mt.getY()+15>props.getY()&&mt.getY()+15<props.getY()+20)||(mt.getX()+10>props.getX()&&mt.getX()+10<props.getX()+20&&mt.getY()+15>props.getY()&&mt.getY()+15<props.getY()+20)||(mt.getX()+15>props.getX()&&mt.getX()+15<props.getX()+20&&mt.getY()+10>props.getY()&&mt.getY()+10<props.getY()+20)){ props.live=false; mt.setX(630); mt.setY(280); b2=true; } break; case 2://提高我可以发射的子弹数目 //mt.fangxiang 0\1\2\3 if((mt.getX()+10>props.getX()&&mt.getX()+10<props.getX()+20&&mt.getY()+15<props.getY()+20&&mt.getY()+15>props.getY())||(mt.getX()+10>props.getX()&&mt.getX()+10<props.getX()+20&&mt.getY()+15>props.getY()&&mt.getY()+15<props.getY()+20)||(mt.getX()+10>props.getX()&&mt.getX()+10<props.getX()+20&&mt.getY()+15>props.getY()&&mt.getY()+15<props.getY()+20)||(mt.getX()+15>props.getX()&&mt.getX()+15<props.getX()+20&&mt.getY()+10>props.getY()&&mt.getY()+10<props.getY()+20)){ props.live=false; this.myzdNum=30; this.huopao=1; this.n=4; b2=true; } break; case 3://显示的敌人坦克全死,但实际效果是..是不出敌方坦克了!!!! if((mt.getX()+10>props.getX()&&mt.getX()+10<props.getX()+20&&mt.getY()+15<props.getY()+20&&mt.getY()+15>props.getY())||(mt.getX()+10>props.getX()&&mt.getX()+10<props.getX()+20&&mt.getY()+15>props.getY()&&mt.getY()+15<props.getY()+20)||(mt.getX()+10>props.getX()&&mt.getX()+10<props.getX()+20&&mt.getY()+15>props.getY()&&mt.getY()+15<props.getY()+20)||(mt.getX()+15>props.getX()&&mt.getX()+15<props.getX()+20&&mt.getY()+10>props.getY()&&mt.getY()+10<props.getY()+20)){ props.live=false; for(int i=0;i<dtk.size();i++){ if(dtk.get(i).live==true){ dtk.get(i).live=false; Record.setDtNum();//有几个活坦克生命变假,就累计几辆dtNum } } b1=true; b2=true; } break; case 4://吃道具加命 if((mt.getX()+10>props.getX()&&mt.getX()+10<props.getX()+20&&mt.getY()+15<props.getY()+20&&mt.getY()+15>props.getY())||(mt.getX()+10>props.getX()&&mt.getX()+10<props.getX()+20&&mt.getY()+15>props.getY()&&mt.getY()+15<props.getY()+20)||(mt.getX()+10>props.getX()&&mt.getX()+10<props.getX()+20&&mt.getY()+15>props.getY()&&mt.getY()+15<props.getY()+20)||(mt.getX()+15>props.getX()&&mt.getX()+15<props.getX()+20&&mt.getY()+10>props.getY()&&mt.getY()+10<props.getY()+20)){ props.live=false; Record.setAddMtNum(); b2=true; // System.out.println("吃道具加命程序,正常运行"); } break; } return b2; } // addMyTank++; //MyTank mt1=new MyTank(mt.getX(),mt.getY());//??创建另一个MyTank对象 // public void setAddMytank(){ // addMyTank++; // }; // public static int getAddMytank(){ // return addMyTank; // }; public void run() //我的画板的 线程函数 { while(true){ try{ Thread.sleep(50);// }catch(Exception e){} for(int i=0;i<mt.aa.size();i++)//我的子弹集中敌坦克的线程 { Zidan myzd=mt.aa.get(i); if(myzd.live){ for(int j=0;j<dtk.size();j++){ DiTank dt=dtk.get(j); // Zidan zd=dt.dzd.get(j);//为啥dzd可以直接用,不用创建// ||(b1==true&&Record.getDtNum()>0) if(dt.live)//内关联敌人坦克重生的一种情况,有敌人坦克被打中 { if(this.jzsf(myzd,dt)&&((Record.getDtNum()-tksl)>=0)){//调用jzsf(),打中同时,坦克定点?及时重生 DiTank dt0=new DiTank((int)(Math.random()*50+5)*10,(int)(Math.random()*100+450)); Thread t2=new Thread(dt0); t2.start(); Zidan zd0=new Zidan(dt0.x,dt0.y,dt0.fangxiang); Thread t3=new Thread(zd0); t3.start(); dt0.dzd.add(zd0); dtk.add(dt0); } } } } } if(Record.getDtNum()>=tksl&&b1==true){ //炸弹爆炸,敌坦克按条件重生, for(int i=0;i<tksl;i++){ DiTank dt1=new DiTank((int)(Math.random()*20)*10,(int)(Math.random()*100+450)); Thread t6=new Thread(dt1); t6.start(); Zidan zd1=new Zidan(dt1.x,dt1.y,dt1.fangxiang); Thread t7=new Thread(zd1); t7.start(); dt1.dzd.add(zd1); dtk.add(dt1); } b1=false; } if((Record.getDtNum()==(tksl-1))&&(b1==true)){ for(int i=0;i<tksl-1;i++){ DiTank dt1=new DiTank((int)(Math.random()*20)*10,(int)(Math.random()*100+450)); Thread t6=new Thread(dt1); t6.start(); Zidan zd1=new Zidan(dt1.x,dt1.y,dt1.fangxiang); Thread t7=new Thread(zd1); t7.start(); dt1.dzd.add(zd1); dtk.add(dt1); } b1=false; } if((Record.getDtNum()==(tksl-2))&&(b1==true)){ // for(int i=0;i<tksl-1;i++){ DiTank dt1=new DiTank((int)(Math.random()*20)*10,(int)(Math.random()*100+450)); Thread t6=new Thread(dt1); t6.start(); Zidan zd1=new Zidan(dt1.x,dt1.y,dt1.fangxiang); Thread t7=new Thread(zd1); t7.start(); dt1.dzd.add(zd1); dtk.add(dt1); b1=false; } for(int j=0;j<dtk.size();j++)//敌人的子弹击中我的坦克的线程 { DiTank dt=dtk.get(j);//取出所有敌方坦克 for(int i=0;i<dt.dzd.size();i++) { Zidan zd=dt.dzd.get(i);//? if(zd.live) { if(this.jzsf(zd,mt)==true){//调用 击中敌坦 函数 } } } } if((this.time%120)==0){//6秒发生1次 道具随机重置//draw mt hit props props.live=true; // props.leixing=2; props.leixing=(int)(Math.random()*propsSort); props.x=(int)(Math.random()*370); props.y=(int)(Math.random()*270); props.livetime=100;//道具生存期 } if(props.livetime>0){//道具生存期变化 props.livetime--; }else{ props.live=false; } if(mt.live==true&&props.live==true){//调用 吃道具 方法 this.addprops(props,mt); } time++; // if(SaveData.getSumDtNum()%20==0){ // Record.next(); // } this.repaint();//线程运行中重绘?? } } public void jzwf()//敌人子弹集中我方坦克的方法 { for(int i=0;i<this.dtk.size();i++){ DiTank dt=dtk.get(i); for(int j=0;j<dt.dzd.size();j++){ Zidan zd=dt.dzd.get(j); this.jzsf(zd, mt); } } } public void jzdf() //我的子弹击中坦克的方法 { for(int i=0;i<mt.aa.size();i++){ Zidan zd=mt.aa.get(i);//从我的子弹集合类取我的各个子弹 if(zd.live==true){ for(int j=0;j<dtk.size();j++){ DiTank dt=dtk.get(j);//从敌坦克集合类取出各个敌坦克 if(dt.live){ this.jzsf(zd,dt); // levelDtNum--; } } } this.repaint(); } } public boolean jzsf(Zidan zd,Tank tk)//击中双方的方法 { boolean b2=false; switch(tk.fangxiang) { case 0: case 1: if(zd.x>tk.x&&zd.x<tk.x+20&&zd.y>tk.y&&zd.y<tk.y+30)//分辨率判断? { if(tk instanceof DiTank){//只改这就实现 判断tk是不是DiTank的实例 Record.setDtNum(); Record.setSumDtNum(); // Record.setAddMtNum(); tk.live=false; b2=true; }else{ // System.out.println("Record.getMtNum()="+Record.getMtNum()); Record.setMtNum();//Record.getSumMtNum()一直小于0 ?bug if(Record.getMtNum()+1<=0){ Record.lowAddMtNum(); } // System.out.println("Record.getMtNum()="+Record.getMtNum()); // System.out.println("Record.AddMtNum()="+Record.getAddMtNum()); if(Record.getMtNum()+Record.getAddMtNum()>0){//bug 被打一下就游戏结束 已经解决 mt.setX(140); mt.setY(232); } if(Record.getMtNum()+Record.getAddMtNum()<=0){ tk.live=false; } } zd.live=false; Baozha bz=new Baozha(tk.x,tk.y); bzjh.add(bz); } break; case 2: case 3: if(zd.x>tk.x&&zd.x<tk.x+30&&zd.y>tk.y&&zd.y<tk.y+20){ if(tk instanceof DiTank){//只改这就实现 判断tk是不是DiTank的实例 Record.setDtNum();//每次敌人坦克数量-1 Record.setSumDtNum(); // Record.setAddMtNum(); tk.live=false; b2=true; }else{ // System.out.println("Record.getMtNum()="+Record.getMtNum()); Record.setMtNum();//Record.getSumMtNum()一直小于0 ?bug if(Record.getMtNum()+1<=0){ Record.lowAddMtNum(); } // System.out.println("Record.getMtNum()="+Record.getMtNum()); // System.out.println("Record.AddMtNum()="+Record.getAddMtNum()); if(Record.getMtNum()+Record.getAddMtNum()>0){//bug 被打一下就游戏结束 已经解决 mt.setX(550); mt.setY(270); } if(Record.getMtNum()+Record.getAddMtNum()<=0){ tk.live=false; } } zd.live=false; Baozha bz=new Baozha(tk.x,tk.y); bzjh.add(bz); } break; } return b2; } public void keyTyped(KeyEvent e){} public void keyReleased(KeyEvent e){} public void drawTank(int x,int y,Graphics g,int fangxiang,int leixing)//画坦克函数 { int m=10; //double n=1; switch(leixing)//不同阵营坦克 { case 0://我的坦克 g.setColor(Color.yellow);// 我的坦克颜色 黄色 // g.fillOval(170*huopao, 240*huopao, 30*huopao, 30*huopao); m=11; break; case 1://敌人的坦克 g.setColor(mycolor3);//敌人坦克颜色 蓝色 // m=15; break; case 2://玩家2的坦克 g.setColor(mycolor1);//敌人坦克颜色 绿色 break; } switch(fangxiang)//不同方向的坦克(0,1,2,3)分别代表上下左右,中心原点不变做坐标变换 { case 0://上 g.fill3DRect(x,y,5,30,true); g.fill3DRect(x+15,y,5,30,true); g.fill3DRect(x+5,y+5,10,20,true); g.drawLine(x+10,y-5,x+10,(y+10)); g.setColor(Color.black); g.fillOval(x+5,y+10,10,10); break; case 1://下 g.fill3DRect(x,y,5,30,true); g.fill3DRect(x+15,y,5,30,true); g.fill3DRect(x+5,y+5,10,20,true); g.drawLine(x+10,y+10,x+10,(y+35)); g.setColor(Color.black); g.fillOval(x+5,y+10,10,10); break; case 2://左 g.fill3DRect(x-5,y+5,30,5,true); g.fill3DRect(x-5,y+20,30,5,true); g.fill3DRect(x,y+10,20,10,true); g.drawLine((x-10)+n-m,y+15,(x+10),(y+15)); g.setColor(Color.black); g.fillOval(x+5,y+10,10,10); break; case 3://右 g.fill3DRect(x-5,y+5,30,5,true); g.fill3DRect(x-5,y+20,30,5,true); g.fill3DRect(x,y+10,20,10,true); g.drawLine((x+10)-n+m,y+15,(x+30),(y+15)); g.setColor(Color.black); g.fillOval(x+5,y+10,10,10); break; } } public void drawProps(int x,int y,Graphics g,int leixing)//画道具 { if(time%8==0){ switch(leixing) { case 0://画车轮对应坦克加速 g.setColor(Color.white); g.fillOval(x, y, 21, 21); g.setColor(Color.black); g.fillOval(x+2,y+2,16,16); g.setColor(Color.white); g.drawOval(x+2,y+2,16,16); g.drawLine(x+2,y+10,x+18,y+10); g.drawLine(x+10,y+2,x+10,y+18); g.drawLine(x+16,y+4,x+4,y+16); g.drawLine(x+4,y+4,x+16,y+16); break; case 1://画回出生地道具图标 g.setColor(Color.white); g.drawRoundRect(x, y, 20, 20, 5, 5); g.setColor(mycolor3); g.fillRoundRect(x+5, y+5, 10, 10, 5, 5); break; case 2://画增加子弹数目道具//? g.setColor(mycolor2); g.fill3DRect(x-15,y+8,30,5,false); g.fill3DRect(x-15,y+6,10,10,true); g.fillOval(x+15,y+7,7,7); break; case 3://画炸弹 g.setColor(mycolor2); g.fillRect(x, y, 21, 21); g.setColor(Color.black); g.fillRect(x+8,y+6,6,2); g.fillOval(x+3,y+7,14,14); g.drawLine(x+11, y+3, x+11, y+6); g.setColor(Color.white); g.drawLine(x+11, y+15, x+8, y+14); break; case 4://画小坦克道具 g.setColor(Color.yellow); g.fill3DRect(x,y,20,3,true); g.fill3DRect(x,y+10,20,3,true); g.fill3DRect(x+3,y+3,14,7,false); g.fillOval(x+6,y+3,7,7); g.drawLine(x-7,y+6,x+7,y+6); break; } } } } }
怎么实现java计算器的退格功能和清除当前操作功能
# (在网上找的代码来学的所以搞不懂逻辑)代码如下: public class A3{ // 操作数1,为了程序的安全,初值一定设置,这里我们设置为0。 String str1 = "0"; // 操作数2 String str2 = "0"; // 运算符 String signal = "+"; // 运算结果 String result = "0"; // 以下k1至k2为状态开关 // 开关1用于选择输入方向,将要写入str1或str2 int k1 = 1; // 开关2用于记录符号键的次数,如果 k2>1 说明进行的是 2+3-9+8 这样的多符号运算 int k2 = 1; // 开关3用于标识 str1 是否可以被清0 ,等于1时可以,不等于1时不能被清0 int k3 = 1; // 开关4用于标识 str2 是否可以被清0,等于1时可以,不等于1时不能被清0 int k4 = 1; // 开关5用于控制小数点可否被录入,等于1时可以,不为1时,输入的小数点被丢掉 int k5 = 1; // store的作用类似于寄存器,用于记录是否连续按下符号键 JButton store; @SuppressWarnings("rawtypes") Vector vt = new Vector(20, 10); // 声明各个UI组件对象并初始化 JFrame frame = new JFrame("计算器"); JTextField result_TextField = new JTextField(result, 10); JButton clear_Button = new JButton("CE"); JButton clear_C = new JButton("C"); JButton button_tuige = new JButton("<-"); JButton button0 = new JButton("0"); JButton button1 = new JButton("1"); JButton button2 = new JButton("2"); JButton button3 = new JButton("3"); JButton button4 = new JButton("4"); JButton button5 = new JButton("5"); JButton button6 = new JButton("6"); JButton button7 = new JButton("7"); JButton button8 = new JButton("8"); JButton button9 = new JButton("9"); JButton button_Dian = new JButton("."); JButton button_jia = new JButton("+"); JButton button_jian = new JButton("-"); JButton button_cheng = new JButton("*"); JButton button_chu = new JButton("/"); JButton button_dy = new JButton("="); // 计算机类的构造器 public A3() { //设置文本框背景颜色为浅灰色 result_TextField.setBackground(Color.LIGHT_GRAY); //设置文本框字体样式和大小 result_TextField.setFont(new Font("宋体",Font.BOLD,50)); //设置文本框为不可编辑状态 result_TextField.setEditable(false); // 设置文本框为右对齐,使输入和结果都靠右显示 result_TextField.setHorizontalAlignment(JTextField.RIGHT); // 将UI组件添加进容器内 JPanel pan = new JPanel(); pan.setLayout(new GridLayout(4, 4, 5, 5)); pan.add(button7); pan.add(button8); pan.add(button9); pan.add(button_chu); pan.add(button4); pan.add(button5); pan.add(button6); pan.add(button_cheng); pan.add(button1); pan.add(button2); pan.add(button3); pan.add(button_jian); pan.add(button0); pan.add(button_Dian); pan.add(button_dy); pan.add(button_jia); pan.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5)); JPanel pan2 = new JPanel(); pan2.setLayout(new GridLayout(1,4,5,5)); pan2.add(result_TextField); JPanel pan3 = new JPanel(); pan3.setLayout(new GridLayout(1,3,5,5)); pan3.add(button_tuige); pan3.add(clear_C); pan3.add(clear_Button); // 设置主窗口出现在屏幕上的位置 frame.setLocation(300, 200); // 设置窗体不能调大小 frame.setResizable(false); frame.getContentPane().setLayout(new BorderLayout()); frame.getContentPane().add(pan2, BorderLayout.NORTH); frame.getContentPane().add(pan3, BorderLayout.CENTER); frame.getContentPane().add(pan, BorderLayout.SOUTH); frame.pack(); frame.setVisible(true); // 事件处理程序 // 数字键 class Listener implements ActionListener { @SuppressWarnings("unchecked") public void actionPerformed(ActionEvent e) { String ss = ((JButton) e.getSource()).getText();//获取按钮文本属性 store = (JButton) e.getSource(); vt.add(store); if (k1 == 1) { if (k3 == 1) { str1 = ""; // 还原开关k5状态 k5 = 1; } str1 = str1 + ss; k3 = k3 + 1; // 显示结果 result_TextField.setText(str1); } else if (k1 == 2) { if (k4 == 1) { str2 = ""; // 还原开关k5状态 k5 = 1; } str2 = str2 + ss; k4 = k4 + 1; result_TextField.setText(str2); } } } // 输入的运算符号的处理 class Listener_signal implements ActionListener { @SuppressWarnings("unchecked") public void actionPerformed(ActionEvent e) { String ss2 = ((JButton) e.getSource()).getText(); store = (JButton) e.getSource(); vt.add(store); if (k2 == 1) { // 开关 k1 为 1 时向数 1 写输入值,为2时向数2写输入值。 k1 = 2; k5 = 1; signal = ss2; k2 = k2 + 1;// 按符号键的次数 } else { int a = vt.size(); JButton c = (JButton) vt.get(a - 2); if (!(c.getText().equals("+")) && !(c.getText().equals("-")) && !(c.getText().equals("*")) && !(c.getText().equals("/"))) { cal(); str1 = result; // 开关 k1 为 1 时,向数 1 写值,为2时向数2写 k1 = 2; k5 = 1; k4 = 1; signal = ss2; } k2 = k2 + 1; } } } // 清除键的逻辑(CE) class Listener_clear implements ActionListener { @SuppressWarnings("unchecked") public void actionPerformed(ActionEvent e) { store = (JButton) e.getSource(); vt.add(store); k5 = 1; k2 = 1; k1 = 1; k3 = 1; k4 = 1; str1 = "0"; str2 = "0"; signal = ""; result = ""; result_TextField.setText(result); vt.clear(); } } // 归零键的逻辑(C)就是清除前一次按钮的操作 class clear_C implements ActionListener { @SuppressWarnings("unchecked") public void actionPerformed(ActionEvent e) { } } // 退格键的逻辑(<-) class button_tuige implements ActionListener { @SuppressWarnings("unchecked") public void actionPerformed(ActionEvent e) { vt.add(store); } } // 等于键的逻辑 class Listener_dy implements ActionListener { @SuppressWarnings("unchecked") public void actionPerformed(ActionEvent e) { store = (JButton) e.getSource(); vt.add(store); cal(); // 还原各个开关的状态 k1 = 1; k2 = 1; k3 = 1; k4 = 1; str1 = result; } } // 小数点的处理 class Listener_xiaos implements ActionListener { @SuppressWarnings("unchecked") public void actionPerformed(ActionEvent e) { store = (JButton) e.getSource(); vt.add(store); if (k5 == 1) { String ss2 = ((JButton) e.getSource()).getText(); if (k1 == 1) { if (k3 == 1) { str1 = ""; // 还原开关k5状态 k5 = 1; } str1 = str1 + ss2; k3 = k3 + 1; // 显示结果 result_TextField.setText(str1); } else if (k1 == 2) { if (k4 == 1) { str2 = ""; // 还原开关k5的状态 k5 = 1; } str2 = str2 + ss2; k4 = k4 + 1; result_TextField.setText(str2); } } k5 = k5 + 1; } } // 注册各个监听器,即绑定事件响应逻辑到各个UI组件上 Listener_dy jt_dy = new Listener_dy(); // 监听退格键 Listener tg = new Listener(); // 监听归零键 Listener gl = new Listener(); // 监听数字键 Listener jt = new Listener(); // 监听符号键 Listener_signal jt_signal = new Listener_signal(); // 监听清除键 Listener_clear jt_c = new Listener_clear(); // 监听小数点键 Listener_xiaos jt_xs = new Listener_xiaos(); button_tuige.addActionListener(tg); clear_C.addActionListener(gl); button7.addActionListener(jt); button8.addActionListener(jt); button9.addActionListener(jt); button_chu.addActionListener(jt_signal); button4.addActionListener(jt); button5.addActionListener(jt); button6.addActionListener(jt); button_cheng.addActionListener(jt_signal); button1.addActionListener(jt); button2.addActionListener(jt); button3.addActionListener(jt); button_jian.addActionListener(jt_signal); button0.addActionListener(jt); button_Dian.addActionListener(jt_xs); button_dy.addActionListener(jt_dy); button_jia.addActionListener(jt_signal); clear_Button.addActionListener(jt_c); // 窗体关闭事件的响应程序 frame.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } }); }
Java学习的正确打开方式
在博主认为,对于入门级学习java的最佳学习方法莫过于视频+博客+书籍+总结,前三者博主将淋漓尽致地挥毫于这篇博客文章中,至于总结在于个人,实际上越到后面你会发现学习的最好方式就是阅读参考官方文档其次就是国内的书籍,博客次之,这又是一个层次了,这里暂时不提后面再谈。博主将为各位入门java保驾护航,各位只管冲鸭!!!上天是公平的,只要不辜负时间,时间自然不会辜负你。 何谓学习?博主所理解的学习,它是一个过程,是一个不断累积、不断沉淀、不断总结、善于传达自己的个人见解以及乐于分享的过程。
程序员必须掌握的核心算法有哪些?
由于我之前一直强调数据结构以及算法学习的重要性,所以就有一些读者经常问我,数据结构与算法应该要学习到哪个程度呢?,说实话,这个问题我不知道要怎么回答你,主要取决于你想学习到哪些程度,不过针对这个问题,我稍微总结一下我学过的算法知识点,以及我觉得值得学习的算法。这些算法与数据结构的学习大多数是零散的,并没有一本把他们全部覆盖的书籍。下面是我觉得值得学习的一些算法以及数据结构,当然,我也会整理一些看过...
前端 | 2. 正则
转载请注明以下: 本文转自清自以敬的博客:https://blog.csdn.net/qq_45791147 文章目录1.转义2.正则表达式初步2.1.匹配字符2.1.1.组成元素2.1.2.基础正则的设计 1.转义 转义的作用: 当某个字符在表达式中具有特殊含义,例如字符串引号中出现了引号,为了可以使用这些字符本身,而不是使用其在表达式中的特殊含义,则需要通过转义符“\”来构建该字符转义...
有哪些让程序员受益终生的建议
从业五年多,辗转两个大厂,出过书,创过业,从技术小白成长为基层管理,联合几个业内大牛回答下这个问题,希望能帮到大家,记得帮我点赞哦。 敲黑板!!!读了这篇文章,你将知道如何才能进大厂,如何实现财务自由,如何在工作中游刃有余,这篇文章很长,但绝对是精品,记得帮我点赞哦!!!! 一腔肺腑之言,能看进去多少,就看你自己了!!! 目录: 在校生篇: 为什么要尽量进大厂? 如何选择语言及方...
大学四年自学走来,这些私藏的实用工具/学习网站我贡献出来了
大学四年,看课本是不可能一直看课本的了,对于学习,特别是自学,善于搜索网上的一些资源来辅助,还是非常有必要的,下面我就把这几年私藏的各种资源,网站贡献出来给你们。主要有:电子书搜索、实用工具、在线视频学习网站、非视频学习网站、软件下载、面试/求职必备网站。 注意:文中提到的所有资源,文末我都给你整理好了,你们只管拿去,如果觉得不错,转发、分享就是最大的支持了。 一、电子书搜索 对于大部分程序员...
linux系列之常用运维命令整理笔录
本博客记录工作中需要的linux运维命令,大学时候开始接触linux,会一些基本操作,可是都没有整理起来,加上是做开发,不做运维,有些命令忘记了,所以现在整理成博客,当然vi,文件操作等就不介绍了,慢慢积累一些其它拓展的命令,博客不定时更新 free -m 其中:m表示兆,也可以用g,注意都要小写 Men:表示物理内存统计 total:表示物理内存总数(total=used+free) use...
比特币原理详解
一、什么是比特币 比特币是一种电子货币,是一种基于密码学的货币,在2008年11月1日由中本聪发表比特币白皮书,文中提出了一种去中心化的电子记账系统,我们平时的电子现金是银行来记账,因为银行的背后是国家信用。去中心化电子记账系统是参与者共同记账。比特币可以防止主权危机、信用风险。其好处不多做赘述,这一层面介绍的文章很多,本文主要从更深层的技术原理角度进行介绍。 二、问题引入 假设现有4个人...
程序员接私活怎样防止做完了不给钱?
首先跟大家说明一点,我们做 IT 类的外包开发,是非标品开发,所以很有可能在开发过程中会有这样那样的需求修改,而这种需求修改很容易造成扯皮,进而影响到费用支付,甚至出现做完了项目收不到钱的情况。 那么,怎么保证自己的薪酬安全呢? 我们在开工前,一定要做好一些证据方面的准备(也就是“讨薪”的理论依据),这其中最重要的就是需求文档和验收标准。一定要让需求方提供这两个文档资料作为开发的基础。之后开发...
网页实现一个简单的音乐播放器(大佬别看。(⊙﹏⊙))
今天闲着无事,就想写点东西。然后听了下歌,就打算写个播放器。 于是乎用h5 audio的加上js简单的播放器完工了。 演示地点演示 html代码如下` music 这个年纪 七月的风 音乐 ` 然后就是css`*{ margin: 0; padding: 0; text-decoration: none; list-...
Python十大装B语法
Python 是一种代表简单思想的语言,其语法相对简单,很容易上手。不过,如果就此小视 Python 语法的精妙和深邃,那就大错特错了。本文精心筛选了最能展现 Python 语法之精妙的十个知识点,并附上详细的实例代码。如能在实战中融会贯通、灵活使用,必将使代码更为精炼、高效,同时也会极大提升代码B格,使之看上去更老练,读起来更优雅。
数据库优化 - SQL优化
以实际SQL入手,带你一步一步走上SQL优化之路!
2019年11月中国大陆编程语言排行榜
2019年11月2日,我统计了某招聘网站,获得有效程序员招聘数据9万条。针对招聘信息,提取编程语言关键字,并统计如下: 编程语言比例 rank pl_ percentage 1 java 33.62% 2 cpp 16.42% 3 c_sharp 12.82% 4 javascript 12.31% 5 python 7.93% 6 go 7.25% 7 p...
通俗易懂地给女朋友讲:线程池的内部原理
餐盘在灯光的照耀下格外晶莹洁白,女朋友拿起红酒杯轻轻地抿了一小口,对我说:“经常听你说线程池,到底线程池到底是个什么原理?”
《奇巧淫技》系列-python!!每天早上八点自动发送天气预报邮件到QQ邮箱
将代码部署服务器,每日早上定时获取到天气数据,并发送到邮箱。 也可以说是一个小型人工智障。 知识可以运用在不同地方,不一定非是天气预报。
经典算法(5)杨辉三角
杨辉三角 是经典算法,这篇博客对它的算法思想进行了讲解,并有完整的代码实现。
腾讯算法面试题:64匹马8个跑道需要多少轮才能选出最快的四匹?
昨天,有网友私信我,说去阿里面试,彻底的被打击到了。问了为什么网上大量使用ThreadLocal的源码都会加上private static?他被难住了,因为他从来都没有考虑过这个问题。无独有偶,今天笔者又发现有网友吐槽了一道腾讯的面试题,我们一起来看看。 腾讯算法面试题:64匹马8个跑道需要多少轮才能选出最快的四匹? 在互联网职场论坛,一名程序员发帖求助到。二面腾讯,其中一个算法题:64匹...
面试官:你连RESTful都不知道我怎么敢要你?
干货,2019 RESTful最贱实践
Docker 从入门到掉坑
Docker 介绍 简单的对docker进行介绍,可以把它理解为一个应用程序执行的容器。但是docker本身和虚拟机还是有较为明显的出入的。我大致归纳了一下,可以总结为以下几点: docker自身也有着很多的优点,关于它的优点,可以总结为以下几项: 安装docker 从 2017 年 3 月开始 docker 在原来的基础上分为两个分支版本: Docker CE 和 Doc...
为啥国人偏爱Mybatis,而老外喜欢Hibernate/JPA呢?
关于SQL和ORM的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行了一番讨论,感触还是有一些,于是就有了今天这篇文。 声明:本文不会下关于Mybatis和JPA两个持久层框架哪个更好这样的结论。只是摆事实,讲道理,所以,请各位看官勿喷。 一、事件起因 关于Mybatis和JPA孰优孰劣的问题,争论已经很多年了。一直也没有结论,毕竟每个人的喜好和习惯是大不相同的。我也看...
白话阿里巴巴Java开发手册高级篇
不久前,阿里巴巴发布了《阿里巴巴Java开发手册》,总结了阿里巴巴内部实际项目开发过程中开发人员应该遵守的研发流程规范,这些流程规范在一定程度上能够保证最终的项目交付质量,通过在时间中总结模式,并推广给广大开发人员,来避免研发人员在实践中容易犯的错误,确保最终在大规模协作的项目中达成既定目标。 无独有偶,笔者去年在公司里负责升级和制定研发流程、设计模板、设计标准、代码标准等规范,并在实际工作中进行...
SQL-小白最佳入门sql查询一
不要偷偷的查询我的个人资料,即使你再喜欢我,也不要这样,真的不好;
项目中的if else太多了,该怎么重构?
介绍 最近跟着公司的大佬开发了一款IM系统,类似QQ和微信哈,就是聊天软件。我们有一部分业务逻辑是这样的 if (msgType = "文本") { // dosomething } else if(msgType = "图片") { // doshomething } else if(msgType = "视频") { // doshomething } else { // doshom...
Nginx 原理和架构
Nginx 是一个免费的,开源的,高性能的 HTTP 服务器和反向代理,以及 IMAP / POP3 代理服务器。Nginx 以其高性能,稳定性,丰富的功能,简单的配置和低资源消耗而闻名。 Nginx 的整体架构 Nginx 里有一个 master 进程和多个 worker 进程。master 进程并不处理网络请求,主要负责调度工作进程:加载配置、启动工作进程及非停升级。worker 进程负责处...
Python 编程开发 实用经验和技巧
Python是一门很灵活的语言,也有很多实用的方法,有时候实现一个功能可以用多种方法实现,我这里总结了一些常用的方法和技巧,包括小数保留指定位小数、判断变量的数据类型、类方法@classmethod、制表符中文对齐、遍历字典、datetime.timedelta的使用等,会持续更新......
YouTube排名第一的励志英文演讲《Dream(梦想)》
Idon’t know what that dream is that you have, I don't care how disappointing it might have been as you've been working toward that dream,but that dream that you’re holding in your mind, that it’s po...
“狗屁不通文章生成器”登顶GitHub热榜,分分钟写出万字形式主义大作
一、垃圾文字生成器介绍 最近在浏览GitHub的时候,发现了这样一个骨骼清奇的雷人项目,而且热度还特别高。 项目中文名:狗屁不通文章生成器 项目英文名:BullshitGenerator 根据作者的介绍,他是偶尔需要一些中文文字用于GUI开发时测试文本渲染,因此开发了这个废话生成器。但由于生成的废话实在是太过富于哲理,所以最近已经被小伙伴们给玩坏了。 他的文风可能是这样的: 你发现,...
程序员:我终于知道post和get的区别
是一个老生常谈的话题,然而随着不断的学习,对于以前的认识有很多误区,所以还是需要不断地总结的,学而时习之,不亦说乎
《程序人生》系列-这个程序员只用了20行代码就拿了冠军
你知道的越多,你不知道的越多 点赞再看,养成习惯GitHub上已经开源https://github.com/JavaFamily,有一线大厂面试点脑图,欢迎Star和完善 前言 这一期不算《吊打面试官》系列的,所有没前言我直接开始。 絮叨 本来应该是没有这期的,看过我上期的小伙伴应该是知道的嘛,双十一比较忙嘛,要值班又要去帮忙拍摄年会的视频素材,还得搞个程序员一天的Vlog,还要写BU...
程序员把地府后台管理系统做出来了,还有3.0版本!12月7号最新消息:已在开发中有github地址
第一幕:缘起 听说阎王爷要做个生死簿后台管理系统,我们派去了一个程序员…… 996程序员做的梦: 第一场:团队招募 为了应对地府管理危机,阎王打算找“人”开发一套地府后台管理系统,于是就在地府总经办群中发了项目需求。 话说还是中国电信的信号好,地府都是满格,哈哈!!! 经常会有外行朋友问:看某网站做的不错,功能也简单,你帮忙做一下? 而这次,面对这样的需求,这个程序员...
网易云6亿用户音乐推荐算法
网易云音乐是音乐爱好者的集聚地,云音乐推荐系统致力于通过 AI 算法的落地,实现用户千人千面的个性化推荐,为用户带来不一样的听歌体验。 本次分享重点介绍 AI 算法在音乐推荐中的应用实践,以及在算法落地过程中遇到的挑战和解决方案。 将从如下两个部分展开: AI算法在音乐推荐中的应用 音乐场景下的 AI 思考 从 2013 年 4 月正式上线至今,网易云音乐平台持续提供着:乐屏社区、UGC...
相关热词 c# 图片上传 c# gdi 占用内存 c#中遍历字典 c#控制台模拟dos c# 斜率 最小二乘法 c#进程延迟 c# mysql完整项目 c# grid 总行数 c# web浏览器插件 c# xml 生成xsd
立即提问