Java 根据框架是否打开启用和禁用按钮

Java 根据框架是否打开启用和禁用按钮,java,swing,jframe,jbutton,Java,Swing,Jframe,Jbutton,我有一个按钮可以打开一个框架。是否有办法根据框架是否打开来启用/禁用按钮 比如说,如果框架是打开的,我希望按钮是button.enabled(false)。但一旦框架关闭,我想将其更改为button.enabled(true) 在按钮的actionPerformed方法中,我这样做 JFrame testFrame = new JFrame(); testFrame.setSize(100,100); testFrame.setVisible(true); 然而,我不想一次打开超过一个这样的画

我有一个按钮可以打开一个框架。是否有办法根据框架是否打开来启用/禁用按钮

比如说,如果框架是打开的,我希望按钮是
button.enabled(false)
。但一旦框架关闭,我想将其更改为
button.enabled(true)

在按钮的actionPerformed方法中,我这样做

JFrame testFrame = new JFrame();
testFrame.setSize(100,100);
testFrame.setVisible(true);

然而,我不想一次打开超过一个这样的画面。因此,当通过单击按钮创建的帧处于打开状态时,我希望在帧关闭之前禁用该按钮。(即使框架不可见,我仍然不想允许打开另一个框架)

添加一个onClose侦听器,该侦听器在用户(或程序)关闭框架时将按钮设置为启用。同样地,在首先打开框架的调用中添加一行来禁用按钮。

如果您想让按钮只创建一个窗口,我建议您不要禁用启用按钮,而是让它指向一个JFrame,因此在代码中的某个地方,有一个类变量:

JFrame myFrame = null;
那么按钮代码应该是:

If (myFrame == null) {
    myframe = new JFrame();
    //set up the frame etc
    myFrame.setVisible();
} else {
    myFrame.setVisible();
    //code to bring focus to myFrame
}
老实说,我不太记得把焦点放在窗口的最佳方式,但这里有几个链接:



您可能不应该从另一个GUI以JFrame的形式打开依赖窗口。可能您最好打开一个对话框,比如模态或非模态JDialog或JOptionPane。请理解,这两种生物中的任何一种都可以拥有非常复杂的GUI。例如,请看下面的示例:

另外,如果对话框变量是类的一个字段,那么它只创建一次,即使多次按下显示它的按钮,也不能显示其中两个窗口

您的代码可能看起来像

// testDialog is a JDialog field. and this line is called in 
// the class constructor.
JDialog testDialog = new JDialog(theCurrentJFrame, "Dialog Title", false); // true 
                                                                    // if modal

// this line is called in the button's ActionListener.
testDialog.pack(); // Never set the size of your GUI's. 
                   // Let the layout managers do this for you.
testDialog.setVisible(true);

镜框?比如说?如果这就是您想要了解的,我强烈建议您完全使用其他方法?你是说窗口是创建的还是打开的?例如,您可以创建一个JFrame,但不显示它,您也可以创建一个JFrame,但可以最小化它?这是AWT、Swing、Android、不同的GUI库吗?这是关键信息,将更改正确答案。抱歉,没有具体说明。我只是在说秋千。我更感兴趣的是学习如何做,以及为什么应该这样做,而不是简单地学习代码。此外,我还添加了一个编辑来澄清评论中的一些问题。1+投票支持回应我们对更多信息的要求。我不太关心组件的重点。相反,我不想让组件被创建多次。但一旦组件关闭,我希望用户可以选择将其重新打开。是否要将信息保存在其中?还是一个新的弹出窗口?只是一个新的弹出窗口。(每次点击按钮,它都会显示一个字符串和一个随机数,没有什么真正需要保存的。它更多的是用于学习目的)这就是上面所说的,这是一个单例方法的例子,只要你总是从同一个类中打开它,你就永远不会得到超过一个,可能需要调整以重新生成随机数,但是,您可以在这里看到更多。尽管如此,您可能需要的是一个JDialog或JOptionPane,正如气垫船上装满鳗鱼所建议的那样。我认为这是应该做的方式,但我不确定如何做。我对听众的工作方式有点困惑。我想将windowlistener添加到框架中,然后覆盖windowclosing吗?虽然我已经为这个问题选择了答案,但如果您愿意提供,我仍然对您的答案感兴趣!不幸的是,我猜错了库,不知道如何在swing中执行此操作,但可能会有所帮助。感谢链接,我也将尝试这种方法。我很好奇它是如何工作的。如果我不打算使用JFrame中的信息,这是否值得关注?(只是为了展示)。另外,一旦我有足够的代表投票,我会回来投票给你链接的答案。(感谢关于pack方法的花絮——这里是swing的新功能:)如果希望此窗口始终显示在主GUI上方,那么它应该是一个非模式对话框。如果您只希望存在一个窗口,请将其设置为类的字段,而不是actionPerformed方法的局部变量。感谢您的建议,我现在正在探索JDialog选项(已经尝试了dann.dev的示例)。如果您不介意我问一下,为什么JDialog比JFrame更好?这些对话框也可以容纳表格吗?看看你的例子,看起来他们有很多能力things@William:JDialog可以保存JFrame可以保存的任何内容。它们的主要优点是当您需要一个模式对话框时——一个有焦点的窗口,在对话框窗口关闭之前不会让用户返回主应用程序,但是如果您希望非模式窗口保持在主应用程序窗口之上,它对非模式窗口也非常有用。