JSpinner 按 Enter 时不转移焦点

问题描述 投票:0回答:2

下面的代码应该在任何时候按下 Enter 键后将焦点转移到下一个控件,事件触发,但 .transferFocus 没有转移焦点,可能出了什么问题? 谢谢你

//JSpinner Creation Code:
private javax.swing.JSpinner edtStockMax;   
edtStockMax = new javax.swing.JSpinner();
edtStockMax.setModel(new javax.swing.SpinnerNumberModel(Integer.valueOf(0), Integer.valueOf(0), null, Integer.valueOf(1)));

//Code to bind the Enter key
JSpinnerField1.getActionMap().put("enter-action", new AbstractAction("enter-action")
        {
            @Override
            public void actionPerformed(ActionEvent e)
            {
                System.out.println("Transfer focus inside JSpinner");
                field.transferFocus();
            }
        });

        JSpinnerField1.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT)
        .put(KeyStroke.getKeyStroke("ENTER"), "enter-action");
java swing events focus jspinner
2个回答
0
投票

您可以创建一个自定义 NumberEditor (内部)类来处理焦点更改。这是一个类的示例:

class CustomNumberEditor extends JSpinner.NumberEditor implements KeyListener{

        private JFormattedTextField textField;

        public CustomNumberEditor(JSpinner spinner){
            super(spinner);
            textField = getTextField();
            textField.addKeyListener(this);
        }

        @Override
        public void keyTyped(KeyEvent e) {
        }

        @Override
        public void keyPressed(KeyEvent e) {
            if (e.getKeyCode() == KeyEvent.VK_ENTER){
                textField.transferFocus();
            }
        }

        @Override
        public void keyReleased(KeyEvent e) {
        }
    }

您必须将其设置为您的自定义编辑器。这是代码:

final JSpinner edtStockMax = new JSpinner();
edtStockMax.setModel(new SpinnerNumberModel(0, 0, 100, 10));
edtStockMax.setEditor(new CustomNumberEditor(edtStockMax));

0
投票
   KeyboardFocusManager manager = KeyboardFocusManager.getCurrentKeyboardFocusManager();
   manager.addKeyEventDispatcher( event -> {
            if ( event.getID() == KeyEvent.KEY_PRESSED && event.getKeyCode() == KeyEvent.VK_ENTER ) {
                Component owner = manager.getFocusOwner();
                if ( owner instanceof JFormattedTextField ) {
                    if ( spinner.getEditor().getComponent( 0 ) == owner ) {
                        manager.focusNextComponent();
                        return true;
                    }
                }
            }
            return false; 
        } );
最新问题
© www.soinside.com 2019 - 2024. All rights reserved.