Java 在屏幕上仅允许1(子)JFrame

Java 在屏幕上仅允许1(子)JFrame,java,swing,jframe,Java,Swing,Jframe,我有一个主框架。框架内有一个按钮。当我单击该按钮时,它将打开子帧 但我只希望在任何时候打开一个子帧(相反,每当我再次单击按钮时,它会给我第二个子帧,依此类推…) 因此,我将actionListener添加到按钮中,使其在子帧打开时禁用,并将windowListener添加到子帧中,以便当我单击右上角的close按钮时,使按钮(在主帧上)可启用 这是我的密码: import java.awt.Button; import java.awt.EventQueue; import java.aw

我有一个主框架。框架内有一个按钮。当我单击该按钮时,它将打开子帧

但我只希望在任何时候打开一个子帧(相反,每当我再次单击按钮时,它会给我第二个子帧,依此类推…)

因此,我将actionListener添加到按钮中,使其在子帧打开时禁用,并将windowListener添加到子帧中,以便当我单击右上角的close按钮时,使按钮(在主帧上)可启用

这是我的密码:

 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);


}



}  

因此,我的问题是:是否有其他方法可以只打开一个子帧(这意味着当该子帧打开时,单击主帧中的按钮不会执行任何操作,除非该子帧关闭)?

使用模式对话框。有关更多详细信息,请参阅

对话框可以是模态的。当模式对话框可见时,它将阻止用户输入程序中的所有其他窗口
JOptionPane
创建模式化的
JDialogs
。要创建非模态对话框,必须直接使用
JDialog


这似乎是一个好方法,但是的,还有其他方法。您的类可以保留对子
JFrame
的引用作为成员变量。该按钮可以检查该成员是否为null,如果是,则创建一个新成员;但是,否则它可能只会将现有的子级放在前面。

提前构建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
}     

当用例尖叫“模态对话”时,这个答案相当于“错误问题的正确答案”。为什么安德鲁,我们必须停止这样的会面:)你可能是绝对正确的,但这取决于它是什么样的孩子。它可能是一种调色板类型的东西——例如,您只需要在绘制程序中使用“工具”调色板的一个实例,但它绝对不是模态的。对于工具调色板,我会将其嵌入GUI中的
JToolBar
。如果用户愿意,可以从GUI中拖动它。对于单件的非模态组件,保留对原始实例的引用,并在后续情况下简单地
setVisible(true)
&/或
toFront()
。我只是不明白为什么要尝试让一个框架像其他东西一样工作,并保持每个应用程序一个框架的基本原则。到目前为止,我还没有看到多帧的好理由。(如果你说“GIMP”,我可能会开始咒骂;)是的,所有的优点都是:一个人应该使用适当的工具来完成适当的工作。顺便说一句,+1表示
null
check/lazy实例化。这是Ernest先前回答的变体,但欧内斯特的更好,因为它包含了一个空检查,如果空,则延迟创建窗口。2个人认为这是一个好答案-1帮助恢复理智<代码>form2.setEnable(真)作为旁白,没有
setEnable
方法。但是编辑这样的答案并不能逆转我的反对票。@AndrewThompson哇-我怎么会错过这个…谢谢我把它改成了setVisible()。“我需要休假。”查克·弗里卡诺我改变主意,不取消反对票。我们都需要休假@AndrewThompson-不用担心-实际上我对学习/教学比对分数更感兴趣-但是谢谢ở 表格2-trợ “那是什么语言?”?它在英语中是什么意思?它是越南语,字面意思是“Form2正在打开-帮助”:)感谢您的澄清。谷歌翻译的最佳猜测是菲律宾语、波兰语或意第绪语。毫不奇怪,它们中没有一个能很好地用于该文本。限制代码样本仅限于英语是值得的。这样,人们就可以从标题(或变量名、文本内容等)中获取线索,提出最佳建议。