我無法獲得下面鏈接的代碼,無法完成我想要的操作。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註冊。點擊時的顏色按鈕應該用隨機的顏色畫一個圓圈,點擊時的標籤按鈕應該在文本「我是標籤」和「那個傷害」之間切換。
現在,我遇到的問題是標籤按鈕。點擊它時,它不僅會更改文本(如預期的那樣),還會重繪圓圈。這個按鈕不應該重畫圈子。顏色按鈕按預期工作。
SetText並不能保證其他組件都需要重新繪製(是的,標籤需要重新繪製),真正的罪魁禍首可能是標籤大小的變化,這導致容器層次結構的級聯失效,這將導致其他容器在那裏重新繪製內容...但是你的陳述更短;) – MadProgrammer