屏幕上只允许1(子)JFrame

时间:2012-03-18 03:22:56

标签: java swing jframe

我有一个主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);


}



}  

所以,我的问题是:是否有其他方式我只能打开一个子框架(这意味着当该子框架打开时,单击主框架中的按钮不执行任何操作,除非该子框架已关闭) ?

3 个答案:

答案 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
}