2012-03-18 56 views
3

我有一个主要的JFrame。框架内有一个按钮。当我点击按钮时,它会打开子框架。只允许在屏幕上1(儿童)JFrame

但我只希望只有一个孩子的框架是在任何时候开放,(而不是每当我再次点击按钮,它给了我第二个孩子框架,等等......)。

因此,我添加了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

顺便说一句 - *“đangmởform 2 - trợgiúp”*那是什么语言?这在英语中意味着什么? – 2012-03-18 03:58:34

+0

这是越南语,字面意思是“Form2正在打开 - 帮助”:) – 2012-03-18 04:26:13

+1

谢谢澄清。谷歌翻译的最佳猜测是菲律宾人,波兰人或意第绪语。毫不奇怪,他们没有一个能够很好地工作。只需将代码示例限制为SO即可。这样,人们可以从标题(或变量名称,文本内容等)中获取线索,以提出最佳建议。 – 2012-03-18 04:37:44

回答

6

这似乎是一个很好的方式,但是,也有其他方法。您的班级可以将孩子JFrame作为成员变量的参考。该按钮可以检查该成员是否为null或处置,如果是,则创建一个新的;但否则它可能会将现有的孩子带到前面。

+0

当用例尖叫'模态对话框'时,这个答案相当于'错误问题的正确答案'。 – 2012-03-18 03:32:25

+0

为什么安德鲁,我们必须停止这样的会议:)你可能是绝对正确的,但它确实取决于它是什么样的孩子。它可能是一种调色板 - 例如,您只需要在绘画程序中使用“工具”调色板的一个实例,但它绝对不是模态。 – 2012-03-18 03:34:53

+0

对于工具选项板,我会将它嵌入到'JToolBar'中的GUI中。如果他们喜欢,用户可以从GUI拖动它。对于单身模式的非模态组件,请在后续的场合保留对原始实例的引用,并简单地使用'setVisible(true)'和/或'toFront()'。我只是没有看到试图让框架像别的东西一样行为的观点,并且保持每个应用程序有一个框架的基本原则。**到目前为止,我还没有看到多框架的理由。 (如果你说'GIMP',我可能会开始发誓;) – 2012-03-18 03:50:46

6

改为使用模式对话框。有关更多详细信息,请参阅How to Make Dialogs

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

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 
}  
+1

这是Ernest先前答案的一个变体,但Ernest's更好,因为它包含一个空检查,如果为null,则会延迟创建窗口。 – 2012-03-18 03:47:53

+1

2人认为这是一个很好的答案?!? -1来帮助恢复一些理智。 'form2.setEnable(true);'另外,没有'setEnable'方法。但编辑这种效果的答案不会扭转我的倒票。 – 2012-03-18 04:39:20

+1

@AndrewThompson哇 - 我是怎么想的...谢谢我将它改为setVisible()。我需要休假。 – Java42 2012-03-18 04:46:17