java - 如何在父组件设置为 `setVisible(false)` 后清除 JTextField 文本?

标签 java swing jtextfield componentlistener

我已将 ComponentListener 添加到 JTextField 父级,如下所示:

parent.addComponentListener(new ComponentAdapter() {
    @Override
    public void componentHidden(ComponentEvent e) {
        setText("");
    }
});

因此在parent 变得不可见之后,textField text 被设置为“”。一切正常,但问题是当我将父级设置为可见时 - 显示 textField 的先前文本几毫秒,然后字段变为空。所以不是很好..

最佳答案

在将父级设置为不可见之前,设置了textField字段textField.setText(null);(不需要重新绘制),那么问题就出在焦点上了-它必须设置为一些初始组件,如 panel.requestFocusInWindow();。但重点并不总是及时设置。所以 Timer 类解决了这个问题:

textField.setText(null);
panel.requestFocusInWindow();

final int timeout = 5;
        Timer timer = new Timer(timeout, new ActionListener() {
            int a = 0;

            @Override
            public void actionPerformed(ActionEvent e) {
                if (panel.isFocusOwner() || a > 500) {
                    EventQueue.invokeLater(new Runnable() {
                        @Override
                        public void run() {
                            setVisible(false);
                        }
                    });
                    ((Timer) e.getSource()).stop();
                }
                a += timeout;
            }
        });
        timer.setRepeats(true);
        timer.start();

现在,如果 setVisible(true); 显示为新创建的对话框窗口(父级)- 没有闪烁的文本字段并且正确聚焦。最后..:)

关于java - 如何在父组件设置为 `setVisible(false)` 后清除 JTextField 文本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18342097/

相关文章:

Java 图形 - 在 Jbutton 上绘制形状

java - 按 Enter 键将移动到下一个文本字段,例如 Tab 键?

java - EclipseLink 在 OneToMany 关系中找不到实体

java - 如何编辑特定 JButton 的数据

java - 如何自动调用方法来停止线程?

java - JTable 中的结果集

java - 通过选择 JComboBox 选项动态添加 JTextFields 和 JLabels

java - 根据按下的按钮创建不同数量的 JTextField

java - 无法从 Mac 终端执行 jshell

java - 跨越 JTable 特定列的所有行(以呈现 JTextPane)