web-dev-qa-db-ja.com

別のモーダルJDialogの上にモーダルJDialogを作成する方法

JDialogであるモーダル設定ダイアログがあります。この設定ウィンドウに、JDialogでもあるさらに別のモーダル設定ダイアログへのボタンを含むいくつかのコンポーネントを配置しました。モーダルダイアログを作成する唯一の方法であるため、JDialogsを作成しました。

問題はこれです:メイン設定ダイアログを作成するとき、親フレームなしまたは親フレームありのいずれかでJDialogを作成する必要があります。私のメインウィンドウはJFrameなので、それをメイン設定ダイアログコンストラクターに渡すことができます。しかし、メイン設定ダイアログを親として持つべき2番目のモーダル設定ダイアログを作成したい場合、JDialogの(J)フレームを取得する方法が見つかりません。そのメイン設定ダイアログを親として渡して、2番目の設定ダイアログが表示されたときにそのダイアログが中心になるようにします。 2番目の設定ダイアログには、場所を渡すためのコンストラクターがなく、JDialogのコンストラクターだけがあると仮定します。

JDialogの(J)フレームを取得する方法はありますか?セットアップに設計上の欠陥があり、これらの設定ダイアログに他のものを使用する必要がありますか? (もしそうなら、これらの代替設定ダイアログをモーダルにするにはどうすればよいですか?)

助けてくれてありがとう、エリック

更新:ご回答ありがとうございます。 JDialogの所有者が絶対に必要というわけではないことを理解させてくれました。ダイアログが閉じるまでダイアログが所有者を無効にできるようにするためにこれが必要だと思いましたが、どうやらモダリティは所有者から独立しています。また、所有者がいる場合でも、ダイアログが所有者を中心にしていないことに気付きました。そのため、私のコードは次のようになります。

public class CustomDialog extends JDialog {
    public CustomDialog(String title) {
        setModal(true);
        setResizable(false);
        setTitle(title);

        buildGUI();
    }

    public Result showDialog(Window parent) {
        setLocationRelativeTo(parent);
        setVisible(true);
        return getResult();
    }
}

これにより、モーダルダイアログでモーダルダイアログを使用することもできます。

あなたのすべての協力に感謝します!

11
FinalArt2005

問題として正確に何があるかはわかりませんが、複数のモーダルダイアログを作成する方法の例を次に示します。

import Java.awt.BorderLayout;
import Java.awt.Window;
import Java.awt.event.ActionEvent;
import Java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class TestDialog {

    protected static void initUI() {
        JPanel pane = newPane("Label in frame");
        JFrame frame = new JFrame("Title");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(pane);
        frame.pack();
        frame.setVisible(true);

    }

    public static JPanel newPane(String labelText) {
        JPanel pane = new JPanel(new BorderLayout());
        pane.add(newLabel(labelText));
        pane.add(newButton("Open dialog"), BorderLayout.SOUTH);
        return pane;
    }

    private static JButton newButton(String label) {
        final JButton button = new JButton(label);
        button.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                Window parentWindow = SwingUtilities.windowForComponent(button);
                JDialog dialog = new JDialog(parentWindow);
                dialog.setLocationRelativeTo(button);
                dialog.setModal(true);
                dialog.add(newPane("Label in dialog"));
                dialog.pack();
                dialog.setVisible(true);
            }
        });
        return button;
    }

    private static JLabel newLabel(String label) {
        JLabel l = new JLabel(label);
        l.setFont(l.getFont().deriveFont(24.0f));
        return l;
    }

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

            @Override
            public void run() {
                initUI();
            }
        });
    }
}
13
Guillaume Polet

1.お読みください Java SE 6 の新しいモダリティAPI

2.JDialogの(J)フレームを取得する方法はありますか?

Window ancestor = SwingUtilities.getWindowAncestor(this);

または

Window ancestor = (Window) this.getTopLevelAncestor();
5
mKorbel