首页 文章

两个面板上的重绘不适用于第二个面板[关闭]

提问于
浏览
-1

我通过编程用户界面遇到问题 . 我正在使用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(NOT 5):button1-3做他们应该做的事情,button4正确重新绘制Panel1 .
如果我将这个ActionListener添加到button1-3和5(NOT 4):button1-3做他们应该做的事情,button5正确重新绘制Panel2 .
但是,如果我将此ActionListener添加到button1-5:button1-3做他们应该做的事情,button5正确重新绘制Panel2 . 但是button4什么也没做!所以Panel1没有重新粉刷!

有人可以解释一下,为什么button1-3总能工作; button4和button5工作,如果我将ActionListener添加到这两个按钮中的一个;但是如果我将ActionListener添加到所有5个按钮,button4不起作用?!

谢谢大家帮助
最好的祝福
亚历克斯

2 回答

  • 0

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

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

    说完这个之后,我担心你的ActionListener就这么简单,并向我建议你使用've got some class state-changing going on in panel1' s paintComponent(Graphics g) 方法 . 请理解,您无法完全控制何时或甚至调用paintComponent,并且您也不希望使用非绘制代码来阻止此方法,因此您需要保留所有类更改状态的代码出于这种方法 .

  • 2

    我完全不明白你的问题是什么,但试着改变

    buttonX.addActionListener( new MyClass() );
    

    buttonX.addActionListener(this);
    

相关问题