2

Swing アプリケーションをコーディングするときはいつもこれに問題があります。動作するようになるまでいじくりまわすのではなく、最終的に決定的な答えを得るだろうと考えました...

私はJFrameを持っています。この JFrame 内には JButton があります。ActionListener では、JFrame をほとんど空にして、1 つまたは 2 つのコンポーネントを残します (これには、JButton の削除が含まれます)。ActionListener が終了するまでコンポーネントを削除できないため、アプリケーションはフリーズします。どうすればそれを回避できますか?

4

2 に答える 2

6

コンポーネントを削除するときは、コンテナーvalidate()で andを呼び出すことを忘れないでください。問題なく動作するはずです。repaint()

import java.awt.Component;
import java.awt.Container;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import javax.swing.AbstractAction;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;

public class RemoveDemo {

    static class RemoveAction extends AbstractAction{
        private Container container;

        public RemoveAction(Container container){
            super("Remove me");
            this.container = container;
        }

        @Override
        public void actionPerformed(ActionEvent e) {
            container.remove((Component) e.getSource());
            container.validate();
            container.repaint();    
        }
    }

    private static void createAndShowGUI() {
        final JFrame frame = new JFrame("Demo");
        frame.setLayout(new FlowLayout());
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        RemoveAction action = new RemoveAction(frame);
        frame.add(new JButton(action));
        frame.add(new JButton(action));

        frame.pack();
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                createAndShowGUI();
            }
        });
    }
}
于 2012-07-26T03:42:42.853 に答える
3

イベント キューEventQueue.invokeLater()に適切なものを追加するために使用します。Runnable「保留中のすべてのイベントが処理された後に発生します」。

于 2012-07-26T03:48:45.250 に答える