focused component reference

前端 未结 3 1185
灰色年华
灰色年华 2021-01-22 22:16

I am working on a simple java swing based application. How would I get and set the text of the currently focused textfield/textarea of a form?

I know how to determine

相关标签:
3条回答
  • 2021-01-22 22:43

    Yes:

    Component focusOwner = ...
    if(focusOwner instanceof JTextComponent) { // a textfield or textarea is focused
        JTextComponent textComp = (JTextComponent) focusOwner;
        String s = textComp.getText();
    }
    
    0 讨论(0)
  • 2021-01-22 22:57

    Depending on your exact context, you might consider to use a custom TextAction: its method getTextComponent(ActionEvent) returns the most recent focused text component. A code snippet:

        Action logSelected = new TextAction("log selected") {
    
            @Override
            public void actionPerformed(ActionEvent e) {
                JTextComponent text = getTextComponent(e);
                System.out.println("selected: " + text.getSelectedText());
            }
    
        };
    
        JComponent content = new JPanel();
        content.add(new JTextField("sometext", 20));
        content.add(new JTextField("other content", 20));
        content.add(new JCheckBox("just some focusable comp"));
        content.add(new JButton(logSelected));
    
    0 讨论(0)
  • 2021-01-22 23:06

    I use getFocusOwner() but it return a Component and therefore does not implement the method getSelectedText(). Do I somehow need to do a typecast?

    one of ways is testing for instanceof @user1235867 +1

    another and most efficient is to helt arrays of J/Components and the to simple to determine which of J/Component has current KeyboardFocusManager#getFocusOwner() in the Window

    notice switching with FocusOwner betweens two Top-Level Containers is pretty asynchronous and required wrapping events into 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();
                }
            });
        }
    }
    
    0 讨论(0)
提交回复
热议问题