Java - requestFocus on current Element

时间:2017-04-13 07:42:35

标签: java focus policy

我遇到的问题是我在输入字段上检查了正则表达式,如果输入不是应该的,我按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();
    }

1 个答案:

答案 0 :(得分:0)

您可以使用JTextField禁用Component(或setFocusTraversalKeysEnabled(false)的任何内容)的焦点遍历键,并在需要时手动转移焦点。

在以下示例中,如果文字长度少于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);