我有一个主JFrame。框架内有一个按钮。当我单击按钮时,它会打开子框架。
但我只希望在任何时候只有1个子帧被打开,(相反,每当我再次单击该按钮时,它会给我第二个子帧,依此类推......)。
所以,我将actionListener添加到按钮,使其在子框架打开时禁用,并将windowListener添加到子框架,这样当我单击右上角的关闭按钮时,它会生成按钮(在主框架上)能够。
这是我的代码:
import java.awt.Button;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import javax.swing.JButton;
import javax.swing.JFrame;
public class Form1 extends JFrame implements ActionListener{
JButton btn1=new JButton("help");
public Form1() {
super("Form 1");
this.add(btn1);
setSize(200, 200);
btn1.addActionListener(this);
setVisible(true);
}
public void actionPerformed(ActionEvent e) {
if(e.getSource()==btn1){
btn1.setEnabled(false);
final Form2 x= new Form2();
x.addWindowListener(new WindowAdapter(){
@Override
public void windowClosing(WindowEvent e){
x.dispose();
btn1.setEnabled(true);
}
});
}
}
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable(){
@Override
public void run() {
new Form1();
}
});
}
}
import javax.swing.JFrame;
import javax.swing.JLabel;
public class Form2 extends JFrame {
JLabel lbl1=new JLabel("đang mở form 2 - trợ giúp");
public Form2() {
super();
add(lbl1);
setVisible(true);
setSize(200, 200);
}
}
所以,我的问题是:是否有其他方式我只能打开一个子框架(这意味着当该子框架打开时,单击主框架中的按钮不执行任何操作,除非该子框架已关闭) ?
答案 0 :(得分:6)
请改用模态对话框。有关详细信息,请参阅How to Make Dialogs。
对话框可以是模态。当模态对话框可见时,阻止用户输入程序中的所有其他窗口。
JOptionPane
创建模态的JDialogs
。要创建非模态对话框,您必须直接使用JDialog
类。
答案 1 :(得分:6)
这似乎是一种很好的方式,但是,还有其他方法。您的类可以将子JFrame
作为成员变量引用。按钮可以检查该成员是null
还是处置,如果是,则创建一个新成员;但除此之外,它可以把现有的孩子带到前线。
答案 2 :(得分:2)
提前构建Form2并使用setVisible(true)来显示它,并使用setVisible(false)来隐藏它。这里举个例子:
if(e.getSource()==btn1){
btn1.setVisible(false); // not really needed if you disable form1 on btn1 press
form2.setVisible(true); // show form2
form1.setVisible(false); // hide form1
}