设置JPanel背景色的问题

JPanel已添加到jframe上并且jpanel上要显示jfreechart图表
代码如下:
JFrame jf = new JFrame();
JPanel panel = new JPanel(new GridLayout());
panel =jfz.getZhutu(l_dateset_z1,l_b_names);
jf.add(panel);

    jf.getContentPane().setBackground(Color.RED);

    jf.pack();  
    jf.setVisible(true);  //设置jframe可见

panel =jfz.getZhutu(l_dateset_z1,l_b_names);这行代码是获取到添加完jfreechart图表的panel,我现在是在这个位置设置背景色,一直没好使

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
Python+OpenCV计算机视觉

Python+OpenCV计算机视觉

新手请教如何动态改变java中JPanel的背景颜色啊

代码如下: ``` package extends1; import java.awt.*; import javax.swing.*; import java.awt.event.*; public class Main extends JFrame implements ItemListener{ private ButtonGroup bg=new ButtonGroup(); private JRadioButton rbColorr=new JRadioButton("red"); private JRadioButton rbColorg=new JRadioButton("green"); private JRadioButton rbColorb=new JRadioButton("blue"); private JPanel jpl=new JPanel(); public Main() { bg.add(rbColorr); bg.add(rbColorg); bg.add(rbColorb); jpl.add(rbColorr); jpl.add(rbColorg); jpl.add(rbColorb); rbColorr.addItemListener(this); rbColorg.addItemListener(this); rbColorb.addItemListener(this); this.add(jpl); this.setSize(300,300); this.setVisible(true); } public void itemStateChanged(ItemEvent e) { Object color=e.getItemSelectable(); if(color==rbColorr) this.getContentPane().setBackground(Color.red); else if(color==rbColorg) this.getContentPane().setBackground(Color.green); else this.getContentPane().setBackground(Color.blue);; } public static void main(String[] args)throws Exception { new Main(); } } ```

java的JPanel边框和背景均不显示

``` public class Car{ private static int speed; public static void main(String args[]){ //Timer timer=new Timer(); JFrame win=new JFrame(); JPanel panel=new JPanel(); JButton btn1=new JButton("速度1"); JButton btn2=new JButton("速度2"); Mycanvs canvs=new Mycanvs(); win.setLayout(null); btn1.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { // TODO Auto-generated method stub speed=10; } }); btn2.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { // TODO Auto-generated method stub speed=30; //timer.schedule(, time); } }); //panel.setBounds(100,100, 200, 200); canvs.setBounds(100,100, 200, 200); canvs.setBorder(BorderFactory.createLineBorder(Color.blue,1)); canvs.setBackground(Color.BLUE); //panel.setBorder(BorderFactory.createLineBorder(Color.blue,1)); //panel.add(canvs); btn1.setBounds(40, 10, 100, 30); btn2.setBounds(200, 10, 100, 30); win.add(canvs); win.add(btn1); win.add(btn2); win.setBounds(100, 100, 400, 400); win.setVisible(true); } public static class Mycanvs extends JPanel{ int x=100; int y=100; public void paint(Graphics g){ g.fillRect(x, y, 20, 20); } public void repaint(){ if(x==100){ x=0; y=0; } x+=speed; y+=speed; } } ```

一个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 点击按钮改变窗口背景图

