从模态JDialog打开时激活JFrame

时间:2011-06-22 23:15:13

标签: java swing

我需要从父JFrame启动JDialog并生成模态。从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);                
            }

        });     
    }
}

2 个答案:

答案 0 :(得分:3)

如果你有帧f1和f2以及对话框d,其中f1是d的父对象是f2的父对象,你能不能使f2成为对话而不是帧?这将给帧f和对话框d1和d2,f父对d1 parent为d2。

否则,您似乎正在尝试使用与其预期相反的摆动工具,因此似乎重新设计可能比试图将方形挂钉推入圆孔更好。

答案 1 :(得分:1)

另一种选择是将j(你的模态dilaog)重新创建为非模态对话框,并在点击后显示它。但是你冒着用户将在2帧之间的某个地方松开对话的风险。

我也同意@Ludowijk:你想要做的事情听起来或多或少像多文档界面,而且它不是那么方便的设计......

斯特凡

相关问题