JPanel
マウスのクリックに応答して を開きたい がありますJDialog
。コンストラクターにはのJDialog
インスタンスが必要ですが、そうではJFrame
ありませんJPanel
。これを回避するにはどうすればよいですか?
4 に答える
特にモーダルにしたい場合は、JDialog を親のダイアログまたはフレームにアタッチするようにしてください (親ウィンドウを渡すと、ダイアログがウィンドウにアタッチされ、親を持ってくると子ダイアログも一緒に表示されます)。そうしないと、ダイアログが失われたり、モーダル ダイアログが表示されずにウィンドウがブロックされたりするなど、ユーザー エクスペリエンスが大きく損なわれる可能性があります。
JPanel の親ウィンドウを見つけるために必要なのは、次のコードだけです。
JPanel panel = new JPanel();
Window parentWindow = SwingUtilities.windowForComponent(panel);
// or pass 'this' if you are inside the panel
Frame parentFrame = null;
if (parentWindow instanceof Frame) {
parentFrame = (Frame)parentWindow;
}
JDialog dialog = new JDialog(parentFrame);
...
Frame と Dialog のどちらにいるのかわからない場合は、両方のクラスに対して「instanceof」テストを行います。
パラメーターを使用しないコンストラクターを使用すると、ダイアログが所有者なしになります。パネルを所有するフレームをダイアログの所有者にするのが最善の方法だと思います。
つまり、JPanel から getParent() を使用して所有者を見つけ、見つかったこのオブジェクトを JFrame の所有者として送信する必要があるということです。
そのための大雑把なコードは次のようになります
java.awt.Container c = myPanel.getParent();
while (!(c instanceof javax.swing.JFrame) && (c!=null)) {
c = c.getParent();
}
if (c!=null) {
JFrame owner=(javax.swing.JFrame) c;
JDialog myDialog=new JDialog(owner);
}
私はこのコードをテストしていませんが、アイデアを理解するには十分です。
JOptionPane を使用することにした場合は、mouseAdapter 内部クラスを使用して JPanel に MouseListener を追加して、mouseClicked イベントを処理できます。内部クラス内からパネルにアクセスするには、パネルを final として宣言する必要があります。
final JPanel testPanel = new JPanel();
testPanel.addMouseListener(new MouseAdapter(){
public void mouseClicked(MouseEvent e)
{
JOptionPane.showMessageDialog(testPanel,"Title","InformationMessage",JOptionPane.INFORMATION_MESSAGE);
}});//end of mouseClicked method
引数を必要としないコンストラクタがあります:
JDialog dialog = new JDialog();
ダイアログをモーダルにしたい場合は、次のようなメインの JFrame の静的参照を取得できます。
JDialog dialog = new JDialog(MyMainJFrame.getInstance());