1

ドキュメントモーダルJDialogを閉じるときに、Java Swingで親JFrameをアクティブ化することは可能ですか?デフォルトのメカニズムは、親JFrameではなく最後のJFrameをアクティブ化するようです。これはユーザーを混乱させる可能性があります。

問題を再現するためのサンプルコードを次に示します。

1:「ステップ1:これ
を押す」ボタンを押す2:「ステップ2:これを押す」ボタンを押す
3:「ステップ3:これをアクティブにする」というタイトルでJFrameを前面に移動する
4:「」というタイトルでJDialogを閉じるステップ4:これを閉じる」

=>これで、「フレーム1」というテキストのJFrameが前面に表示されます。
=>代わりに、「ステップ3:これをアクティブにする」というテキストのJFrameが前面に表示されます。
=>閉じたJDialogはフレーム1に対してドキュメントモーダルであるため、ユーザーにとっては混乱を招きます。

    public static void main(String[] args) {
    final JFrame f1 = new JFrame("frame 1");
    f1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    f1.setLayout(new FlowLayout());
    f1.add(new JButton(new AbstractAction("step 1: press this") {

        @Override
        public void actionPerformed(ActionEvent e) {
            JFrame f2 = new JFrame("step 3: activate this");
            f2.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
            f2.setLayout(new FlowLayout());
            f2.add(new JLabel("step 3: activate this"));
            f2.pack();
            f2.setVisible(true);
        }
    }));
    f1.add(new JButton(new AbstractAction("step 2: press this") {

        @Override
        public void actionPerformed(ActionEvent e) {
            JDialog d = new JDialog(f1, "step 4: close this", ModalityType.DOCUMENT_MODAL);
            d.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
            d.setLayout(new FlowLayout());
            d.add(new JLabel("step 4: close this"));
            d.pack();
            d.setVisible(true);
        }
    }));
    f1.pack();
    f1.setVisible(true);
}

何か案は ?(f1.toFront()を手動で呼び出したくないのは、ウィンドウの「ちらつき」が短くなるためです)

よろしくマルセル

4

0 に答える 0