重点组件参考

我正在研究一个简单的基于java swing的应用程序。 如何获取和设置表单当前聚焦的textfield / textarea的文本?

我知道如何确定哪个组件具有焦点,但我无法弄清楚如何获取组件的选定文本。 我使用getFocusOwner()但它返回一个Component,因此不实现方法getSelectedText()。 我是否需要进行类型转换?

是:

 Component focusOwner = ... if(focusOwner instanceof JTextComponent) { // a textfield or textarea is focused JTextComponent textComp = (JTextComponent) focusOwner; String s = textComp.getText(); } 

我使用getFocusOwner()但它返回一个Component,因此不实现方法getSelectedText()。 我是否需要进行类型转换?

其中一种方法是测试instanceof @ user1235867 +1

另一个也是最有效的是帮助J/Components数组,并且可以简单地确定哪个J/ComponentWindow有当前的KeyboardFocusManager#getFocusOwner()

使用FocusOwner切换两个顶级容器之间的通知是非常异步的,需要将事件包装到invokeLater

 import javax.swing.*; import java.awt.*; import java.awt.event.*; //http://www.coderanch.com/t/342205/GUI/java/Tab-order-swing-components public class Testing { private static final long serialVersionUID = 1L; private Component[] focusList; private int focusNumber = 0; private JFrame frame; public Testing() { JTextField tf1 = new JTextField(5); JTextField tf2 = new JTextField(5); JTextField tf3 = new JTextField(5); JButton b1 = new JButton("B1"); JButton b2 = new JButton("B2"); tf2.setEnabled(false); focusList = new Component[]{tf1, b1, tf2, b2, tf3}; JPanel panel = new JPanel(new GridLayout(5, 1)); panel.add(tf1); panel.add(b1); panel.add(tf2); panel.add(b2); panel.add(tf3); frame = new JFrame(); frame.setFocusTraversalPolicy(new MyFocusTraversalPolicy()); frame.add(panel); frame.pack(); frame.setLocation(150, 100); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setVisible(true); KeyboardFocusManager.getCurrentKeyboardFocusManager().addKeyEventDispatcher(new KeyEventDispatcher() { public boolean dispatchKeyEvent(KeyEvent ke) { if (ke.getID() == KeyEvent.KEY_PRESSED) { if (ke.getKeyCode() == KeyEvent.VK_TAB) { Component comp = KeyboardFocusManager.getCurrentKeyboardFocusManager().getFocusOwner(); if (comp.isEnabled() == false) { if (ke.isShiftDown()) { KeyboardFocusManager.getCurrentKeyboardFocusManager().focusPreviousComponent(); } else { KeyboardFocusManager.getCurrentKeyboardFocusManager().focusNextComponent(); } } } } return false; } }); } private class MyFocusTraversalPolicy extends FocusTraversalPolicy { public Component getComponentAfter(Container focusCycleRoot, Component aComponent) { focusNumber = (focusNumber + 1) % focusList.length; return focusList[focusNumber]; } public Component getComponentBefore(Container focusCycleRoot, Component aComponent) { focusNumber = (focusList.length + focusNumber - 1) % focusList.length; return focusList[focusNumber]; } public Component getDefaultComponent(Container focusCycleRoot) { return focusList[0]; } public Component getLastComponent(Container focusCycleRoot) { return focusList[focusList.length - 1]; } public Component getFirstComponent(Container focusCycleRoot) { return focusList[0]; } } public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable() { @Override public void run() { Testing testing = new Testing(); } }); } }