2016-04-15 60 views
0

基本上,当我单击稳定按钮时,我的Belisha Beacon必须保持橙色,但在我的程序中单击稳定按钮时,信标保持为浅灰色。有人可以请确定我哪里错了吗?谢谢你:)。这里是我的代码:Belisha Beacon计划中的JButton查询

package Homework; 


import java.awt.*; 
import java.awt.geom.*; 
import java.awt.event.*; 
import javax.swing.Timer; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 

public class BelishaBeacon { 
    private static Timer timer; 
    public class Drawing extends JPanel { 

     private int x = 125; 
     private int y = 80; 
     private boolean changeColors = false; 


     public void paintComponent(Graphics g) { 
      super.paintComponent(g); 
      Graphics2D g2 = (Graphics2D) g; 

      Rectangle box1 = new Rectangle(165, 180, 20, 45); 
      Rectangle box2 = new Rectangle(165, 225, 20, 45); 
      Rectangle box3 = new Rectangle(165, 270, 20, 45); 
      Rectangle box4 = new Rectangle(165, 315, 20, 45); 
      Rectangle box5 = new Rectangle(165, 360, 20, 45); 
      Rectangle box6 = new Rectangle(165, 405, 20, 45); 


      Ellipse2D.Double ball = new Ellipse2D.Double(x, y, 100, 100); 
      g2.draw(ball); 
      g2.draw(box1); 
      g2.draw(box2); 
      g2.draw(box3); 
      g2.draw(box4); 
      g2.draw(box5); 
      g2.draw(box6); 

      g2.setColor(Color.BLACK); 
      g2.fill(box1); 
      g2.fill(box3); 
      g2.fill(box5); 
      g2.setColor(Color.ORANGE); 
      g2.fill(ball); 
      changeColors = !changeColors; 
      if (changeColors) { 
       g2.setColor(Color.lightGray); 
       g2.fill(new Ellipse2D.Double(x, y, 100, 100)); 
      } 
     } 




     public void changeColors() { 
      changeColors = true; 
      repaint(); 
     } 
    } 

    public BelishaBeacon() { 

     JFrame frame = new JFrame(); 
     frame.setSize(350, 570); 
     frame.setTitle("Belisha Beacon"); 
     frame.setLayout(new BorderLayout(0, 0)); 
     final Drawing shapes = new Drawing(); 

     timer = new Timer(500, new ActionListener() { 
      @Override 
      public void actionPerformed(ActionEvent e) { 
       shapes.repaint(); 
      } 
     }); 



     JButton jbtFlash = new JButton("Flash"); 
     jbtFlash.addActionListener(new ActionListener() { 
      @Override 
      public void actionPerformed(ActionEvent e) { 
       System.out.println("Flashing"); 
       if (!timer.isRunning()) { 
        timer.start(); 
       } 

      } 
     }); 




     final JButton jbtSteady = new JButton("Steady"); 
     jbtSteady.addActionListener(
       new ActionListener() { 
        public void actionPerformed(ActionEvent e) { 

         timer.stop(); 
        } 
       }); 


     JPanel controlPanel = new JPanel(); 
     controlPanel.setLayout(new GridLayout(1, 2, 0, 0)); 
     controlPanel.add(jbtFlash); 
     controlPanel.add(jbtSteady); 

     frame.add(controlPanel, BorderLayout.SOUTH); 
     frame.add(shapes); 

     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     new BelishaBeacon(); 
     timer.start(); 
    } 
} 
+0

这是完全一样的这个http://stackoverflow.com/questions/36651192/jbutton-query-in-belisha-beacon-program。你有没有可能成为费德勒的双胞胎? – bili

+0

你大概可以用我留给费德勒的提示:) – bili

+0

