我通过编程用户界面遇到问题。我正在使用Swing。
我开始用5个标签创建一个Tabpane
标签1包含:Button1和textarea
标签2包含:Button2和textarea
标签3包含:Button3和textarea
标签4包含:Button4和Panel1
标签5包含:Button5和Panel2
这个类MyClass实现了ActionListener接口,并且方法actionPerformed被覆盖了(短版本):
public class MyClass implements ActionListener {
// Creating UI ... and so on
public void actionPerformed(ActionEvent e) {
if (e.getSource() == button1) {
//do something
}
// Exactly the same for button2 and button3
if (e.getSource() == button4) {
panel1.repaint(); // PANEL 1
}
if (e.getSource() == button5) {
panel2.repaint(); // PANEL 2
}
}
}
我有两个类Panel1和Panel2,它们扩展了JPanel类。
public class Panel1 extends JPanel {
protected Panel1() {
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
//DRAW SOMETHING ON PANEL1
}
}
Panel2的类看起来与此类完全相同,但在panel2上绘制了一些内容。
我现在的问题是:
在MyClass中,我已经为它创建了UI及其所有组件。这包括5个按钮。在这5个按钮中的每一个上我都调用了这个方法: buttonX.addActionListener(new MyClass());
完全按照actionPerformed() - 方法中的定义执行。
如果我将此ActionListener添加到button1-3:一切正常
如果我将这个ActionListener添加到button1-4(不是5):button1-3做他们应该做的事情,button4正确重新绘制Panel1。
如果我将这个ActionListener添加到button1-3和5(不是4):button1-3做他们应该做的事情,button5正确重新绘制Panel2。
但是,如果我将此ActionListener添加到button1-5:button1-3做他们应该做的事情,button5正确重新绘制Panel2。但是button4什么也没做!所以Panel1没有重新粉刷!
有人可以解释一下,为什么button1-3总能工作; button4和button5工作,如果我将ActionListener添加到这两个按钮中的一个;但是如果我将ActionListener添加到所有5个按钮,那么button4不起作用?!
谢谢你们的帮助
最好的问候
亚历
答案 0 :(得分:2)
您不应该让GUI类实现侦听器接口,因为它会导致具有高耦合和低内聚的类。相反,请考虑为简单的一次性侦听器代码使用匿名内部类。例如:
button4.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
panel1.repaint();
}
});
说完这个之后,我担心你的ActionListener就这么简单了,并告诉我你在panel1' paintComponent(Graphics g)
方法中已经进行了一些类状态改变。请理解您无法完全控制何时或甚至调用paintComponent,并且您也不想使用非绘制代码来阻止此方法,因此您将希望保持所有类状态 - 改变代码的方法。
答案 1 :(得分:0)
我完全不明白你的问题是什么,但试着改变
buttonX.addActionListener( new MyClass() );
到
buttonX.addActionListener(this);