2011-06-22 47 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

感谢您的建议。非常感谢。 –