gpt4 book ai didi

Java LostFocus 和 InputVerifier,按反制表顺序移动

转载 作者:行者123 更新时间:2023-12-04 05:47:11 25 4
gpt4 key购买 nike

我有一个 GUI 应用程序,它使用 InputVerifier 在产生焦点之前检查文本字段的内容。这都是很正常的。然而,昨天发现了一个问题——它似乎是一个错误,但我在任何地方都找不到任何提及。在我将此报告为错误之前,我想我会问:我是否在这里遗漏了一些明显的东西?

情况:

  • 一组带有 InputVerifiers 的文本字段。
  • FocusLost 和 FocusGained 在所有控件上的监听器,所以我可以看到发生了什么。
  • 一个单独的线程使用 DefaultKeyboardFocusManager 报告(每 2 秒)哪个控件具有焦点。
  • 我将无效数据放在表单中间的 JTextField 中,并尝试离开控件。

  • 如果我尝试使用鼠标或使用 Tab 键移开此控件,则不能。 FocusLost 事件不会触发,并且控件正确地保留了焦点。

    但是,如果我尝试以相反的 Tab 键顺序移开控件,使用 Shift-Tab,有时会触发 FocusLost 事件。如果发生这种情况,单独的线程会报告没有控件具有焦点,即 getFocusOwner() 返回 null。

    编辑:下面是一个显示问题的小示例程序。问题与额外的线程无关 - 线程只是为了使问题更加明显。如果存在竞争条件,则它在 Swing 中的某个地方。

    要查看问题,请转到第二个文本框并将其清空。控件应保持焦点,除非您按 shift-tab 键离开它。与完整的应用程序不同,错误似乎 100% 的时间都在这里发生。在 OpenJDK 6 和 Oracle Java 7 下都是如此。

    这几乎是显而易见的错误,而且它发生在多个 Java 环境中。因此,我怀疑我遗漏了一些明显的东西。任何人?
    public class FocusBugDemo extends JFrame {
    static JTextField txtOne = new JTextField("Ignore this control");
    static JTextField txtTwo = new JTextField("Delete this text, then press shift-tab");
    static JLabel lblFocus = new JLabel("");
    static KeyboardFocusManager kfm = new DefaultKeyboardFocusManager();

    public static void main(String[] args) {
    new FocusBugDemo();
    Thread t = new Thread() {
    @Override
    public void run() {
    while(true) {
    Component c = kfm.getFocusOwner();
    String focusInfo = "elsewhere";
    if (c == null) { focusInfo = "null";
    } else if (c == txtOne) { focusInfo = "txtOne";
    } else if (c == txtTwo) { focusInfo = "txtTwo";
    }
    lblFocus.setText(System.currentTimeMillis() + " - Focus owner " + focusInfo);
    try {
    Thread.sleep(1000);
    } catch (InterruptedException e) {
    }
    }
    }
    };
    t.start();
    }

    private FocusBugDemo() {
    super("Focus bug demo");
    setDefaultCloseOperation(EXIT_ON_CLOSE);
    setPreferredSize(new Dimension(300,100));
    setLayout(new GridLayout(3,1));
    NotEmpty validator = new NotEmpty();
    txtOne.setInputVerifier(validator);
    txtTwo.setInputVerifier(validator);
    add(txtOne);
    add(txtTwo);
    add(lblFocus);
    pack();
    setVisible(true);
    }

    private class NotEmpty extends InputVerifier {
    @Override
    public boolean verify(JComponent input) {
    JTextField txtField = (JTextField) input;
    return (txtField.getText().length() > 0);
    }
    }
    }

    最佳答案

    现在报告给 Oracle 作为错误 7167871 .

    关于Java LostFocus 和 InputVerifier,按反制表顺序移动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10529618/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com