11

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

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

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

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

更新: ご回答いただきありがとうございます。彼らは、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();
    }
}

これにより、モーダル ダイアログ内のモーダル ダイアログも可能になります。

ご助力いただきありがとうございます!

4

3 に答える 3

14

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

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();
            }
        });
    }
}
于 2012-06-25T14:14:02.890 に答える
5

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

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

Window ancestor = SwingUtilities.getWindowAncestor(this);

また

Window ancestor = (Window) this.getTopLevelAncestor();
于 2012-06-25T14:03:33.613 に答える
1

現在は 2021 年で、質問が投稿されてから約 8.5 年後ですが、2012 年にさかのぼりますが、今でもはるかに簡単な解決策は、所有者としてを作成JDialogすることです。DialogJava には、所有者を持つ 5 つの同様のコンストラクターと所有者を持つ 5 つの同様のコンストラクターの隣に、提供する Dialog 所有者を持つ 5 つのコンストラクターがあります。FrameWindow

OP がおそらく直面した問題はJDialog、Netbeans またはその他の IDE のデフォルト テンプレートでした。Netbeans (12.2) は、これを新しいJDialog フォームのテンプレートとして提供しています... :

public class NewJDialog extends javax.swing.JDialog {

    /**
     * Creates new form NewJDialog
     */
    public NewJDialog(java.awt.Frame parent, boolean modal) {
        super(parent, modal);
        initComponents();
    }

Dialogaのデフォルト オプションの代わりに、所有者としてa を使用するようにコンストラクタのシグネチャを変更するだけFrameです。

public class NewJDialog extends javax.swing.JDialog {

    /**
     * Creates new form NewJDialog
     */
    public NewJDialog(java.awt.Dialog parent, boolean modal) {
        super(parent, modal);
        initComponents();
    }

そして、あなたは去ります。

于 2021-01-18T04:57:12.067 に答える