2015-04-15 29 views
0

我一直在使用Jpanel,繪畫組件和計時器在Java上閃爍的信標,但是我無法嘗試讓代碼中的按鈕運行。當代碼運行時,閃光按鈕應該提示信標開始閃爍/閃爍,而穩定按鈕保持它的顏色相同。信標的交替顏色是橙色和灰色的。除此之外,當代碼運行時,我似乎無法擺脫出現在窗口左上角的按鈕。到目前爲止,這是我一直Jbutton問題在我的代碼

import javax.swing.*; 
import java.awt.*; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.awt.geom.Ellipse2D; 
/** 
* Created by Enoch on 26/03/2015. 
*/ 

class BelishaBeacon extends JPanel { 
    Color startLight, stopLight, color; 
    public void paintComponent(Graphics g) { 
     super.paintComponents(g); 
     Graphics2D g2 = (Graphics2D) g; 
     g2.setColor(color); 
     Ellipse2D firstOval = new Ellipse2D.Double(130, 70, 50, 50); 
     g2.draw(firstOval); 
     g2.fill(firstOval); 
     g2.setColor(Color.BLACK); 
     Rectangle rect1 = new Rectangle(150, 119, 10, 35); 
     g2.draw(rect1); 
     g2.fill(rect1); 
     g2.setColor(Color.WHITE); 
     Rectangle rect2 = new Rectangle(150, 150, 10, 35); 
     g2.draw(rect2); 
     g2.fill(rect2); 
     g2.setColor(Color.BLACK); 
     Rectangle rect3 = new Rectangle(150, 180, 10, 35); 
     g2.draw(rect3); 
     g2.fill(rect3); 
     g2.setColor(Color.WHITE); 
     Rectangle rect4 = new Rectangle(150, 210, 10, 35); 
     g2.draw(rect4); 
     g2.fill(rect4); 
     g2.setColor(Color.BLACK); 
     Rectangle rect5 = new Rectangle(150, 240, 10, 35); 
     g2.draw(rect5); 
     g2.fill(rect5); 
     g2.setColor(Color.WHITE); 
     Rectangle rect6 = new Rectangle(150, 270, 10, 35); 
     g2.draw(rect6); 
     g2.fill(rect6); 
     g2.setColor(Color.BLACK); 
     Rectangle rect7 = new Rectangle(150, 300, 10, 35); 
     g2.draw(rect7); 
     g2.fill(rect7); 
     g2.setColor(Color.WHITE); 
     Rectangle rect8 = new Rectangle(150, 330, 10, 35); 
     g2.draw(rect8); 
     g2.fill(rect8); 
     g2.setColor(Color.BLACK); 
     Rectangle rect9 = new Rectangle(150, 360, 10, 35); 
     g2.draw(rect9); 
     g2.fill(rect9); 
     g2.setColor(Color.WHITE); 
     Rectangle rect10 = new Rectangle(150, 390, 10, 35); 
     g2.draw(rect10); 
     g2.fill(rect10); 
    } 

    public BelishaBeacon() { 
     startLight = Color.ORANGE; 
     stopLight = Color.LIGHT_GRAY; 
     color = startLight; 
     new Blinker(this); 
     setBackground(Color.white); 
    } 

    public void blink() 
    { 
     color = (color == startLight ? stopLight : startLight); 
     repaint(); 
    } 
} 
// 
class Blinker 
{ 
    BelishaBeacon blinkPanel; 

    public Blinker(BelishaBeacon bp) 
    { 
     blinkPanel = bp; 
     new Timer(500, new ActionListener() 
     { 
      public void actionPerformed(ActionEvent e) 
      { 
       blinkPanel.blink(); 
      } 
     }).start(); 
    } 
} 
// 
class BelishaBeaconViewer extends JFrame { 
    JButton jbtFlash = new JButton("Flash"); 
    JButton jbtSteady = new JButton("Steady"); 
    JPanel bPanel = new JPanel(); 
    BelishaBeacon bBPanel = new BelishaBeacon(); 

    public BelishaBeaconViewer() { 
     bPanel.add(jbtFlash); 
     this.add(bPanel, BorderLayout.SOUTH); 
     bPanel.add(jbtSteady); 
     this.add(bBPanel, BorderLayout.CENTER); 

     jbtFlash.addActionListener(new FlashListener()); 
     jbtSteady.addActionListener(new SteadyListener()); 


    } 

    class FlashListener implements ActionListener { 
     public void actionPerformed(ActionEvent e) { 
      repaint(); 
     } 
    } 

    class SteadyListener implements ActionListener { 
     public void actionPerformed(ActionEvent e) { 
      repaint(); 
     } 
    } 

    public static void main(String[] args) { 
     JFrame bBFrame = new BelishaBeaconViewer(); 
     bBFrame.setTitle("Belisha Beacon"); 
     bBFrame.setSize(300, 300); 
     bBFrame.setDefaultCloseOperation((JFrame.EXIT_ON_CLOSE)); 
     bBFrame.setVisible(true); 

    } 
} 
+0

謝謝我沒有意識到重新繪製是不需要的。 – Enoch

回答

1

我似乎無法擺脫不斷在窗口的左上角出現一個按鈕,

//super.paintComponents(g); // typo 
super.paintComponent(g); // should be 

不要啓動自動定時器。

  1. 的FlashListener應該啓動定時器,不需要重繪
  2. 的SteadyListner應停止計時,不需要重繪。