我把加载图片装成一个静态方法: public static void setBackground(String imagename){ img1 = new ImageIcon("Image/"+imagename); //img1为ImageIcon型,静态 Image im = img1.getImage(); im = im.getScaledInstance(400, 600, Image.SCALE_DEFAULT); img1.setImage(im);//压缩图片 imgLabel = new JLabel(img1);//将背景图放进标签,imgLabel为JLabel型,静态 imgLabel.setBounds(0,0,400,600); } 然后哪个窗口需要设置背景就调用这个类的静态方法: 类名.setBackground("1.jpg"); window.getLayeredPane().add(imgLabel, new Integer(Integer.MIN_VALUE)); ((JComponent) con).setOpaque(false);//window、con分别是当前窗口,容器 但是如果我想点击按钮就给指定窗口换背景的话却没有反应,按钮响应部分代码: String name = s + ".jpg"; 类名.setBackground(s); 指定窗口.getLayeredPane().add(类名.imgLabel, new Integer(Integer.MIN_VALUE)); ((JComponent)指定窗口的容器).setOpaque(false); 求解应该怎么做???

java里repaint在循环里的问题

package test05; //import java.awt.Color; //import java.awt.Graphics; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import java.awt.*; import javax.swing.*; //import javax.swing.JFrame; //import javax.swing.JPanel; public class Show extends JFrame { MyPanel mp = null; public Show() { mp = new MyPanel(); this.add(mp); this.addKeyListener(mp); // this.setSize(900, 600); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.setVisible(true); } public static void main(String[] args) { Show show = new Show(); } } class MyPanel extends JPanel implements KeyListener { int x = 200; int y = 200; public MyPanel() { } public void paint(Graphics g) { super.paint(g); g.setColor(Color.BLACK); g.fillOval(200, 200, 10, 10); g.setColor(Color.red); g.fillOval(x, y, 5, 5); System.out.println("aaa"); } @Override public void keyTyped(KeyEvent e) { // TODO Auto-generated method stub } @Override public void keyPressed(KeyEvent e) { System.out.println(this.x); if (e.getKeyCode() == KeyEvent.VK_J) { while (!(x >= 900 || x <= 0 || y >= 600 || y <= 0)) { this.repaint(); System.out.println("b"); this.x -= 5; System.out.println(x); try { Thread.sleep(100); } catch (InterruptedException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } this.repaint(); } System.out.println("cccccc"); } } @Override public void keyReleased(KeyEvent e) { // TODO Auto-generated method stub } } 就是这个循环的问题 if (e.getKeyCode() == KeyEvent.VK_J) { while (!(x >= 900 || x <= 0 || y >= 600 || y <= 0)) { this.repaint(); this.x -= 5; this.repaint(); } } repaint在出while循环后才执行,怎么回事

布局管理器BorderLayout

[code="java"]import java.awt.*; import javax.swing.*; public class MainFrame extends JFrame { public static void main(String[] args) { new MainFrame().launchFrame(); } //显示主窗体 public void launchFrame() { setSize(800,600); setLocation(300,400); //该面板用于显示顶部图片 JPanel p1 = new JPanel(); p1.setSize(800, 60); //增加tab标签切换面板 JTabbedPane tab = new JTabbedPane(); //增加四个tab面板 JPanel tp1 = new JPanel(); JPanel tp2 = new JPanel(); JPanel tp3 = new JPanel(); JPanel tp4 = new JPanel(); tp1.add(new JLabel("1")); tp2.add(new JLabel("2")); tp3.add(new JLabel("3")); tp4.add(new JLabel("4")); tab.add("主窗口",tp1); tab.add("歌曲列表",tp2); tab.add("下载列表",tp3); tab.add("我的音乐",tp4); tab.setSize(800,540); add(p1,BorderLayout.NORTH); add(tab,BorderLayout.SOUTH); setResizable(false); setVisible(true); }[/code] 显示结果如图所示,因为设置了tab的大小是(800,540),而p1的大小是(800,60),窗口大小是(800,600),理论上应该是下面大,上面小才对,可是》。。。

Java如何设计画圆程序,要求在画圆区域画圆,并能设置圆的颜色及是否填充圆的内部。

求助大神!Java设计画圆程序,要求在画圆区域画圆,并能设置圆的颜色及是否填充圆的内部。我已经写了一部分了,现在可以画实心圆,但是设置颜色和是否填充一直想不出来要怎么弄,请问有人可以指点一下吗? ``` import java.awt.*; import javax.swing.*; public class C extends JFrame implements ActionListener{ PrintPanel PP; //创建画圆面板 JLabel lb1; JTextField TF; JButton button; public JRadioButton []rb1; public C() { JFrame test = new JFrame("画圆程序"); //创建框架 JPanel MyPanel1 = new JPanel(); //创建第一个面板,装有关颜色选择的组件 JPanel MyPanel2 = new JPanel(); //创建第二个面板,装是否填充有关的组件 JPanel MyPanel3 = new JPanel(); //创建第三个面板,装半径有关的组件 JPanel MyPanel4 = new JPanel(); //创建第四个面板,装画圆按钮等组件 PP = new PrintPanel(0); JPanel Right = new JPanel(new GridLayout(4, 1)); //创建右面板 JSplitPane test1 = new JSplitPane(); //创建分裂面板 test.setDefaultCloseOperation(EXIT_ON_CLOSE); test.setSize(700, 460); //设置框架大小 test.setResizable(false); Container c = test.getContentPane(); c.add(test1); c.setLayout(new GridLayout(1, 2, 0, 0)); JRadioButton []rb1 = {new JRadioButton("黑色"),new JRadioButton("红色"),new JRadioButton("绿色")}; rb1[0].setSelected(true); //“黑色”选项默认为选中 ButtonGroup buttongroup = new ButtonGroup(); for(int i=0;i<rb1.length;i++) { //for循环,将两个单选按钮加入按钮组和面板中 buttongroup.add(rb1[i]); MyPanel1.add(rb1[i]); } lb1 = new JLabel("是否填充:",JLabel.LEFT); MyPanel2.add(lb1); JRadioButton []rb = {new JRadioButton("是"),new JRadioButton("否")}; rb[0].setSelected(true); //“是”选项默认为选中 ButtonGroup buttongroup1 = new ButtonGroup(); for(int i=0;i<rb.length;i++) { //for循环,将两个单选按钮加入按钮组和面板中 buttongroup1.add(rb[i]); MyPanel2.add(rb[i]); } TF = new JTextField(8); //创建文本框,用于半径调节 JLabel lb2 = new JLabel("半径:"); MyPanel3.add(lb2); MyPanel3.add(TF); TF.getText(); button = new JButton("画圆"); //创建画圆按钮,当数据调整完毕后进行画圆 MyPanel4.add(button); button.addActionListener(this); Right.add(MyPanel1); Right.add(MyPanel2); Right.add(MyPanel3); Right.add(MyPanel4); test1.setEnabled(false); test1.setOrientation(JSplitPane.HORIZONTAL_SPLIT); //设置分割方向是水平分割 test1.setLeftComponent(PP); //插入左边面板 test1.setRightComponent(Right); //插入右边面板 test.setVisible(true); test1.setDividerLocation(0.55); } public void actionPerformed(ActionEvent e) { //if(e.getSource() == rb1[0]) try { PP.setR(Integer.valueOf(TF.getText())); }catch(NumberFormatException a) { System.out.println("please input a number!"); } PP.repaint(); } class printp extends Panel{ //内部类,用于画圆的画板 public int r; public printp(int r){ this.r = r; } public void paint(Graphics g){ super.paint(g); g.setColor(Color.red); int h = this.getHeight(); int w = this.getWidth(); g.fillOval(w/2 - r, h/2 - r, 2 * r, 2 * r); } public int getR() { return r; } public void setR(int r) { this.r = r; } public void actionPerformed(ActionEvent e) { } } public static void main(String[] args) { C test = new C(); } } ``` ![图片说明](https://img-ask.csdn.net/upload/201910/04/1570177363_953858.png)

想问一下如何在日历系统里插入图片

大二萌新做课设风景日历制作系统,图片不会插入,希望向各位大佬求助 ``` import java.awt.*; import java.awt.event.*; import java.util.*; import javax.swing.*; import javax.swing.event.*; import javax.swing.table.*; public class MyCalendar extends JApplet { //定义星期天到星期六全局变量 public static final String WEEK_SUN = "星期日"; //星期标签名称 public static final String WEEK_MON = "星期一"; public static final String WEEK_TUE = "星期二"; public static final String WEEK_WED = "星期三"; public static final String WEEK_THU = "星期四"; public static final String WEEK_FRI = "星期五"; public static final String WEEK_SAT = "星期六"; public static final Color background = Color.white; //设置背景颜色 public static final Color foreground = Color.black; //设置前景颜色 public static final Color headerBackground = Color.blue; //设置题头星期的背景颜色 public static final Color headerForeground = Color.white; //设置题头星期的前景颜色 public static final Color selectedBackground = Color.green; //设置被选中的日期的背景颜色 public static final Color selectedForeground = Color.white; //设置被选中的日期的前景颜色 private JPanel cPane; //日历面板 private JLabel yearsLabel; //"年份"标签 private JSpinner yearsSpinner; //年调控,年份组合框 private JLabel monthsLabel; //"月份"标签 private JComboBox monthsComboBox;//12月下拉框 private JTable daysTable; //用来显示日期的table,日表格 private AbstractTableModel daysModel;//天单元表格 private Calendar calendar; //日历对象 //函数定义 public MyCalendar() { //构造函数 cPane = (JPanel) getContentPane(); } public void init() { //初始化,对所有的空间进行布局,面板界面函数 cPane.setLayout(new BorderLayout()); //使用border布局管理器 calendar = Calendar.getInstance();//默认方式,以本地的时区和地区来构造Calendar yearsLabel = new JLabel("年份: ");//设置年份标签显示 yearsSpinner = new JSpinner();//构造年份spinner组合框 yearsSpinner.setEditor(new JSpinner.NumberEditor(yearsSpinner, "0000")); yearsSpinner.setValue(new Integer(calendar.get(Calendar.YEAR))); //增加监听 监听年份的改变 yearsSpinner.addChangeListener(new ChangeListener() {//注册该组合框的事件监听器 public void stateChanged(ChangeEvent changeEvent) { int day = calendar.get(Calendar.DAY_OF_MONTH); calendar.set(Calendar.DAY_OF_MONTH, 1); calendar.set(Calendar.YEAR, ((Integer) yearsSpinner.getValue()).intValue()); int maxDay = calendar.getActualMaximum(Calendar.DAY_OF_MONTH); calendar.set(Calendar.DAY_OF_MONTH, day > maxDay ? maxDay : day); updateView();//更新显示 } }); JPanel yearMonthPanel = new JPanel();//定义年月面板 cPane.add(yearMonthPanel, BorderLayout.NORTH);//添加年月面板到日历面板的南面(最上方) yearMonthPanel.setLayout(new BorderLayout());//边布局模式 yearMonthPanel.add(new JPanel(), BorderLayout.CENTER); JPanel yearPanel = new JPanel();//构建年份面板 yearMonthPanel.add(yearPanel, BorderLayout.WEST);//年份面板添加到年月面板西部(左边) yearPanel.setLayout(new BorderLayout());//设置年份面板为边布局并添加年份标签和组合框 yearPanel.add(yearsLabel, BorderLayout.WEST); yearPanel.add(yearsSpinner, BorderLayout.CENTER); monthsLabel = new JLabel("月份: "); //设置月份标签显示 monthsComboBox = new JComboBox(); //向月份下拉框中增加内容 for (int i = 1; i <= 12; i++) { //构造下拉框的12个月份 monthsComboBox.addItem(new Integer(i)); } monthsComboBox.setSelectedIndex(calendar.get(Calendar.MONTH));//下拉框当前月份为选中状态 monthsComboBox.addActionListener(new ActionListener() { //注册月份下拉框的事件监听器 public void actionPerformed(ActionEvent actionEvent) { int day = calendar.get(Calendar.DAY_OF_MONTH); calendar.set(Calendar.DAY_OF_MONTH, 1); calendar.set(Calendar.MONTH, monthsComboBox.getSelectedIndex()); int maxDay = calendar.getActualMaximum(Calendar.DAY_OF_MONTH); calendar.set(Calendar.DAY_OF_MONTH, day > maxDay ? maxDay : day); updateView();//更新面板显示 } }); JPanel monthPanel = new JPanel();//定义月份面板 yearMonthPanel.add(monthPanel, BorderLayout.EAST);//添加月份面板到年月面板的东面(右面) monthPanel.setLayout(new BorderLayout());//月份面板设为边布局方式 monthPanel.add(monthsLabel, BorderLayout.WEST);//添加月份名称标签到月份面板西面(左面) monthPanel.add(monthsComboBox, BorderLayout.CENTER);//添加月份下拉框到月份面板中间 daysModel = new AbstractTableModel() { //设置7行7列 public int getRowCount() { //设置7行 return 7; } public int getColumnCount() { //设置列7 return 7; } public Object getValueAt(int row, int column) { if (row == 0) { //第一行显示星期 return getHeader(column); } row--; Calendar calendar = (Calendar) MyCalendar.this.calendar.clone(); calendar.set(Calendar.DAY_OF_MONTH, 1); int dayCount = calendar.getActualMaximum(Calendar.DAY_OF_MONTH); int moreDayCount = calendar.get(Calendar.DAY_OF_WEEK) - 1; int index = row * 7 + column; int dayIndex = index - moreDayCount + 1; if (index < moreDayCount || dayIndex > dayCount) { return null; } else { return new Integer(dayIndex); } } }; daysTable = new CalendarTable(daysModel, calendar);//构造日表格 //设置每个call可以被选中 daysTable.setCellSelectionEnabled(true);//设置表格单元格可选择 daysTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); daysTable.setDefaultRenderer(daysTable.getColumnClass(0), new TableCellRenderer() { public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { String text = (value == null) ? "" : value.toString(); JLabel cell = new JLabel(text); cell.setOpaque(true);//绘制边界内的所有像素 if (row == 0) {//第一行显示星期,设置为星期的前景色和背景色 cell.setForeground(headerForeground); cell.setBackground(headerBackground); } else { if (isSelected) {//日期单元格如果选中,则设置为日期选中的前、背景色 cell.setForeground(selectedForeground); cell.setBackground(selectedBackground); } else { //设置日期单元格的普通前、背景色 cell.setForeground(foreground); cell.setBackground(background); } } return cell; } }); updateView(); cPane.add(daysTable, BorderLayout.CENTER);//添加日面板到日历面板中间 } public static String getHeader(int index) {//设置第一行星期的显示 switch (index) { case 0: return WEEK_SUN; case 1: return WEEK_MON; case 2: return WEEK_TUE; case 3: return WEEK_WED; case 4: return WEEK_THU; case 5: return WEEK_FRI; case 6: return WEEK_SAT; default: return null; } } public void updateView() {//更新面板显示方法 daysModel.fireTableDataChanged(); daysTable.setRowSelectionInterval(calendar.get(Calendar.WEEK_OF_MONTH), calendar.get(Calendar.WEEK_OF_MONTH)); daysTable.setColumnSelectionInterval(calendar.get(Calendar.DAY_OF_WEEK) - 1, calendar.get(Calendar.DAY_OF_WEEK) - 1); } //设置日历的table public static class CalendarTable extends JTable {//表格类 private Calendar calendar; public CalendarTable(TableModel model, Calendar calendar) {//构造方法 super(model); this.calendar = calendar; } public void changeSelection(int row, int column, boolean toggle, boolean extend) {//选择表格单元格时 super.changeSelection(row, column, toggle, extend); if (row == 0) {//选择为第一行(星期)时不改变单元格 return; } Object obj = getValueAt(row, column); if (obj != null) { calendar.set(Calendar.DAY_OF_MONTH, ((Integer)obj).intValue()); } } } //让applet作为一个可执行的程序来运行 public static void main(String[] args) { JFrame frame = new JFrame("Calendar Application"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); MyCalendar myCalendar = new MyCalendar(); myCalendar.init(); frame.getContentPane().add(myCalendar); frame.setSize(400, 250); frame.show(); } } ```

请问JButton怎么删除已添加的Icon?

或者是怎样让背景色和添加的文本把JButton覆盖,谢谢大神

JAVA的Jframe图标怎么修改

![图片说明](https://img-ask.csdn.net/upload/201903/29/1553842955_581633.jpg) 试了好多种办法图标这两个替换不掉,代码如下 ``` package demo; import java.awt.BorderLayout; import java.awt.EventQueue; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.border.EmptyBorder; import java.awt.Toolkit; public class test2 extends JFrame { private JPanel contentPane; /** * Launch the application. */ public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { public void run() { try { test2 frame = new test2(); frame.setVisible(true); } catch (Exception e) { e.printStackTrace(); } } }); } /** * Create the frame. */ public test2() { setIconImage(Toolkit.getDefaultToolkit().getImage("C:\\Users\\yyj\\Desktop\\testPostOrder\\lib\\icon.jpg")); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setBounds(100, 100, 450, 300); contentPane = new JPanel(); contentPane.setBorder(new EmptyBorder(5, 5, 5, 5)); contentPane.setLayout(new BorderLayout(0, 0)); setContentPane(contentPane); } } ```

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);//设置窗体显示 } }); } }

本应碰撞后产生一个小球 却好像生成了无数个 求改

public class BallPanel extends JPanel { private ArrayList<Ball> balls = new ArrayList<Ball>(); //小球列表 private BallComponent component = new BallComponent(); //小球画板 private JButton btnAdd = new JButton("Add"); //Add按钮 private JComboBox placeCombo = new JComboBox(); //小球出现方位 private BallThread thread = new BallThread(); //小球运动线程 private int delay = 5; //小球运动的延缓时间 private int flag=0; private double newX; private double newY; /** * 初始化小球面板 */ public BallPanel() { setLayout(new BorderLayout()); //设置为BorderLayout的布局 add(component, BorderLayout.CENTER); //将小球画板加到面板中央 component.setOpaque(true); //设置画板不透明,以便能添加背景色 component.setBackground(Color.BLACK); //设置背景色 JPanel panel = new JPanel(); //创建用来放各种按钮的面板 panel.add(btnAdd); //将Add按钮放入该面板 panel.setBackground(Color.LIGHT_GRAY); add(panel, BorderLayout.SOUTH); //将按钮面板加到主面板南部 //Add按钮加入监听器,当按下按钮时添加小球 btnAdd.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent event) { component.addBall(); } }); thread.start(); //画画板的线程开始 } /** * 主函数,主要用于测试 * @param args */ public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { public void run() { JFrame frame = new JFrame("Hit Balls"); //设置测试框架的标题 frame.add(new BallPanel()); //将小球碰撞动画面板放上去 frame.setSize(400, 300); //设置框架大小 frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //设置框架的默认关闭方式 frame.setLocationByPlatform(true); //将框架的定位交给系统实现 frame.setVisible(true); //设置框架可见 } }); } /** * 小球运动线程 * @author zjf */ private class BallThread extends Thread { private boolean isStop = false; //停止标记 /** * 线程体 */ public void run() { while (true) //让它一直执行 { if (!isStop) //当没有停止的时候 { for (int i = 0; i < balls.size(); i++) { balls.get(i).move(component.getBounds());//每个小球都移动一遍 } while(flag==1){ balls.add(new Ball(newX,newY)); flag=0; } component.repaint(); //重画画板 } try { Thread.sleep(delay); //线程延缓delay毫秒 } catch (InterruptedException e) { //捕获异常 e.printStackTrace(); //处理异常 } } } /** * 设置stop标志 * @param isStop 是否停止 */ public void setStop(boolean isStop) { this.isStop = isStop; } } /** * 小球的画板 * @author zjf */ class BallComponent extends JComponent { public BallComponent() { setUI(new ComponentUI() { public void installUI(JComponent c) { super.installUI(c); LookAndFeel.installColors(c, "Panel.background", "Panel.foreground"); } }); } /** * 添加小球 */ public void addBall() { double x = 0; //小球开始的x坐标 double y = 0; //小球开始的y坐标 balls.add(new Ball(x, y)); //在小球的列表中加入新球,球的初始方位和颜色为前面的值 } /** * 绘制画板 */ public void paintComponent(Graphics g) { super.paintComponent(g); Graphics2D g2 = (Graphics2D)g; for (int i = 0; i < balls.size(); i++) //将小球列表中的小球都画到画板上 { Ball ball = balls.get(i); g2.fill(ball.getShape()); //画出小球的形状 } } } /** * 小球类 * @author zjf */ private class Ball { private static final double SIZE = 20; //小球的直径 private double x = 0; //小球所在的x坐标 private double y = 0; //小球所在的y坐标 private double vx = Math.sqrt(2) / 2; //小球在x轴的速度 private double vy = Math.sqrt(2) / 2; //小球在y轴的速度 private Color color = Color.BLACK; //小球的颜色 /** * 小球的构造函数 * @param x 小球所在的x坐标 * @param y 小球所在的y坐标 */ public Ball(double x, double y) { this.x = x; this.y = y; } /** * 小球在一个矩形边框中移动 * @param bounds 矩形边框 */ public void move(Rectangle2D bounds) { x += vx; //小球在x轴上的位移 y += vy; //小球在y轴上的位移 double minX = bounds.getMinX(); //矩形边界的最小x坐标 double minY = bounds.getMinY(); //矩形边界的最小y坐标 double maxX = bounds.getMaxX(); //矩形边界的最大x坐标 double maxY = bounds.getMaxY(); //矩形边界的最大y坐标 if (x <= minX) //如果小球越过左边界 { x = minX; //小球的x坐标变为矩形边界的最小x坐标 vx = -vx; //小球在x轴方向的速度反向 } if (y <= minY) //如果小球越过上边界 { y = minY; //小球的y坐标变为矩形边界的最小y坐标 vy = -vy; //小球在y轴方向的速度反向 } if (x + SIZE >= maxX) //如果小球越过右边界 { x = maxX - SIZE; //小球的x坐标变为矩形边界的最大x坐标减去小球的直径 vx = -vx; //小球在x轴方向的速度反向 } if (y + SIZE >= maxY) //如果小球越过下边界 { y = maxY - SIZE; //小球的y坐标变为矩形边界的最大y坐标减去小球的直径 vy = -vy; //小球在y轴方向的速度反向 } for (int i = 0; i < balls.size(); i++) //判断小球间是否发生碰撞 { Ball ball = balls.get(i); if (this.equals(ball)) continue; if ((ball.x - x) * (ball.x - x) + (ball.y - y) * (ball.y - y) <= SIZE * SIZE) //当两球间的距离小于直径时,可认为两小球发生了碰撞 { flag=1; double degree = Math.atan((y - ball.y) / (x - ball.x)); //获取自己与发生碰撞的小球之间所形成的夹角,因为夹角只能在-pi/2-pi/2之间,所以还需判断两球的x坐标之间的关系 if (x > ball.x) //如果自己的x坐标大于发生碰撞的小球的x坐标,由数学知识可知自己应该往正向运动 { vx = Math.cos(degree); vy = Math.sin(degree); } else //如果自己的x坐标小于发生碰撞的小球的x坐标,由数学知识可知应该朝负向运动 { vx = -Math.cos(degree); vy = -Math.sin(degree); } } newX=x; newY=y; } } /** * 获取小球的形状 * @return 形状 */ public Ellipse2D getShape() { return new Ellipse2D.Double(x, y, SIZE, SIZE); } /** * 判断两个小球是否相同 */ public boolean equals(Object object) { if (this == object) return true; //如果所指的对象相同,即两小球的确相同 if (object == null) return false; //如果要比较的小球不存在,则两小球不同 if (getClass() != object.getClass()) return false; //如果自己的类名与另一个对象的类名不同,则两小球不同 Ball ball = (Ball) object; //将另一个对象强制转化为小球 return x == ball.x && y == ball.y && color.equals(ball.color); //通过方位,颜色判断是否相同 } } }

java swing组件上绘制直线同时添加组件后 的显示问题

说明:运行后,面板上自动画出14条直线,点击“添加”按钮,生成可以拖动的JTextField控件。问题(1)面板的背景色不显示,(2)拖动JTextField控件时有残影,(3)改变JFrame大小后,残影消失,但是只能显示JTextField控件的一部分。哪位高手指点下。 ``` import java.awt.*; import java.awt.event.*; import java.awt.Graphics; import static java.awt.BorderLayout.*; import java.awt.event.ActionListener; import javax.swing.*; import javax.swing.SwingUtilities; import javax.swing.plaf.ButtonUI; import javax.swing.event.*; class Win extends JFrame { JButton jb1,jb2,jb3,jb4,jb5;//编辑、添加、修改、删除、调度 JButton jb6,jb7,jb8,jb9,jb10;//调试用按钮 JPanel jp_button;//放置按钮的面板 MyPanel jp_xianlu;//放置线路图的面板 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); } }); } 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 MyPanel(); add(jp_xianlu,CENTER); //添加5个按钮并添加到面板jp_button上 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) { setMyText(200,200); } }); } //自定的可以生成LTextField的方法 public void setMyText(int a,int b){ MyTextField mtf= new MyTextField(); //输入标签显示内容 mtf.setBounds(a,b,55,20); jp_xianlu.add(mtf); } } //自定义监听器类:转换坐标并实现自由拖动 class MyTextField extends JTextField implements MouseListener,MouseMotionListener { /** 坐标点 */ Point point = new Point(0, 0); MyTextField(){ super("0000000"); addMouseListener(this); addMouseMotionListener(this); setOpaque(true); //组件背景透明 setBackground(Color.RED); } /** * 当鼠标拖动时触发该事件记录下鼠标按下(开始拖动)的位置(摘自苏小喵) */ public void mouseDragged(MouseEvent e) { //转换坐标系统 Point newPoint = SwingUtilities.convertPoint(this, e.getPoint(), this.getParent()); //设置标签的新位置 this.setLocation(this.getX() + (newPoint.x - point.x), this.getY() + (newPoint.y - point.y)); //更改坐标点 point = newPoint; } public void mouseMoved(MouseEvent e){} /** * 当鼠标按下时触发该事件。 记录下鼠标按下(开始拖动)的位置。 */ public void mouseClicked(MouseEvent e) {} public void mouseEntered(MouseEvent e){} public void mouseExited(MouseEvent e){} public void mousePressed(MouseEvent e) { //得到当前坐标点 point = SwingUtilities.convertPoint(this, e.getPoint(), this.getParent()); } public void mouseReleased(MouseEvent e){} } //自定义面板,在其上实画线(未实现,不可用) class MyPanel extends JPanel{ public MyPanel(){ setBackground(Color.GREEN); setOpaque(true); setLayout(null); setVisible(true); } @Override //画14条直线 public void paint(Graphics g){ g.drawLine(10,50,1900,50); g.drawLine(10,115,1900,115); g.drawLine(10,180,1900,180); g.drawLine(10,245,1900,245); g.drawLine(10,310,1900,310); g.drawLine(10,375,1900,375); g.drawLine(10,440,1900,440); g.drawLine(10,505,1900,505); g.drawLine(10,570,1900,570); g.drawLine(10,635,1900,635); g.drawLine(10,700,1900,700); g.drawLine(10,765,1900,765); g.drawLine(10,830,1900,830); g.drawLine(10,895,1900,895); } } ```

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 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计算器的退格功能和清除当前操作功能

# (在网上找的代码来学的所以搞不懂逻辑)代码如下: 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风景日历,运行时,日历是有了,但风景没有,这是为什么?

运行是这样 ![图片说明](https://img-ask.csdn.net/upload/201911/14/1573703884_780623.jpg) 但是想要这样![图片说明](https://img-ask.csdn.net/upload/201911/14/1573708341_322515.jpg) ``` import java.awt.*; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.util.*; import java.util.Timer; import javax.swing.*; import javax.swing.event.*; import javax.swing.table.*; //这是一个用JList和JTable完成的简单日历 public class calender { public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { public void run() { JFrame frame = new CalendarFrame(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setVisible(true); } }); } } class CalendarFrame extends JFrame { private static final long serialVersionUID = 8067844586793608064L; JPanel listPanel; // 显示月份的列表面板 JPanel tablePanel; // 显示日期的表格面板 JPanel textPanel; // 文本面板 JMenuBar menuBar; // JMenuBar,JMenu定义的变量都没有实现功能 JMenu fileMenu; JMenu editMenu; JMenu formatMenu; JMenu lookMenu; JMenu helpMenu; JEditorPane text; // 自带复制,剪切和删除快捷键功能的面板 JScrollPane textscrollpane; JScrollPane tablescrollpane; @SuppressWarnings("rawtypes") JList list; // 显示月份的列表 JTable table; // 显示日期的表格 JPanel yearPanel; // 显示年份的面板 JSpinner spinner; // JSpinner空间 JLabel label = new JLabel(); public static boolean flag = true; @SuppressWarnings({ "unchecked", "rawtypes" }) public CalendarFrame() { table = new JTable(new MyTableModel()); tablescrollpane = new JScrollPane(table); for (int i = 0; i < 7; i++) { TableColumn column = table.getColumnModel().getColumn(i);// 获取表格每一列 column.setResizable(false);// 不允许改变列的大小 } table.setBackground(Color.GREEN); table.setRowHeight(72); // 设定每列的大小 table.setRowSelectionAllowed(false);// 设定行的选择模式 table.setDefaultRenderer(String.class, new MyTableRenderer()); list = new JList(new AbstractListModel() // 匿名的list模型类,提供list显示的月份数据 { private static final long serialVersionUID = -3703164069291737586L; public Object getElementAt(int index) { String obj = null; switch (index) { case 0: obj = "Jan"; break; case 1: obj = "Feb"; break; case 2: obj = "Mar"; break; case 3: obj = "Apr"; break; case 4: obj = "May"; break; case 5: obj = "Jun"; break; case 6: obj = "Jul"; break; case 7: obj = "Aug"; break; case 8: obj = "Sep"; break; case 9: obj = "Oct"; break; case 10: obj = "Nov"; break; case 11: obj = "Dec"; break; } return obj; } @Override public int getSize() { return 12; } }); list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); // 设定列表的选择模式 list.setCellRenderer(new MyListCellRenderer()); // 列表元素的绘制类MyListCellRenderer list.setSelectedIndex(Calendar.getInstance().get(Calendar.MONTH));// JList默认的月份为现实的月份 list.addListSelectionListener(new ListSelectionListener()// 当某个列表被选中时,更新日期table控件 { public void valueChanged(ListSelectionEvent e) { flag = true; table.updateUI(); } }); list.addMouseListener(new MouseAdapter() { public void mouseClicked(MouseEvent evt) { if (evt.getClickCount() == 2) { String s = (String) list.getSelectedValue(); JOptionPane.showMessageDialog(list, s); } } }); listPanel = new JPanel(); listPanel.setLayout(new BorderLayout()); listPanel.add(list); tablePanel = new JPanel(); tablePanel.setBackground(Color.white); tablePanel.setLayout(new BorderLayout()); tablePanel.add(tablescrollpane); // table.setBackground(Color.green); yearPanel = new JPanel();// 将label控件和JSpinner控件加入年份面板上 yearPanel.setLayout(new GridLayout(0, 4)); JLabel gongyuan = new JLabel("公元", JLabel.RIGHT); JLabel year = new JLabel("年"); spinner = new JSpinner(new SpinnerNumberModel(Calendar.getInstance() .get(Calendar.YEAR), null, null, 1)); spinner.addChangeListener(new ChangeListener() // 为JSpinner空间添加事件监听器 { @Override public void stateChanged(ChangeEvent e) { flag = true; table.updateUI(); } }); yearPanel.add(gongyuan); yearPanel.add(spinner); yearPanel.add(year); yearPanel.add(label); showTime(); new Timer().schedule(new TimerTask() { @Override public void run() { while (true) { showTime(); } } }, 1000); tablePanel.add(yearPanel, BorderLayout.NORTH);// 将年份面板加入到表格面板的北部 textPanel = new JPanel(); textPanel.setLayout(new BorderLayout()); text = new JEditorPane(); textscrollpane = new JScrollPane(text); textPanel.add(textscrollpane); text.setFont(new Font("SansSerif", Font.PLAIN, 40)); tablePanel.add(textPanel, BorderLayout.SOUTH); menuBar = new JMenuBar();// JMenu定义的空间都没实现功能 fileMenu = new JMenu("文件"); editMenu = new JMenu("编辑"); formatMenu = new JMenu("格式"); lookMenu = new JMenu("查看"); helpMenu = new JMenu("帮助"); menuBar.add(fileMenu); menuBar.add(editMenu); menuBar.add(formatMenu); menuBar.add(lookMenu); menuBar.add(helpMenu); GridBagLayout layout = new GridBagLayout(); // 设成GridBagLayout布局 GridBagConstraints constraints = new GridBagConstraints(); this.setFont(new Font("SansSerif", Font.PLAIN, 14)); this.setLayout(layout); this.setTitle("风景日历"); // 设定标题 this.setIconImage(new ImageIcon("res\\title.jpg").getImage()); // 设定图标 constraints.fill = GridBagConstraints.BOTH; constraints.weightx = 0.5; constraints.weighty = 0.5; layout.setConstraints(listPanel, constraints); constraints.weightx = 8.0; constraints.weighty = 0.5; layout.setConstraints(tablePanel, constraints); this.setJMenuBar(menuBar); this.add(listPanel); this.add(tablePanel); this.setSize(this.getToolkit().getScreenSize().width * 3 / 4, this .getToolkit().getScreenSize().height * 3 / 4); // 设定窗体的大小 } private void showTime() { int hour = Calendar.getInstance().get(Calendar.HOUR_OF_DAY); int minute = Calendar.getInstance().get(Calendar.MINUTE); int second = Calendar.getInstance().get(Calendar.SECOND); StringBuilder sb = new StringBuilder(); if (hour < 10) { sb.append("0" + hour); } else { sb.append(hour); } if (minute < 10) { sb.append(":0" + minute); } else { sb.append(":" + minute); } if (second < 10) { sb.append(":0" + second); } else sb.append(":" + second); label.setFont(new Font("SansSerif", Font.BOLD, 12)); label.setForeground(Color.BLACK); label.setText(sb.toString()); } class MyTableModel extends AbstractTableModel // 表格模型类,提供表格数据 { private static final long serialVersionUID = 1L; String[] columnName = new String[] // 表格列名 { "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday" }; @Override public int getColumnCount() // 返回表格列数 { return columnName.length; } public int getRowCount() // 返回表格行数 { return 6; } public String getColumnName(int col) // 获得表格列名 { return columnName[col]; } public Class<? extends Object> getColumnClass(int c) { return getValueAt(0, c).getClass(); } public Object getValueAt(int rowIndex, int columnIndex) { int month = list.getSelectedIndex();// 获得列表的月份 int year = (Integer) spinner.getValue();// 获得spinner显示的年份 GregorianCalendar gc = new GregorianCalendar(year, month, 1); int dayOfWeek = gc.get(Calendar.DAY_OF_WEEK) - 1; // 获得这个月的第一天是星期几 int countDayInMonth = 0;// 某月的总天数,这里的月是从0-11,表示1-12月 if (month == 0 || month == 2 || month == 4 || month == 6 || month == 7 || month == 9 || month == 11) { countDayInMonth = 31; // 是31天的月份 } else if (month == 3 || month == 5 || month == 8 || month == 10) { countDayInMonth = 30; // 是30天的月份 } else if (gc.isLeapYear(year) && month == 1) { countDayInMonth = 29; // 闰年2月 } else if (!gc.isLeapYear(year) && month == 1) { countDayInMonth = 28; // 非闰年2月 } String value = ""; // 因为返回值是Object类型,所以不能直接返回int类型的数据,所以转换成String类型 if (rowIndex == 0) // 第一列的数据 { if (columnIndex < dayOfWeek) { value = ""; } else { value = "" + (columnIndex - dayOfWeek + 1); } } else // 其余列的数据 { if (((rowIndex - 1) * 7) + (columnIndex + 1 + 7 - dayOfWeek) <= countDayInMonth) value = (((rowIndex - 1) * 7) + (columnIndex + 1 + 7 - dayOfWeek)) + ""; } return value; } } @SuppressWarnings("rawtypes") class MyListCellRenderer extends JLabel implements ListCellRenderer // 列表元素绘制类继承自JLabel,实现ListCellRenderer接口 { private static final long serialVersionUID = 1L; public Component getListCellRendererComponent(JList list, // the list Object value, // value to display int index, // cell index boolean isSelected, // is the cell selected boolean cellHasFocus) // does the cell have focus { String s = value.toString().trim(); // 获取选中元素的字符内容 setText(s); // 显示这个字符 Dimension dimension = list.getSize(); // 设定这个每个元素的大小 int height = dimension.height / 12; int width = dimension.width; setSize(width, height); if (isSelected) // 如果该元素被选中,则背景色为红色 { setBackground(Color.red); setForeground(list.getSelectionBackground()); } else // 未被选中的元素背景色显示为灰色,前景色为粉红色 { setBackground(Color.gray); setForeground(Color.pink); } setIcon(new ImageIcon("res\\mon.jpg")); // 设定该元素的图标 setEnabled(list.isEnabled()); setFont(new Font("SansSerif", Font.PLAIN, 20)); // 设定字体大小 setOpaque(true); return this; } } class MyTableRenderer extends JLabel implements TableCellRenderer { private static final long serialVersionUID = 1L; public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { if ((Calendar.getInstance().get(Calendar.DAY_OF_MONTH) + "") // 如果这个标签上的值等于该天的值 .equals(value) && flag == true // 标记为true && list.getSelectedIndex() == Calendar.getInstance().get( Calendar.MONTH) // 列表显示的月份是该月的值 && (Integer) spinner.getValue() == Calendar.getInstance() .get(Calendar.YEAR))// spinner显示的年份是该年 { setFont(new Font("SansSerif", Font.PLAIN, 40)); // 设定字体大小 setText((String) value); // 显示日期字符串 setBorder(UIManager.getBorder("Table.focusCellHighlightBorder")); setForeground(Color.RED); // 设定字符串颜色 flag = false; } else // 如果不是改日的标签上的值 { setFont(new Font("SansSerif", Font.PLAIN, 40)); // 设定字体大小 setText((String) value); // 显示标签上的日期字符串 if (hasFocus) // 如果是被点中的表格的单元格 { setBorder(UIManager .getBorder("Table.focusCellHighlightBorder")); // 设定边框 setForeground(Color.RED);// 设定日期字符串颜色 } else { setForeground(null); setBorder(null); } } return this; } } } ```

java编程中我想用显示密码把密码显示出来了然而登录却有错 求解 急用 (我想了一天实在没法了)

import javax.swing.*; import java.awt.*; import java.awt.event.*; public class weixin extends JFrame implements ActionListener { JPanel panmain; //面板 JLabel lblname,lblpassword,lblphoto; //标签 JLabel first,second,three; JButton btnlogin; //按钮 JTextField txtname; // 单行文本框 JTextField txtpassword; //单行文本框 JPasswordField pwdpassword; //密码框 JCheckBox chkbold; //复选框 Dimension dsSize; Toolkit toolkit=Toolkit.getDefaultToolkit(); public weixin(){ super("登录微信"); panmain =new JPanel(); //实例化面板 this.getContentPane().add(panmain); lblname=new JLabel("账号:"); txtname=new JTextField(18); //实例化长度为18的文本框对象 lblpassword=new JLabel("密码:"); txtpassword=new JTextField(18); pwdpassword=new JPasswordField(18); //实例化长度为18的文本框对象 chkbold=new JCheckBox("显示密码"); btnlogin=new JButton("登录"); first=new JLabel("忘记密码?"); second=new JLabel("创建新账号"); three=new JLabel("切换接入点?"); // Font fontstr=new Font("宋体",Font.PLAIN,12); // lblname.setFont(fontstr); // lblname.setForeground(Color.GREEN); // lblpassword.setForeground(Color.GREEN); btnlogin.setBackground(Color.GREEN); //设置按钮颜色为绿色 panmain.setLayout(null); //空布局 lblname.setBounds(6,50,400,25); //对‘账号’实行空布局 txtname.setBounds(40,50,210,25); // 对文本框实行空布局 lblpassword.setBounds(6,80,500,25); //对’密码‘实行空布局 pwdpassword.setBounds(40,80,210,25); //对密码文本框实行空布局 txtpassword.setBounds(40,80,210,25); chkbold.setBounds(5,116,80,25); //对复选框实行空布局 btnlogin.setBounds(150,120,99,25); //对按钮实行空布局 first.setBounds(6,160,600,25); second.setBounds(6,190,700,25); three.setBounds(6,220,800,25); //pwdpassword=new JPasswordField(); //panmain.setToolTipText("登录到服务器"); // lblphoto=new JLabel(); //添加主面板背景(方法1) // Image image1=new ImageIcon("./src/weixin1.jpg").getImage(); // lblphoto.setIcon(new ImageIcon(image1)); //panmain.setBackground(Color.black); Icon logol=new ImageIcon("./src/weixin1.jpg"); // //添加主面板背景(方法2) lblphoto=new JLabel(logol); lblphoto.setBounds(0,0,266,394); panmain.add(lblphoto); chkbold.addActionListener(this); txtpassword.addActionListener(this); // panmain.add(lblname); //添加标签‘账号’到主面板 // panmain.add(lblpassword); //添加标签‘密码’到主面板 //panmain.add(txtname); //添加单行文本框到主面板 //panmain.add(pwdpassword); //添加密码框到主面板 //panmain.add(chkbold); //添加复选框到主面板 //panmain.add(btnlogin); //添加按钮到主面板 // lblname.setFont (fontstr); lblphoto.add(lblname); lblphoto.add(lblpassword); lblphoto.add(txtname); lblphoto.add(pwdpassword); lblphoto.add(chkbold); lblphoto.add(btnlogin); lblphoto.add(first); lblphoto.add(second); lblphoto.add(three); lblphoto.add(txtpassword); setContentPane(lblphoto); setSize(266,400); setVisible(true); setResizable(false); dsSize=toolkit.getScreenSize(); //this.setDefaultCloseOperation(EXIT_ON_CLOSE); setLocation(dsSize.width/2-this.getWidth()/2, dsSize.height/2-this.getHeight()/2); Image img=toolkit.getImage("./src/1.jpg"); setIconImage(img); } public static void main(String args[]) { new weixin(); } public void actionPerformed1(ActionEvent ae) { if(ae.getSource()==btnlogin){ if(pwdpassword.getText().equals("admin")) && (pwdpassword.getText().equals("admin"))) JOptionPane.showMessageDialog(null,"用户登录成功"); else JOptionPane.showMessageDialog(null,"用户名或密码错误"); } } }

2019 Python开发者日-培训

2019 Python开发者日-培训

150讲轻松搞定Python网络爬虫

150讲轻松搞定Python网络爬虫

设计模式(JAVA语言实现)--20种设计模式附带源码

设计模式(JAVA语言实现)--20种设计模式附带源码

YOLOv3目标检测实战:训练自己的数据集

YOLOv3目标检测实战:训练自己的数据集

java后台+微信小程序 实现完整的点餐系统

java后台+微信小程序 实现完整的点餐系统

三个项目玩转深度学习(附1G源码)

三个项目玩转深度学习(附1G源码)

初级玩转Linux+Ubuntu(嵌入式开发基础课程)

初级玩转Linux+Ubuntu(嵌入式开发基础课程)

2019 AI开发者大会

2019 AI开发者大会

玩转Linux:常用命令实例指南

玩转Linux:常用命令实例指南

一学即懂的计算机视觉(第一季)

一学即懂的计算机视觉(第一季)

4小时玩转微信小程序——基础入门与微信支付实战

4小时玩转微信小程序——基础入门与微信支付实战

Git 实用技巧

Git 实用技巧

Python数据清洗实战入门

Python数据清洗实战入门

使用TensorFlow+keras快速构建图像分类模型

使用TensorFlow+keras快速构建图像分类模型

实用主义学Python(小白也容易上手的Python实用案例)

实用主义学Python(小白也容易上手的Python实用案例)

程序员的算法通关课:知己知彼(第一季)

程序员的算法通关课:知己知彼(第一季)

MySQL数据库从入门到实战应用

MySQL数据库从入门到实战应用

机器学习初学者必会的案例精讲

机器学习初学者必会的案例精讲

手把手实现Java图书管理系统(附源码)

手把手实现Java图书管理系统(附源码)

极简JAVA学习营第四期(报名以后加助教微信:eduxy-1)

极简JAVA学习营第四期(报名以后加助教微信:eduxy-1)

.net core快速开发框架

.net core快速开发框架

玩转Python-Python3基础入门

玩转Python-Python3基础入门

Python数据挖掘简易入门

Python数据挖掘简易入门

微信公众平台开发入门

微信公众平台开发入门

程序员的兼职技能课

程序员的兼职技能课

Windows版YOLOv4目标检测实战:训练自己的数据集

Windows版YOLOv4目标检测实战:训练自己的数据集

HoloLens2开发入门教程

HoloLens2开发入门教程

微信小程序开发实战

微信小程序开发实战

Java8零基础入门视频教程

Java8零基础入门视频教程

Python可以这样学(第一季:Python内功修炼)

Python可以这样学(第一季:Python内功修炼)

相关热词 c# 局部 截图 页面 c#实现简单的文件管理器 c# where c# 取文件夹路径 c# 对比 当天 c# fir 滤波器 c# 和站 队列 c# txt 去空格 c#移除其他类事件 c# 自动截屏
立即提问