在两个面板上重新油漆不能在第二个面板上工作



我在编写用户界面时遇到了一个问题。我正在使用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什么也没做!所以面板1没有重新粉刷!

谁能解释一下,为什么按钮1-3总是工作;button4和button5工作,如果我添加ActionListener只是这两个按钮之一;但是button4不工作,如果我添加ActionListener到所有5个按钮?!

感谢大家的帮助

问好亚历克斯

不应该让GUI类实现侦听器接口,因为这会导致类具有高耦合和低内聚性。相反,可以考虑为简单的一次性侦听器代码使用匿名内部类。例如:

button4.addActionListener(new ActionListener() {
  public void actionPerformed(ActionEvent e) {
    panel1.repaint();
  }
});

说到这里,我担心如果你的ActionListener是这么简单,并建议我,你有一些类的状态变化正在panel1的paintComponent(Graphics g)方法。请理解,你不能完全控制何时甚至是否调用paintComponent,而且你也不想用非绘画代码阻碍这个方法,所以你会想把所有改变类状态的代码从这个方法中删除。

我不明白你到底是什么问题,但试着改变

buttonX.addActionListener( new MyClass() );

buttonX.addActionListener(this);

相关内容

  • 没有找到相关文章