Java - 请求专注于当前元素



>我遇到了一个问题,我对输入字段进行了正则表达式检查,如果输入不是应有的,我按 tab 键检查并通常移动到下一个元素,它应该停留在当前字段。但是由于正常的选项卡策略,它会移动到下一个元素,即使我请求将焦点放在当前元素上,它仍然会移动到下一个元素。

感谢您事先的帮助:)

这是我的代码片段:

}else if(comp.getName().equals("input_dauer")){
    System.out.println("Test3");
    final Pattern pattern = Pattern.compile("^[\d]{0,}[,.]+[\d]{1,3}$");
    if (!pattern.matcher(input_dauer.getText()).matches()) {
        lblDauer.setForeground(Color.red);
        MandatoryDauer = 0;
        comboBox_aktivitaet.requestFocus();
        input_dauer.requestFocus();
    }
    else{
    lblDauer.setForeground(Color.decode("#1E2F3F"));
    MandatoryDauer = 1;
    textArea_beschreibung.requestFocus();
    }
您可以使用

setFocusTraversalKeysEnabled(false)禁用JTextField(或任何Component(的焦点遍历键,并在需要时手动传输焦点。

在以下示例中,如果文本的长度小于 5 个字符,则将其视为无效,因此我们不会转移焦点。

如果它是有效的(长度>=5(,我们用transferFocus()转移焦点,如果我们想坚持逻辑焦点顺序,或者requestFocus()转移到特定的组件。

添加了虚拟按钮,以便您可以观察焦点行为。

JPanel contentPane = new JPanel();
JFrame fr = new JFrame();
JButton someButton = new JButton("Button");
JTextField textField = new JTextField(10);
textField.setFocusTraversalKeysEnabled(false);
textField.addKeyListener(new KeyAdapter() {
    @Override
    public void keyPressed(final KeyEvent ke) {
        JTextField source = (JTextField) ke.getSource();
        if (ke.getKeyCode() == KeyEvent.VK_TAB) {
            if (source.getText().length() >= 5) {
                System.out.println("Tab with valid text, transferring focus");
                source.transferFocus();// or someButton.requestFocus()
            } else {
                System.out.println("Tab with invalid text");
            }
        }
    }
});

contentPane.add(textField);
contentPane.add(someButton);
fr.setContentPane(contentPane);
fr.pack();
fr.setVisible(true);

最新更新