2014-01-17 32 views
0

我無法獲得下面鏈接的代碼,無法完成我想要的操作。Java中的事件處理沒有按預期工作

import javax.swing.*; 
import java.awt.*; 
import java.awt.event.*; 

public class Gui { 

    static JFrame frame; 
    static JLabel label; 

    public static void main (String[] args) { 
     Gui gui = new Gui(); 
     gui.go(); 
    } 

    public void go() { 
     frame = new JFrame(); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setSize(400,300); 
     frame.setVisible(true); 

     MyDrawPanel panel = new MyDrawPanel(); 
     frame.getContentPane().add(BorderLayout.CENTER, panel); 

     label = new JLabel("I'm a label"); 
     frame.getContentPane().add(BorderLayout.WEST, label); 

     JButton colorButton = new JButton("Change Colors"); 
     ColorButtonListener colorButtonListener = new ColorButtonListener(); 
     colorButton.addActionListener(colorButtonListener); 
     frame.getContentPane().add(BorderLayout.SOUTH, colorButton); 

     JButton labelButton = new JButton("Change Label"); 
     LabelButtonListener labelButtonListener = new LabelButtonListener(); 
     labelButton.addActionListener(labelButtonListener); 
     frame.getContentPane().add(BorderLayout.EAST, labelButton); 
    } 
} 

class ColorButtonListener implements ActionListener { 
    JFrame frame = Gui.frame; 
    public void actionPerformed (ActionEvent event) { 
     frame.repaint(); 
    } 
} 

class LabelButtonListener implements ActionListener { 
    JLabel label = Gui.label; 
    public void actionPerformed (ActionEvent event) { 
     if (label.getText() == "That hurt") { 
      label.setText("I'm a label"); 
     } else { 
      label.setText("That hurt"); 
     } 
    } 
} 

class MyDrawPanel extends JPanel { 
    public void paintComponent (Graphics g) { 
     Graphics2D g2d = (Graphics2D) g; 

     int red = (int) (Math.random() * 256); 
     int green = (int) (Math.random() * 256); 
     int blue = (int) (Math.random() * 256); 
     Color startColor = new Color(red, green, blue); 

     red = (int) (Math.random() * 256); 
     green = (int) (Math.random() * 256); 
     blue = (int) (Math.random() * 256); 
     Color endColor = new Color(red, green, blue); 

     GradientPaint gradient = new GradientPaint(70, 70, startColor, 150, 150, endColor); 
     g2d.setPaint(gradient); 
     g2d.fillOval(0, 0, this.getWidth(), this.getHeight()); 

    } 
} 

有一個面板類用於繪製一個圓,然後面板位於框架的中心區域。

標籤位於框架的西部區域,colorButton(定位南)和labelButton(定位東)兩個按鈕分別控制圓和標籤。 2類ColorButtonListener和LabelButtonListener實現了ActionListener接口,並分別向colorButton和labelButton註冊。點擊時的顏色按鈕應該用隨機的顏色畫一個圓圈,點擊時的標籤按鈕應該在文本「我是標籤」和「那個傷害」之間切換。

現在,我遇到的問題是標籤按鈕。點擊它時,它不僅會更改文本(如預期的那樣),還會重繪圓圈。這個按鈕不應該重畫圈子。顏色按鈕按預期工作。

回答

2

問題是你不控制何時可能發生重繪。相反,改變顏色每次paintComponent被調用時,你無法控制的,只有當你想從paintComponent方法中參考更多詳細信息

改變顏色,例如

class MyDrawPanel extends JPanel { 
    private Color startColor; 
    private Color endColor; 

    // And setters or some other way 
    // to randomise the colors 

    public void paintComponent (Graphics g) { 
     Graphics2D g2d = (Graphics2D) g; 

     GradientPaint gradient = new GradientPaint(70, 70, startColor, 150, 150, endColor); 
     g2d.setPaint(gradient); 
     g2d.fillOval(0, 0, this.getWidth(), this.getHeight()); 

    } 
} 

退房Painting in AWT and Swing

2

這是因爲setText()方法在內部調用repaint()如果新文本與舊文本不相同。因此,無論您何時單擊該按鈕,都會導致顏色變化。

+1

SetText並不能保證其他組件都需要重新繪製(是的,標籤需要重新繪製),真正的罪魁禍首可能是標籤大小的變化,這導致容器層次結構的級聯失效,這將導致其他容器在那裏重新繪製內容...但是你的陳述更短;) – MadProgrammer