【问题标题】:Java MouseEvent left click inside actionPerformedJava MouseEvent左键单击actionPerformed
【发布时间】:2014-10-03 12:44:30
【问题描述】:

我的动作中有一个 MouseListener,该动作对应于一个 JButton。鼠标事件适用于右键单击事件,但对于左键单击事件它似乎没有重置我的鼠标事件,因此每次左键单击都会播放它之前的每个左键单击鼠标事件。因此,第一次左键单击将使我的数字增加 1,第二次将其增加 2,第三次增加 3,第四次增加 4,依此类推。它应该每次只增加 1。我做了一些调试,似乎每次左键单击组件的历史记录都会调用左键单击功能。

有什么想法吗?

private void setupActions()
{
    oneAction = new AbstractAction( "1" )
    {
       @Override
        public void actionPerformed( ActionEvent e )
        { 

          ((JButton)e.getSource()).addMouseListener(new MouseAdapter() 
            { 
                @Override
                public void mouseClicked( MouseEvent e )
                {
                   if ( SwingUtilities.isLeftMouseButton(e) )
                    {
                        Integer quantityField = (Integer) model.getValueAt(0, 3);
                        if ( quantityField == null || quantityField == 0)
                        {
                            quickOrderTableModel.setValueAt(1, 0, 3);
                        }
                        else 
                        {
                            Integer newValue = (quantityField + 1);
                            quickOrderTableModel.setValueAt(newValue, 0, 3);
                        }

                    }
                    if ( SwingUtilities.isRightMouseButton(e) )
                    {

                        Integer quantityField = (Integer) model.getValueAt(0, 3);
                        if ( quantityField == null || quantityField == 0)
                        {
                            quickOrderTableModel.setValueAt(0, 0, 3);     
                        }  
                        else
                        {
                            Integer newValue = (quantityField - 1);
                            quickOrderTableModel.setValueAt(newValue, 0, 3); 
                        }

                    }
                }

            });
        }

    };

【问题讨论】:

  • 如果单击按钮,则调用方法 actionPerformed( ActionEvent e )。每次如果发生这种情况,您就向按钮添加一个新的 MouseListener。因此,如果您第一次单击该按钮,则它有一个 MouseListener。如果您第二次单击该按钮,则它有两个 MouseListener。如果您第三次单击该按钮,则它具有三个 MouseListener...

标签: java swing events action mouselistener


【解决方案1】:

我做了一些调试,似乎左键功能是 每次左键单击组件的历史记录时调用。

问题是每次按下按钮时你都会添加一个新的MouseListener

@Override
public void actionPerformed( ActionEvent e ) {
    ((JButton)e.getSource()).addMouseListener(new MouseAdapter() {...});
}

因此,您将调用每个附加到按钮的侦听器。

另一方面,如果目标是根据按下的鼠标按钮增加/减少某个计数变量,那么您根本不需要ActionListener:只需添加一次鼠标侦听器即可:

JButton button = new JButton("1");
button.addMouseListener(new MouseAdapter() {...});

但是,IMO 最好的方法是使用两个按钮,实现两个不同的操作,然后忘记鼠标侦听器。

【讨论】:

  • 为什么这适用于右键单击并且每次只增加一个但左键单击每次都会添加一个新的鼠标侦听器。
  • 因为右键单击(辅助按钮)不会触发动作事件,而左键单击(主按钮)会触发。因此,在左键单击时,新的鼠标侦听器会附加到按钮上,而在右键单击时不会发生。@user4105771
猜你喜欢
  • 2014-04-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-03
  • 2019-05-03
  • 2015-10-11
  • 1970-01-01
相关资源
最近更新 更多