1

モーダル ダイアログundecoratedに奇妙な問題がありますJFrame

メインの装飾なしを作成するJFrameと、 のおかげでモーダル ダイアログが表示されJOptionPane、すべてがうまくいきます。モーダル ダイアログが常に一番上に表示されたままになり、メインの名声をクリックできません。

しかし、別のものJFrame(または別のものJDialog) を作成すると、モーダル ダイアログは依然としてメイン フレームとの対話を妨げますが、モーダル ダイアログは常に上部にあるとは限らず、クリックするとメイン フレームの下に移動します。

この問題は発生しません:

  • メインフレームが装飾されている場合
  • または、2 番目のフレームが表示されていない場合

編集

私はeで使用jdk1.7.0.0_09Linux Susますが、同じ結果が得られますjre 1.6.0_32

テストに使用したコード:

 public static void main(String[] args) {
    // creates main frame and set visible to true
    final JFrame mainFrame = new JFrame();
    mainFrame.setUndecorated(true); // if I comment this line, everything goes well
    mainFrame.add((new JPanel()).add(new JButton("OK")));
    mainFrame.setSize(new Dimension(500, 500));
    mainFrame.setVisible(true);
    // creates a dialog and set visible to true
    JFrame anotherFrame = new JFrame();
    anotherFrame.setVisible(true); // or if I comment this line, everything goes well too
    // display a modal dialog
    JOptionPane.showMessageDialog(mainFrame, "A message");
}
4

1 に答える 1

4

しかし、別の JFrame (または別の JDialog) を作成すると、モーダル ダイアログは依然としてメイン フレームとの対話を妨げますが、モーダル ダイアログは常に上部にあるとは限らず、クリックするとメイン フレームの下に移動します。

  • まったく当てはまりません。JOptioPane が表示されるまで、両方にアクセスできません。

  • JOptionPane または JDialod.setModal(true) は、現在の JVM から呼び出されるすべてのウィンドウへのマウスまたはキー イベントをブロックします。

  • あなたの質問から明確でない何かがあるに違いありません、残りのコード、マイナーはJavaバージョンとネイティブOSである可能性があります

ここに画像の説明を入力

Java6(winxp)のコード、Win7 / Java7(x.x_011)で動作します

import java.awt.Dimension;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;

public class Main {

   private JFrame mainFrame = new JFrame();
   private JFrame anotherFrame = new JFrame();

    public Main() {
        mainFrame.setUndecorated(true);
        mainFrame.add((new JPanel()).add(new JButton("OK")));
        mainFrame.setSize(new Dimension(100, 60));
        mainFrame.setVisible(true);
        mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        anotherFrame.setVisible(true);
        anotherFrame.setLocation(110, 0);
        anotherFrame.setSize(new Dimension(100, 60));
        anotherFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        JOptionPane.showMessageDialog(mainFrame, "A message");
    }


    public static void main(String[] args) {
       java.awt.EventQueue.invokeLater(new Runnable() {

            public void run() {
                Main main = new Main();
            }
        });
    }
}  
于 2013-02-01T12:07:07.807 に答える