2

私は BoxLayout を使用しており、次のようにコンポーネントを動的に削除しています。

public static void main(String[] args) {
    SwingUtilities.invokeLater(new Runnable() {

        @Override
        public void run() {
            final JFrame frame = new JFrame();
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.setLayout(new BoxLayout(frame.getContentPane(), BoxLayout.Y_AXIS));
            final JLabel l = new JLabel("remove");
            frame.add(l);
            frame.add(new JLabel("Hello2"));
            frame.add(new JLabel("Hello3"));
            frame.pack();
            frame.setVisible(true);

            new Thread() {
                public void run() {
                    Utils.sleep(1000);
                    SwingUtilities.invokeLater(new Runnable() {
                        public void run() {
                            frame.remove(l);
                            frame.repaint();
                        }
                    });
                }
            }.start();
        }
    });
}

ただし、そうすると、問題のラベルがレイアウトから削除されても、フレームのサイズを変更するまで、他のコンポーネントはそのスペースをカバーするために上に移動しません。コンポーネントを取り外した後、フレームを再描画しようとしましたが、うまくいきませんでした。ラベルは表示されなくなりましたが、以前の場所にはまだギャップがあります。

コンポーネントが削除されるたびに自動的にウィンドウのサイズを変更するという明らかに恐ろしい問題は別として、どうすれば望ましい動作を得ることができますか?

4

2 に答える 2

4

validate()onも呼び出す必要がありframeます。


SwingUtilities.invokeLater(new Runnable() {
    public void run() {
        frame.remove(l);
        frame.validate();
        frame.repaint();
    }
});
于 2011-07-27T13:21:01.397 に答える
4

1/置くrevalidate(); 前にrepaint();

Thread2/からでRunnableはなく、から呼び出したほうがよいでしょうinvokeLater()

于 2011-07-27T13:22:36.683 に答える