1

我正在使用不同的类:一个持有一个带有按钮的主 JFrame,另一个持有一个在按下按钮时调用的新 JFrame。

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

(MiniPad.pad() 引用新 JFrame 上的类和 pad() 方法)

当我在承载按钮的 JPanel 上 removeAll(),然后 revalidate() 和 repaint() 时,按钮会多次打开 JFrame,这根本不是我想要它做的。

有没有办法告诉 MiniPad 类你不能在任何时候打开多个 JFrame 副本?顺便说一下,我扩展了 JFrame,以防万一。

4

2 回答 2

3

最好的解决方案是打开一个模态对话框而不是框架。请参阅使用多个 JFrame,好/坏做法?更多。

于 2012-08-14T11:25:33.977 回答
3

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

如果您想知道原因,请在此处查看 Andrew Thompson 的帖子。

--

根据我对您的问题的理解,MiniPadextendsJFrame和该pad()方法创建了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

于 2012-08-14T11:38:07.627 回答