问题 如何关联按“输入”与点击按钮?


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


1609
2018-01-16 00:58


起源

getRootPane()。setDefaultButton(JButton defaultButton); - ashubuntu


答案:


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


10
2018-01-16 01:01



这是仅在您初始化了计划使用.getRootPane()的组件后才有效吗?如果是这样,那就意味着我无法将其直接构建到该组件的构造函数中,是吗? - Lucas Morgan
@LucasMorgan:你需要一个JRootPane才能工作,这是有道理的。否则,您可能需要使用键绑定。 - Hovercraft Full Of Eels


这里有一个例子

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

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


3
2018-01-16 01:03





摆脱ActionListeners。这是做听众的旧风格。毕业于Action课程。诀窍是了解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中的“submit”下注册的任何动作。

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


2
2018-01-16 01:08



密钥绑定在许多情况下都很有用,但是当你可以使用其他更简单的解决方案(尽管可能在后台使用密钥绑定)时,对当前问题来说并不是有点过分。 - Hovercraft Full Of Eels
取决于作者没有指定这是在一个对话框本身,还是主UI。使用setDefaultButton()假设它是对话框中唯一的东西。更不用说理解动作以及它们与Swing工具包的其余部分的关系如何进一步引导其他主题,如菜单绑定,全局击键和自定义默认组件的键映射。此外,任何使用ActionListeners的人都需要注意,在所有情况下,动作都是优越的。 - chubbsondubs
“任何使用ActionListeners的人都需要注意,在所有情况下,动作都是优越的。” - 嗯,我被告知所有的概括都是错的。 :) - Hovercraft Full Of Eels
一旦你去了动作你永远不会去ActionListener。 :-)严重的ActionListeners在集成,易用性和集中使用ActionListener更难管理的功能方面被Actions取代。 - chubbsondubs
@chubbard:“出于这个原因,你应该注意只使用 Actions需要它们的好处,并在其他地方使用简单的ActionListeners。“ - download.oracle.com/javase/6/docs/api/javax/swing/Action.html - trashgod