【问题标题】:How to associate pressing "enter" with clicking button?如何将按下“输入”与单击按钮相关联?
【发布时间】:2011-06-09 20:14:43
【问题描述】:

在我的挥杆程序中,我有一个 JTextField 和一个 JButton。我想,一旦用户按下“输入”键,JButton 的 actionListener 就会运行。我该怎么做? 提前致谢。

【问题讨论】:

  • getRootPane().setDefaultButton(JButton defaultButton);

标签: java swing listener keypress


【解决方案1】:

摆脱 ActionListener。这是做听众的旧作风。毕业到行动班。诀窍是了解 InputMaps 和 ActionMaps 的工作原理。这是 Swing 的一个独特功能,非常棒:

http://download.oracle.com/javase/tutorial/uiswing/misc/keybinding.html

你是这样做的:

JPanel panel = new JPanel();
panel.setLayout( new TableLayout( ... ) );
Action someAction = new AbstractAction( "GO" )  {
    public void actionPerformed() {
    }
};

InputMap input = panel.getInputMap( JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT );

input.put( KeyStroke.getKeyStroke( "enter", "submit" );
panel.getActionMap().put("submit", someAction );

panel.add( button = new JButton( someAction ) );
panel.add( textField = new JTextField( ) );

使用 WHEN_ANCESTOR_OF_FOCUSED_COMPONENT 允许面板从它的任何子(即祖先)接收键盘事件。因此,无论哪个组件具有焦点,只要它在面板内,击键都会调用 ActionMap 中“提交”下注册的任何操作。

这允许您通过共享菜单、按钮或击键来重复使用操作。

【讨论】:

  • 键绑定在许多情况下都很有用,但当您可以使用提供的其他更简单的解决方案(尽管可能在后台使用键绑定)时,对于当前问题来说并不算过分。跨度>
  • 取决于作者没有指定这是在对话框本身还是在主 UI 上。使用 setDefaultButton() 假定它是对话框中唯一的东西。更不用说理解 Actions 以及它们如何与 Swing 工具包的其余部分相关了,这会让您进一步了解其他主题,例如菜单绑定、全局击键和自定义默认组件的键映射。另外,任何使用 ActionListeners 的人都需要知道 Action 在所有情况下都是优越的。
  • "任何使用 ActionListeners 的人都需要意识到 Action 在所有情况下都是优越的。" ——嗯,我被教导说所有的概括都是错误的。 :)
  • 一旦使用 Actions,就永远不会使用 ActionListener。 :-) 严重的是,ActionListener 在集成、易用性和集中功能方面已被 Action 取代,这些功能使用 ActionListener 更难管理。
  • @chubbard:“因此,您应该注意只在需要其好处的地方使用Actions,并在其他地方使用简单的 ActionListener。”— download.oracle.com/javase/6/docs/api/javax/swing/Action.html
【解决方案2】:

这里有一个例子

http://www.java2s.com/Code/Java/Swing-JFC/SwingDefaultButton.htm

这就是你需要的:rootPane.setDefaultButton(button2);

【讨论】:

    【解决方案3】:

    JRootPane 有一个方法 setDefaultButton(JButton button) 可以做你想做的事。如果你的应用是 JFrame,它实现了 RootPaneContainer 接口,你可以通过在 JFrame 上调用 getRootPane() 来获取根窗格,然后在返回的根窗格上调用 setDefaultButton。相同的技术适用于 JApplet、JDialog 或任何其他实现 RootPaneContainer 的类。

    【讨论】:

    • 这仅在您初始化您计划使用 .getRootPane() 的组件后才有效吗?如果是这样,那意味着我不能将它直接构建到该组件的构造函数中,是吗?
    • @LucasMorgan:你需要一个 JRootPane 才能工作,这是有道理的。否则,您可能需要使用键绑定。
    猜你喜欢
    • 2016-03-07
    • 1970-01-01
    • 2011-05-04
    • 2016-05-06
    • 1970-01-01
    • 2018-01-13
    • 1970-01-01
    • 2019-10-24
    • 1970-01-01
    相关资源
    最近更新 更多