2

JDialogモダリティをモデルレスとして設定した があります。しかし、今はそれが表示されている間にモダリティを変更する必要があります。しかし、Swing では、ダイアログが表示されている間は、ダイアログのモダリティを変更できないことを知っています。それで、これを行うことができる他のトリックやコードはありますか?

4

2 に答える 2

3

Javadocの言うことをするだけです...ダイアログを非表示にして表示します。

注: 表示されているダイアログのモダリティを変更しても、非表示にしてから再度表示するまで効果がない場合があります。

それでは、実際の例を次に示します。

public class ModalDialogTest {
    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                JFrame frame = new JFrame ();
                final JDialog dialog = new JDialog(frame);
                dialog.setModal(true);

                Runnable modalSwitcher = new Runnable() {
                    @Override
                    public void run() {
                        try {
                            System.out.println("Worker thread: sleeping for 5 seconds");
                            Thread.sleep(5000);
                            System.out.println("Worker thread: sleeping finished!");
                        } catch (InterruptedException ex) {
                            // this thread is not interrupted
                        }
                        SwingUtilities.invokeLater(new Runnable() {
                            @Override
                            public void run() {
                                System.out.println("ENTERING MODALSWITCHER!");

                                dialog.setModalityType(ModalityType.MODELESS);
                                dialog.setVisible(false);
                                dialog.setVisible(true);

                                System.out.println("NO LONGER MODAL!");
                            }
                        });
                    }
                };
                new Thread(modalSwitcher).start();

                System.out.println("DIALOG WILL NOW SHOW UP:");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setVisible(true);
                dialog.setVisible(true);
                System.out.println("BYE!");
            }
        });
    }
}

5 秒後に、親 JFrame をクリックできるようになります。

これはプログラムが出力するものです:

DIALOG WILL NOW SHOW UP:
Worker thread: sleeping for 5 seconds
Worker thread: sleeping finished!
ENTERING MODALSWITCHER!
NO LONGER MODAL!
BYE!

ダイアログを表示しながらモダリティを切り替える練習を本当に続けるかどうかはあなた次第ですが、ユーザー エクスペリエンスの観点からはお勧めしません。

于 2016-02-25T08:58:36.090 に答える
-1

ダイアログ ボックスを更新して呼び出しますrepaint()。階層を変更した場合 (コンポーネントの追加/削除) を忘れないでくださいrevalidate()

于 2016-02-25T09:23:04.750 に答える