0

基本的に JFrame のガラス枠として設定された JPanel である独自のダイアログを作成しています。ダイアログが表示されている間は setVisible() の後のすべてのコードが実行されず、ダイアログが閉じられると setVisible() の後の残りのコードを続行する必要があるという意味で、ダイアログをモーダルにしたいと考えています。

これを実現するために、スレッドを使用してダイアログを表示しています。別のスレッドで実行されるため、SwingUtilities.invokeLater() メソッドを使用して GUI を更新する必要があることはわかっています。ただし、私のダイアログは画面に表示されません。

これが私のコード例です:

final JFrame frame = new JFrame();
frame.setBounds(0, 0, 1024, 768);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().setLayout(null);

JButton button = new JButton("Text");
button.setBounds(200, 300, 110, 50);
button.addActionListener(new ActionListener() {

    boolean dispose;

    public void actionPerformed(ActionEvent e) {
        try {
            Thread thread = new Thread(new Runnable() {
                public void run() {
                    final JPanel panelGlass = new JPanel(null);
                    panelGlass.setBounds(frame.getBounds());
                    panelGlass.setBackground(Color.red);
                    frame.setGlassPane(panelGlass);

                    JButton btnClose = new JButton("close");
                    btnClose.setBounds(100, 100, 110, 50);
                    btnClose.addActionListener(new ActionListener() {
                        public void actionPerformed(ActionEvent e) {
                            dispose = true;
                        }
                    });
                    panelGlass.add(btnClose);

                    SwingUtilities.invokeLater(new Runnable() {
                        public void run() {
                            dispose = false;
                            panelGlass.setVisible(true);
                        }
                    });

                    while (!dispose) {
                        try {
                            Thread.sleep(100);
                        } catch (InterruptedException ex) {
                            Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
                        }
                    }
                    panelGlass.setVisible(false);
                }
            });
            thread.start();
            thread.join();
        } catch (Exception ex) {
            Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
});
frame.getContentPane().add(button);

frame.setVisible(true);

ダイアログが表示されないのはなぜですか?

4

3 に答える 3

1
  • frame.getRootPane.setGlassPane

  • あなたのアイデアは良いですが、consume() イベントはキーボードから来ました。GlassPane はマウス イベントのみを消費するため、そこに KeyListener を e.consume() でのみ追加します。

  • GlassPaneでもGui全体を作成し、

  • 準備された GlassPane を表示し、次に Runnable.Thread を開始するために実行される内部アクション

  • ここで、ガラス板の乗算について 1 つ質問があります。

  • JXLayer Java6 に基づく JLayer Java7 を使用

  • あなたの質問は、SwingWorkerがJavaで実装されている理由の例を予約することです

携帯から返信

于 2012-11-01T22:12:56.940 に答える
1

それ以来、あなたはそのようにすることはできません

  • イベント ディスパッチ スレッド以外のスレッドから Swing コンポーネントにアクセスしている
  • すべての UI 描画が行われるイベント ディスパッチ スレッドは、 への呼び出しによって完全にブロックされThread.join()ます。

Java 7 のSecondaryLoopでやりたいことができるはずですが、私は使ったことはありません。

于 2012-11-01T16:15:21.253 に答える