我需要从父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);
}
});
}
}
答案 0 :(得分:3)
如果你有帧f1和f2以及对话框d,其中f1是d的父对象是f2的父对象,你能不能使f2成为对话而不是帧?这将给帧f和对话框d1和d2,f父对d1 parent为d2。
否则,您似乎正在尝试使用与其预期相反的摆动工具,因此似乎重新设计可能比试图将方形挂钉推入圆孔更好。
答案 1 :(得分:1)
另一种选择是将j(你的模态dilaog)重新创建为非模态对话框,并在点击后显示它。但是你冒着用户将在2帧之间的某个地方松开对话的风险。
我也同意@Ludowijk:你想要做的事情听起来或多或少像多文档界面,而且它不是那么方便的设计......
斯特凡