2012-08-14 68 views
1

我正在使用不同的类:一个拥有一个按钮的主JFrame,一个拥有一个新的JFrame,在按下按钮时被调用。按钮多次打开新的JFrame。我该如何阻止?

if(event.getSource() == noteBtn) { MiniPad.pad(); return;} 

(MiniPad.pad()参考的新的JFrame类和垫()方法)

当我的removeAll()上承载按钮,然后重新验证(JPanel中)和重绘(),该按钮会多次打开JFrame,这不是我想要的。

有没有办法告诉你不能有JFrame的多个副本开放在任何一个时间的MiniPad类?顺便扩展JFrame,以防万一。

+0

你怎么会知道的框架被关闭?如果您正在等待它关闭,则可以使用布尔值来指示帧是否打开。 – elyashiv 2012-08-14 11:21:21

+1

这个[示例](http://stackoverflow.com/a/9443609/1057230)可以给你一些想法,但不要使用两个'JFrame',而是坚持一个'JFrame多个JDialog'东西由@AndrewThompson提供建议:-) – 2012-08-14 11:56:58

回答

4

编辑:下面的所有内容都是有效的编程知识,但是您可能还想考虑让MiniPad扩展JDialog类。我以前没有用过它,但它的实现看起来很像JFrame。您的MiniPad课程实际上可能不需要改动太多。文档在这里:http://docs.oracle.com/javase/7/docs/api/javax/swing/JDialog.html

如果你想知道为什么,看看安德鲁汤普森的帖子here

-

从我明白你的问题,MiniPad延伸JFramepad()方法创建MiniPad类的新实例。最简单的解决方案是将MiniPad类(至少通过pad()方法)转换为单例。单例是一种在任何给定时间只能存在一个实例(或对象)的类。通过调用静态方法(在本例中为pad()),检查对象的实例是否已经存在;如果是这样,只需使用该现有对象:

public class MiniPad extends JFrame { 

    //whatever code you have 

    private static MiniPad padInstance = null; //the singleton instance of your MiniPad 

    public static MiniPad pad() { 
     if(padInstance == null) 
      padInstance = new MiniPad(); 
     //If you want to reset the object every time you call the method for whatever reason, do it here 
     pad.setVisible(true); // I believe this is all you want to do 
    } 
} 

这应该做你想做的。通过调用pad()方法,只有一个MiniPad会出现。

不过,如果我读了你的问题错了,让我知道,我将修改我的答案。对单身

信息: http://en.wikipedia.org/wiki/Singleton_pattern

+3

请你阅读顶部海报之一的建议,然后再次[使用多个JFrames,好/坏实践?](http://stackoverflow.com/a/9554657/714968) – mKorbel 2012-08-14 11:45:38

+0

完美的答案,出色的工作。非常感谢! :-) – lukatar 2012-08-14 12:04:37