1

ユーザーが入力フィールドに値を入力した場合にのみ 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());
        }
    }
}

しかし、私の問題は、ウィンドウのサイズ変更、ウィンドウの最小化と最大化などのイベントが発生するまでDisplay JTextFieldが表示されないことです。

keyReleased メソッドでframe.repaint()を呼び出してみましたが、それでも解決しませんでした。

4

1 に答える 1

4

テキスト フィールド コンポーネントをコンテナに配置した後、JTextField を保持するコンテナでrevalidate()andを呼び出す必要があります。repaint()このrevalidate()呼び出しは、コンテナーのレイアウト マネージャーに要求を送信して、そのコンポーネントを再レイアウトします。次にrepaint()、新しくレイアウトされたコンテナとその子コンポーネントを再描画するペイント マネージャの JVM リクエストをリクエストします。repaint() は常に必要というわけではありませんが、通常は良い考えです。

また、これには KeyListener を使用しないでください。最初のテキスト コンポーネントの Document で DocumentListener を使用してください。このようにして、ユーザーが最初のテキスト コンポーネントを空にした場合、必要に応じて 2 番目のテキスト コンポーネントを非表示にすることができます。また、キーを押さずにテキストを入力できるので、それを許可したいと考えています。

于 2013-02-13T22:06:34.940 に答える