2015-04-16 134 views
1

我有以下問題:Java swing中模態窗口上的模態窗口?

我有一個主要的應用程序窗口(JFrame),填滿整個屏幕。
單擊按鈕時,會出現一個較小的窗口,讓用戶輸入一些數據。當用戶這樣做時,主窗口既不應該跳到它的前面,也不允許交互。
解決方案:打開一個模態JDialog。我們可以調用該對話框1.
但是,當點擊此對話框中的按鈕時,會彈出一個新窗口(是/否對話框),並且需要在已有模態的JDialog對話框1上運行模態試圖做到這一點,第二個對話框不斷消失在第一個之後。
我試圖讓Dialog 1成爲一個JFrame,但是當然,我放棄了「模態」位。強制對話框1仍然保持主窗口的按鈕可點擊。
我錯過了什麼?我怎樣才能把一個模態搖擺窗口在另一個模態搖擺窗口?

編輯:

開主類:

public class MainWin extends JFrame { 

public MainWin(){ 
    this.setSize(800,800); 
    JButton b = new JButton("click hehe"); 
    this.getContentPane().add(b); 
    b.addActionListener(new ActionListener() { 
     @Override 
     public void actionPerformed(ActionEvent e) { 
      new Dia1(MainWin.this); 
     } 
    }); 
    this.setVisible(true); 
} 

}

主窗口:

public class MainWin extends JFrame { 

public MainWin(){ 
    this.setSize(800,800); 
    JButton b = new JButton("click hehe"); 
    this.getContentPane().add(b); 
    b.addActionListener(new ActionListener() { 
     @Override 
     public void actionPerformed(ActionEvent e) { 
      new Dia1(MainWin.this); 
     } 
    }); 
    this.setVisible(true); 
} 
} 

第一個對話框中的一個沒有,真正的工作版本 小例子, :

public class Dia1 extends JDialog { 


public Dia1(final JFrame parent){ 
    super(parent, true); 
    this.setSize(400, 400); 
    JButton b = new JButton("click hehe"); 
    this.getContentPane().add(b); 
    this.setVisible(true); 
    b.addActionListener(new ActionListener() { 
     @Override 
     public void actionPerformed(ActionEvent e) { 
      new Dia2(parent); 
     } 
    }); 
} 
} 

第二個對話框:

public class Dia2 extends JDialog { 


public Dia2(JFrame parent){ 
    super(parent, true); 
    this.setSize(200, 200); 
    JButton b = new JButton("click hehe"); 
    this.getContentPane().add(b); 
    this.setVisible(true); 
} 

} 

PS:我只是意識到:對話2不會隱藏,我懷疑..這是根本不存在。很可能是因爲父窗口被模態對話框阻止了?

+0

展現你試過 – Sionnach733

+1

*「我缺少什麼?」 *的[MCVE(http://stackoverflow.com/help/mcve)(最小完備可驗證例)或[什麼是基本的代碼示例SSCCE](http://www.sscce.org/)(簡短,獨立,正確的例子)。 –

+0

在最純粹的版本中添加了MCVE我可以拿出來......如果有JFrame/JDialog/Modal的soem組合可以完成我想要的功能嗎? – Layna

回答

2

這是一個模式工作的MCVE廣告。

import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 
import javax.swing.border.EmptyBorder; 

public class ModalOverModal { 

    private JComponent ui = null; 

    ModalOverModal() { 
     initUI(); 
    } 

    public void initUI() { 
     if (ui!=null) return; 

     ui = new JPanel(new GridLayout()); 
     ui.setBorder(new EmptyBorder(40,40,40,40)); 

     final JButton b1 = new JButton("Open Modal Dialog"); 
     b1.setMargin(new Insets(40, 200, 40, 200)); 
     ui.add(b1); 

     final JButton b2 = new JButton("Open 2nd Modal Dialog"); 

     ActionListener al1 = new ActionListener() { 

      @Override 
      public void actionPerformed(ActionEvent e) { 
       JOptionPane.showMessageDialog(b1, b2); 
      } 
     }; 
     b1.addActionListener(al1); 

     ActionListener al2 = new ActionListener() { 

      @Override 
      public void actionPerformed(ActionEvent e) { 
       JOptionPane.showMessageDialog(b2, "Close Me!"); 
      } 
     }; 
     b2.addActionListener(al2); 
    } 

    public JComponent getUI() { 
     return ui; 
    } 

    public static void main(String[] args) { 
     Runnable r = new Runnable() { 
      @Override 
      public void run() { 
       ModalOverModal o = new ModalOverModal(); 

       JFrame f = new JFrame("Modal over Modal"); 
       f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
       f.setLocationByPlatform(true); 

       f.setContentPane(o.getUI()); 
       f.pack(); 
       f.setMinimumSize(f.getSize()); 

       f.setVisible(true); 
      } 
     }; 
     SwingUtilities.invokeLater(r); 
    } 
} 
+0

快速反饋:確實有效!現在解決爲什麼以及如何整合:) – Layna

+0

試圖通過我的方式工作,現在JOptionPane如何工作... – Layna

+0

好吧,現在我不確定如何處理這個答案。是的,它符合我所描述的內容。但是,可悲的是,JOptionPane不具備沒有按鈕的能力...... *嘆息*。 – Layna