【问题标题】:Identify whether JDialog is already opened识别 JDialog 是否已经打开
【发布时间】:2011-07-19 14:57:29
【问题描述】:

如何判断一个JDialog组件是否已经打开,从而避免同一个JDialog在同一个应用实例中被打开两次?

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

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

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

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

【问题讨论】:

  • 同一个实例,还是一般?
  • 有问题。 JMenuItem 上的每个 ActionEvent 负责显示它,创建一个扩展 JDialog 的类的新实例。正如我所说,我可以通过“instanceof”验证对象是否是 JDialog 实例,但是当我再次处理并再次调用它时,JTextField 会保存我输入的最后一个文本。

标签: java swing jdialog


【解决方案1】:

解决这两个任务

  • A) 只初始化一个 JDialog
  • B) 检查是否打开

您可以简单地将模态 JDialog 用作

JDialog aDialog=new JDialog();
aDialog.setModal(true);

...这不会让用户启动另一个 JDialog 示例:)

祝你好运

【讨论】:

  • 这可能是我一直在寻找的答案,但老实说,我认为没有必要使用 Modal 功能来实现我想要的结果。尽管如此,我并不确切知道这种方法是否会解决有关 JTextField 保存要处理的 JDialog 之前键入的文本的问题。无论如何,非常感谢你,我会努力的,稍后我会通知你。
  • 我想要的这个特定应用程序的概念与您在与位于任务栏(系统托盘)上的防病毒应用程序交互时可能会发现的类似,在大多数情况下按下鼠标右键并选择可用选项.
  • 很遗憾,由于网站规定,我无法回答自己的问题。我找到了适合我的情况的解决方案。感谢大家为我提供的帮助,但为了解决这个尴尬的问题,我只是“打破”了 JDialog 的传统,在 ​​void 方法中添加了 JDialog 对象的声明和实例化。
  • 我只是建议对 JDialog 使用标准的“模态”选项,这是获得您在问题中描述的结果的最简单方法。但是,如果您想保持 JFrame 可访问,您仍然可以创建一个扩展 JDialog 的“新”“对象”并为您的“对象”设置新规则......例如,您可以捕获“对象”是否已启动并阻止用户初始化另一个例子,但它的路要长得多
【解决方案2】:

如果您可以访问 JDialog 实例,那么您可以简单地调用 isVisible()。如果它正在显示,那就是真的。

【讨论】:

  • 明白。当我与负责其显示的 JMenuItem 交互时,此过程可能会解决有关 JDialog 显示两次的问题。但是,一旦关闭对话框窗口(dispose())并且我通过 TrayIcon -> JPopUpMenu -> JItemMenu 再次调用它,它的内容就会显示为它从未被“丢弃”,我的意思是,我在其中输入的文本JTextField 元素再次出现。
  • 我尝试应用您的建议,但一方面,它解决了 JDialog 窗口的重复问题。另一方面,JDialog 中的 JTextField 继续保存我在处理对话框窗口之前键入的文本。我认为当使用 WindowConstants.DISPOSE_ON_CLOSE 时,整个窗口(及其内容)将被删除,但是,正如我所见,它不会以这种方式进行(至少在这里)。
  • 尝试实现一个WindowListener,它会给你一个windowClosing事件。当它被触发时,清空 JTextField 组件的内容。
  • 我这样做了,但我没有使用 windowClosing,而是使用了 windowClosed(在我的情况下,我不知道哪一个是这两种方法之间的最佳选择)。谢谢。
【解决方案3】:

这里的变体只是另一个基本概念(未经测试)...

public class MyDialog extends JDialog
{

private boolean isOpen;

public MyDialog()
{

  this.setOpenStatus(true) ;      

}

private void setOpenStatus(boolean isOpen)
{
 this.isOpen=isOpen;
}

public boolean isDialogOpen(){return this.isOpen;}

}

//在您的基础应用程序深处...

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

所以也可以用

祝你好运

【讨论】:

  • 好主意。这是我可能使用的另一种方法。注:原谅我还没评分,等我解决了这个问题,我就去做。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-28
  • 1970-01-01
相关资源
最近更新 更多