2011-06-22 81 views
1

我需要從父JFrame啓動一個JDialog並使其成爲模態。從JDialog我需要查看另一個JFrame(子框架)並訪問它。但是一旦我們打開了模態對話框,我們就無法訪問,所以有沒有任何解決方法來訪問從模態對話框打開的子框架。從模態JDialog打開時激活JFrame

這裏是代碼片段。我需要訪問從j模式對話框打開的f1框架。

import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.Dimension; 
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.JTextField; 


public class TestDialog { 

    public static void main(String[] args) { 

     TestDialog t=new TestDialog(); 
     t.show(); 

    } 

    void show(){ 
     JFrame f = new JFrame("Simple Frame"); 
     JTextField tf = new JTextField("Text"); 
     tf.setPreferredSize(new Dimension(200, 100)); 
     JButton b=new JButton("click me"); 

     f.getContentPane().setLayout(new BorderLayout()); 
     f.getContentPane() .add(tf, BorderLayout.NORTH); 
     f.getContentPane() .add(b, BorderLayout.CENTER); 
     f.setBounds(500, 400, 500, 500); 
     f.setVisible(true); 
     f.setDefaultCloseOperation(f.EXIT_ON_CLOSE); 

     final JDialog j=new JDialog(); 
     j.setSize(200,300); 
     JPanel p=new JPanel(); 
     JButton b1=new JButton("check me"); 
     p.add(new JLabel("label me")); 
     p.add(b1); 
     j.getContentPane().add(p); 
     j.setDefaultCloseOperation(j.DISPOSE_ON_CLOSE); 
     j.setModal(true); 
     j.setLocationRelativeTo(f); 

     b.addActionListener(new ActionListener(){ 
      @Override 
      public void actionPerformed(ActionEvent e) { 
       j.show(true);    
      } 

     });  

     final JFrame f1 = new JFrame("Sub Frame"); 
     f1.getContentPane().setLayout(new BorderLayout()); 
     f1.getContentPane() .add(new JLabel("label me"), BorderLayout.NORTH);  
     f1.setBounds(600, 500, 300, 300);  
     f1.setDefaultCloseOperation(f1.DISPOSE_ON_CLOSE); 

     b1.addActionListener(new ActionListener(){ 
      @Override 
      public void actionPerformed(ActionEvent e) { 
       f1.setVisible(true);     
      } 

     });  
    } 
} 
+0

我只是通過閱讀你的再次發帖,我現在在想我誤解了你。你說你有一個初始框架,它是對話框的父對象。它似乎相反,你有一個初始的TestDialog; TestDialog擴展JFrame嗎?另外,以一種叫做f,f1,tf,b,b1等的方式來跟蹤你的代碼是很困難的。儘管它很短,但這種神祕的命名方案仍然令人困惑。 – Loduwijk

+0

目標父/子層次結構對我來說不是很清楚,但是您可能會受益於[DOCUMENT_MODAL]模態,這裏討論了這個模式(http://download.oracle.com/javase/tutorial/uiswing/misc/modality.html ) –

回答

3

如果幀F1和F2和對話d其中,f1是家長d是父母F2,可你只要把F2的對話,而不是一個框架?這將使幀f和對話框d1和d2,f父母對d1父母對d2。

否則,你似乎試圖使用擺動工具違反他們的意圖,所以它似乎對設計的重訪可能比試圖迫使一個方形釘入圓孔更好。

1

另一種選擇是將j(你的模態dilaog)重新創建爲非模態對話框,並在點擊後顯示它。但是你有冒險的風險,用戶會在兩幀之間的某個地方鬆開對話框。

我也同意@Ludowijk:你正在嘗試做的聲音或多或少像一個多文檔界面,它不是這樣一個方便的設計...

斯特凡

+0

感謝您的建議。非常感謝。 –