Java 确定JDialog是否已打开

Java 确定JDialog是否已打开,java,swing,jdialog,Java,Swing,Jdialog,如何识别JDialog组件是否已经打开,从而避免在同一个应用程序实例中打开同一个JDialog两次 我想到的一个解决方案是验证一个对象是否已经是JDialog实例(dialogObj instanceof JDialog),如果是,我只调用负责其构造/展示的方法,如果不是,我只创建一个新的JDialog实例(如果我有错觉,请免费填写以纠正我) 假设我创建了一个JDialog,其中包含一(1)个JPanel、一(1)个JTextField、一(1)个JButton,并且每次“显示”JDialog的

如何识别JDialog组件是否已经打开,从而避免在同一个应用程序实例中打开同一个JDialog两次

我想到的一个解决方案是验证一个对象是否已经是JDialog实例(dialogObj instanceof JDialog),如果是,我只调用负责其构造/展示的方法,如果不是,我只创建一个新的JDialog实例(如果我有错觉,请免费填写以纠正我)

假设我创建了一个JDialog,其中包含一(1)个JPanel、一(1)个JTextField、一(1)个JButton,并且每次“显示”JDialog的事件所在的元素是一个JMenuItem->jpopumenu->TrayIcon(系统托盘图标)

我几乎找到了一种解决方法(如第二段所示),但是,当我通过系统托盘再次打开它时,我在“处理”对话框之前键入的所有内容都会再次出现,更不用说其他元素的状态保持不变(JButton enabled等,这是另一回事)


这里有没有人知道如何解决它(当然有)?

如果您有权访问JDialog实例,那么只需调用isVisible()。如果显示,则为真。

将这两个任务作为

  • A) 只初始化一个JDialog
  • B) 检查它是否打开了
您只需将模态JDialog用作

JDialog aDialog=new JDialog();
aDialog.setModal(true);
…这将不允许用户初始化另一个JDialog示例:)


好运

作为一个变体,这里只是另一个基本概念(未经测试)

//在你的基础应用程序中的某个地方

public class aClass{

private MyDialog aDialog;//field



public void actionPerformed(ActionEvent e)
{

  if(e.getActionCommand().equals("DIALOG_OPEN"))
{
    if(this.aDialog.isDialogOpen())
     {
       System.out.println("Dialog is opened"); return;
     }

    if(!this.aDialog.isDialogOpen())
    {
      this.aDialog=new MyDialog();
      this.aDialog.addWindowListener(...);
      //set JDialog options...
    }
}


}

}//end aClass
所以它也可以被使用


祝你好运

同样的例子,或者只是一般情况?好问题+1,我觉得有问题。JMenuItem上负责显示它的每个ActionEvent都会创建扩展JDialog的类的新实例。正如我所说,我可以通过“instanceof”验证对象是否是JDialog实例,但同样,当我处理并再次调用它时,JTextField保存我键入的最后一个文本。这个过程可以解决当我与负责其展示的JMenuItem交互时两次显示JDialog的问题。但是,一旦对话框窗口关闭(dispose()),我通过TrayIcon->jpopumenu->JItemMenu再次调用它,它的内容就会显示为从未被“disposed”,我的意思是,我在JTextField元素中键入的文本会再次出现。我尝试应用您的建议,但一方面,它解决了JDialog窗口的重复问题。另一方面,JDialog中的JTextField继续保存我在释放对话框窗口之前键入的文本。我认为当使用WindowConstants.DISPOSE\u ON\u CLOSE时,整个窗口(及其内容)都会被删除,但是,正如我所看到的,它不会以这种方式进行(至少在这里)。尝试实现一个WindowListener,它将为您提供一个windowClosing事件。当这被激发时,清空JTextField组件的内容。这是我做的,但是我没有使用windowClosing,而是使用windowClosing(在我的情况下,我不知道这两种方法中哪一种是最好的选择)。谢谢。这可能是我想要的答案,但是,老实说,我认为没有必要使用模态特性来实现我想要的结果。尽管如此,我不知道这种方法是否能够解决JTextField保存在JDialog之前键入的文本的问题。无论如何,非常感谢你,我会尝试一下,稍后再告诉你。我希望这个特定应用的概念类似于你在大多数情况下按下鼠标右键并选择可用选项与任务栏(系统托盘)上的防病毒应用交互时可能会发现的概念。不幸的是,由于网站规定,我无法回答自己的问题。我为我的案子找到了解决办法。我感谢大家为我提供的帮助,但是,为了解决这个棘手的问题,我刚刚“打破”了JDialog的传统,在一个void方法中添加了JDialog对象的声明和实例。我只是建议对JDialog使用标准的“modal”选项,这是获得您在问题中描述的结果的最简单的方法。但是如果您想保持JFrame的可访问性,您仍然可以创建一个“新的”“对象”,它扩展了JDialog,并为您的“对象”设置了新的规则。。。例如,您可以捕获“对象”是否初始化并阻止用户初始化另一个示例,但这要比thoughWell所想的长得多。这是我可以使用的另一种方法。注意:请原谅,我还没有评级,一旦我解决了这个问题,我就会这么做。
public class aClass{

private MyDialog aDialog;//field



public void actionPerformed(ActionEvent e)
{

  if(e.getActionCommand().equals("DIALOG_OPEN"))
{
    if(this.aDialog.isDialogOpen())
     {
       System.out.println("Dialog is opened"); return;
     }

    if(!this.aDialog.isDialogOpen())
    {
      this.aDialog=new MyDialog();
      this.aDialog.addWindowListener(...);
      //set JDialog options...
    }
}


}

}//end aClass