在用户交互上显示TextField

时间:2013-02-13 22:04:27

标签: java swing

我想仅当用户在输入字段中输入值时显示TextField

这是我的代码:

import java.awt.BorderLayout;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import javax.swing.JFrame;
import javax.swing.JTextField;

public class PlayingAround {

    JFrame frame;
    JTextField display;
    JTextField input;

    public static void main(String[] args) {
        PlayingAround obj = new PlayingAround();
        obj.create();
    }

    private void create() {
        frame = new JFrame();
        display = new JTextField();
        input = new JTextField();
        display.setEditable(false);
        display.setVisible(false);

        input.addKeyListener(new Listener());
        frame.add(BorderLayout.NORTH, display);
        frame.add(BorderLayout.SOUTH, input);

        frame.setSize(300, 300);
        frame.setVisible(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }

    class Listener implements KeyListener {

        @Override
        public void keyTyped(KeyEvent e) {
        }

        @Override
        public void keyPressed(KeyEvent e) {
        }

        @Override
        public void keyReleased(KeyEvent e) {
            display.setVisible(true);
            display.setText(input.getText());
        }
    }
}

但我的问题是 显示JTextField 在看到调整窗口大小,最小化和最大化窗口等事件之前不会显示

我尝试在keyReleased方法中调用 frame.repaint(),但即使它没有帮助。

1 个答案:

答案 0 :(得分:4)

在将文本字段组件放入容器后,应该在包含JTextField的容器上调用revalidate()repaint()revalidate()调用向容器的布局管理器发送请求以重新布局其组件。然后repaint()请求绘图管理器的JVM请求重新绘制新布局的容器及其子组件。重绘()并不总是需要,但通常是一个好主意。

此外,不要为此使用KeyListener,而是在第一个文本组件的Document上使用DocumentListener。这样,如果用户清空了第一个文本组件,则可以根据需要使第二个文本组件消失。此外,可以在没有按键的情况下输入文本,并且您希望允许该文本。