Java:如何删除匿名ActionListeners?

时间:2017-01-22 14:39:11

标签: java actionlistener

我正在为学校创建一个测验。这些问题有几个按钮,当按下这些按钮时,会显示新问题,并为4个答案的按钮创建4个不同的ActionListeners。 现在我需要在按下一个按钮后删除4 ActionListeners。 我可以从按钮本身中删除ActionListener,但我也要删除其他3 ActionListeners

每个新的ActionListener都是这样的:

btAnswer1.addActionListener(new java.awt.event.ActionListener()
    {
        @Override
        public void actionPerformed(java.awt.event.ActionEvent evt)
        {
            lResult.setForeground(Color.red);
            lResult.setText("Wrong Answer :(");
            // The team is changed.
            if (aktTeam == 1)
            {
                aktTeam = 2;
                lAktTeam.setText("Team 2");
            }
            else
            {
                 aktTeam = 1;
                lAktTeam.setText("Team 1");
            }
            // Here, this ActionListener is removed. But the others should
            // be removed too.
            btAntwort1.removeActionListener(this);
        }
    });

我希望有人可以提供帮助。 :)

编辑:由davidxxx解决。谢谢!

1 个答案:

答案 0 :(得分:3)

1)在你的例子中,你没有从你添加了听众的那个btn中移除btAnswer1

您将其添加到btAnswer1.addActionListener(new java.awt.event.ActionListener()...

btAntwort1

但是您将其从btAntwort1.removeActionListener(this);

中删除了
ActionListener

所以,它应该不起作用。

  

现在我需要在一个按钮后删除4个ActionListener   按压。

2)如果删除与Button关联的所有for( ActionListener listener : btAntwort1.getActionListeners() ) { btAntwort1.removeActionListener(listener); } 在我们的用例中有效,您可以这样做:

ActionListener

否则,如果您不想删除与该按钮关联的所有ActionListener,则不应内联匿名 ActionListener actionListenerOne = new ActionListener() { @Override public void actionPerformed(ActionEvent e) { ... } }; ActionListener actionListenerTwo = new ActionListener() { @Override public void actionPerformed(ActionEvent e) { ... } }; 个实例,以便在需要时保留对它们的引用从按钮中删除它们。
例如,这样做:

ActionListener

现在,您可以在可能添加到按钮的JButton button = ...; button.addActionListener(actionListenerOne); button.addActionListener(actionListenerTwo); 个实例上找到两个引用。

所以你可以这样做:

button.removeActionListener(actionListenerOne);
button.removeActionListener(actionListenerTwo);

以后:

modeles[i] = line;