@bili我和他在同一个班级啊哈,我和他都试过,但没有到哪里:(. –

回答

2

试试这个:

public class BelishaBeacon { 
    private static Timer timer; 
    public class Drawing extends JPanel { 

     private int x = 125; 
     private int y = 80; 
     private boolean changeColors = false; 


     public void paintComponent(Graphics g) { 
      super.paintComponent(g); 
      Graphics2D g2 = (Graphics2D) g; 

      Rectangle box1 = new Rectangle(165, 180, 20, 45); 
      Rectangle box2 = new Rectangle(165, 225, 20, 45); 
      Rectangle box3 = new Rectangle(165, 270, 20, 45); 
      Rectangle box4 = new Rectangle(165, 315, 20, 45); 
      Rectangle box5 = new Rectangle(165, 360, 20, 45); 
      Rectangle box6 = new Rectangle(165, 405, 20, 45); 


      Ellipse2D.Double ball = new Ellipse2D.Double(x, y, 100, 100); 
      g2.draw(ball); 
      g2.draw(box1); 
      g2.draw(box2); 
      g2.draw(box3); 
      g2.draw(box4); 
      g2.draw(box5); 
      g2.draw(box6); 

      g2.setColor(Color.BLACK); 
      g2.fill(box1); 
      g2.fill(box3); 
      g2.fill(box5); 
      g2.setColor(Color.ORANGE); 
      g2.fill(ball); 
      // changeColors = !changeColors; 
      if (changeColors) { 
       g2.setColor(Color.lightGray); 
       g2.fill(new Ellipse2D.Double(x, y, 100, 100)); 
      } 
     } 




     public void changeColors() { 
      changeColors = !changeColors; 
      repaint(); 
     } 

     public boolean getChangeColors() { 
      return changeColors; 
     } 
    } 

    public BelishaBeacon() { 

     JFrame frame = new JFrame(); 
     frame.setSize(350, 570); 
     frame.setTitle("Belisha Beacon"); 
     frame.setLayout(new BorderLayout(0, 0)); 
     final Drawing shapes = new Drawing(); 

     timer = new Timer(500, new ActionListener() { 
      @Override 
      public void actionPerformed(ActionEvent e) { 
       //shapes.repaint(); 
       shapes.changeColors(); 
      } 
     }); 



     JButton jbtFlash = new JButton("Flash"); 
     jbtFlash.addActionListener(new ActionListener() { 
      @Override 
      public void actionPerformed(ActionEvent e) { 
       System.out.println("Flashing"); 
       if (!timer.isRunning()) { 
        timer.start(); 
       } 

      } 
     }); 




     final JButton jbtSteady = new JButton("Steady"); 
     jbtSteady.addActionListener(
       new ActionListener() { 
        public void actionPerformed(ActionEvent e) { 

         timer.stop(); 
         if(shapes.getChangeColors()) { 
          shapes.changeColors(); 
         } 
        } 
       }); 


     JPanel controlPanel = new JPanel(); 
     controlPanel.setLayout(new GridLayout(1, 2, 0, 0)); 
     controlPanel.add(jbtFlash); 
     controlPanel.add(jbtSteady); 

     frame.add(controlPanel, BorderLayout.SOUTH); 
     frame.add(shapes); 

     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     new BelishaBeacon(); 
     timer.start(); 
    } 
} 
+0

我尝试过,但是我需要Beacon先手动闪烁,并且只有当我点击稳定按钮时它才是橙色的,当我再次单击闪光灯按钮时,它必须再次闪烁。 –

+0

我刚刚编辑了代码。它的工作 – Paul

+0

我只是现在试了一下,它的工作原理。哦,我非常感谢你的帮助:)。 –

2

,而不是试图切换的颜色paintComponent(),给Drawing一个Color,并用它来渲染球:

private Color color = Color.lightGray; 

    @Override 
    public void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     Graphics2D g2 = (Graphics2D) g; 
     … 
     g2.setColor(color); 
     g2.fill(ball); 
     … 
    } 

品牌changeColors()实际改变颜色:

public void changeColors() { 
     if (Color.orange.equals(color)) { 
      color = Color.lightGray; 
     } else { 
      color = Color.orange; 
     } 
     repaint(); 
    } 

,并添加makeSteady()方法:

public void makeSteady() { 
    color = Color.orange; 
    repaint(); 
} 

现在,你的计时器的动作可以做shapes.changeColors(),你闪存按钮处理程序可以做timer.restart()和你稳定按钮处理程序可以做这:

timer.stop(); 
shapes.makeSteady(); 

此外,请不要忘记invokeLater()

+0

非常感谢:D。 –