【问题标题】:Send Action to button who is listening for it向正在监听它的按钮发送操作
【发布时间】:2013-06-28 13:53:44
【问题描述】:

我有一个带有动作监听器的 JButton。

btn_.addActionListener(new ActionListener()
{
    @Override
    public void actionPerformed(ActionEvent e)
    {
        // DO STUFF
    }
}

我有一个监听关键事件的 JSpinner。

spn_.addKeyListener(new KeyAdapter()
{
    @Override
    public void keyPressed(KeyEvent e)
    {
        if(e.getKeyCode() == KeyEvent.VK_ENTER)
        {
            System.out.println("Someone pressed enter key");
        }
    }
});

我想做的是,每当用户在选择微调器时按下回车键,我希望它执行按钮执行的任何命令。 是的,我知道我可以简单地为操作按钮提供一个功能,然后在用户按下回车键时执行相同的功能。我之所以这么问,是因为我很好奇 Swing 中的组件是否可以相互发送动作以及如何发送动作,而不是正确的编程方式。

【问题讨论】:

  • 对于 Swing,通常在基于 AWT 的较低级别 KeyListener 上使用键绑定。有关如何使用它们的详细信息,请参阅How to Use Key Bindings

标签: java swing jbutton actionlistener keylistener


【解决方案1】:

是的,我知道我可以简单地为操作按钮提供一个功能,然后在用户按下回车键时执行相同的功能。我之所以问这个问题是因为我很好奇 Swing 中的组件是否可以相互发送动作以及如何发送动作,而不是正确的编程方式。

如果你暗示执行一个函数是正确的方法,我认为这不是解决问题的最佳方法。

正确的方式是共享Action,而不是你调用的方法。

您根本不应该在此解决方案中使用 KeyListener。一般的解决方案是使用键绑定。阅读How to Use Key Bindings 上的 Swing 教程了解更多信息。

但是,在您的情况下,它甚至更容易一些,因为您可以共享 ActionListener:

ActionListener al = new ActionListner() {...}

JTextField editor = ((JSpinner.DefaultEditor)spinner.getEditor()).getTextField();
editor.addActionListener(al);
button.addActionListener(al);

【讨论】:

  • 你能保证actionPerfomed 会首先被调用到editor,而不是button吗?
  • 这是两个不同的组件。用户只会将注意力集中在微调器或按钮上。
  • 是的,我已多次阅读该问题。无论您单击按钮还是使用微调器上的 Enter 键,都会调用相同的 ActionListener。这就是您在 Swing 中重用代码的方式。阅读关于键绑定的教程以更好地理解这个概念。
  • 我希望我在写答案时能如此认真地对待这件事:)。您的解决方案是完美的... +1
【解决方案2】:

使用JButton的doClick()方法:

btn_.doClick()

keyPressed内如下:

spn_.addKeyListener(new KeyAdapter()
{
    @Override
    public void keyPressed(KeyEvent e)
    {
        if(e.getKeyCode() == KeyEvent.VK_ENTER)
        {
            btn_.doClick()
        }
    }
});

oracle doc 中指定的doClick() 方法:

以编程方式执行“点击”。这与 用户按下并释放按钮。

【讨论】:

  • 是的,这行得通,但这不是解决问题的方法。 ActionListener 应该是共享的。不要使用 KeyListener,这不是 Swing 设计的工作方式。
  • @camickr 明白了,谢谢。下次回答时会照顾好...:)
【解决方案3】:
spn_.addKeyListener(new KeyAdapter()
{
    @Override
    public void keyPressed(KeyEvent e)
    {
        if(e.getKeyCode() == KeyEvent.VK_ENTER)
        {
            btn_.doClick(); // fires the actionPerfomed on the button
        }
    }
});

【讨论】:

  • 它回答了问题,但不是解决问题的首选方法。
  • 我认为,它实际上是:)
  • 查看 Andrew 对原始问题的评论。尽管答案已被接受,但我们都花时间发表评论,因为我们试图鼓励人们按照设计使用 Swing 的方式使用。
猜你喜欢
  • 2013-12-24
  • 1970-01-01
  • 1970-01-01
  • 2016-04-19
  • 1970-01-01
  • 2016-08-27
  • 2021-02-15
  • 1970-01-01
相关资源
最近更新 更多