Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在java中调用repaint后,将重复ActionPeformed_Java_Swing_Repaint - Fatal编程技术网

在java中调用repaint后,将重复ActionPeformed

在java中调用repaint后,将重复ActionPeformed,java,swing,repaint,Java,Swing,Repaint,我在面板中有一个名为“撤消”的按钮,下面是代码。我的问题是,单击“撤消”后,需要执行的操作会重复。 在我将撤销初始化代码放入Jpanel的构造函数后,我解决了这个问题。我知道这与重绘有关,也可能与线程有关,但如果可能的话,我希望有一个更清晰的爆炸,以便更好地理解 public void paintComponent(Graphics g) { /* * Some other actions. */ undo.setLocation(535 , 680);

我在面板中有一个名为“撤消”的按钮,下面是代码。我的问题是,单击“撤消”后,需要执行的操作会重复。 在我将撤销初始化代码放入Jpanel的构造函数后,我解决了这个问题。我知道这与重绘有关,也可能与线程有关,但如果可能的话,我希望有一个更清晰的爆炸,以便更好地理解

public void paintComponent(Graphics g)
{
    /*
    * Some other actions. 
    */
    undo.setLocation(535 , 680);
    undo.setSize(100 , 40);
    undo.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) 
            {
                System.out.println("Inside Action Performed");
                gameBoard.undoMove();
                repaint();
            }
        });
    add(undo);
}

切勿在paint方法内注册侦听器。每次重新绘制组件时,都会注册一个额外的侦听器!在设置组件时,应该只在程序中添加一次动作侦听器。在本例中,每次绘制组件时都要添加一个动作侦听器。因此,在数百个按钮上会有数百个动作侦听器。在
paintComponent
@Berger之外执行此操作对我来说似乎是一个答案,我认为您可以添加它@Joan还
paintComponent
设置
undo
的位置和大小???哎哟
paintComponent
应该只执行它所说的操作:绘制组件。