java - 从 GUI 代码外部请求用户输入,在这种情况下我是否需要事件或操作来与 GUI 进行通信?

标签 java swing events actionlistener

我正在编写一个 2D 多边形和物理编辑器,其中一项功能是设置关节的旋转限制。

要使用此功能,用户单击并拖动需要接收限制的关节点之间的线。

确定选择是否有效的逻辑发生在 GUI 代码之外。

如果找到选择,我想弹出一个 JOptionPane.showInputDialog 用户可以在其中输入限制。

事情是,如果我直接这样做,程序就会变得无响应,我认为这是因为线程。

我有没有办法定义 GUI 可以使用的事件监听器,而不需要实际的 GUI 组件?

我想发送一个事件,该事件还包含对该组件的目标对象的引用,然后告诉它已经进行了有效的选择并且需要用户输入,然后通过目标的方法将值发送回对象。

我对 Swing 非常缺乏经验。 我的预感是,我也许可以向主窗口添加一个 ActionListener,但我不知道如何专门处理该监听器。 例如,我需要如何定义一个仅由特定监听器处理的 Action ? 当然,如果这实际上可能的话。

到目前为止,我只使用监听器让 GUI 与逻辑对话,而不是相反......

编辑: 程序变得无响应,我称之为运动 result = JOptionPane.showInputDialog(this,"输入限制。");

这只会打破它。甚至无法在文本框中输入任何内容,也无法关闭它等。

我认为这是因为它产生了一个模式对话框,暂停了一些线程,并且从非 GUI 代码内部的某个地方调用它并不是我应该做的事情,但我太缺乏经验了,不知道另一种方法。 .

编辑2: 我应该补充一点,如果我生成 JOptionPane.showInputDialog,例如在单击按钮或选择弹出菜单选项后,我可以毫无问题地使用 JOptionPane.showInputDialog。 事实上,这就是我重命名正在使用的项目的方式。

但我假设此时对话框正在 GUI 线程或此事件调度程序队列中生成。

问题在于,这需要触发该事件的可见的交互式 GUI 组件。 然而,我想要的是某种能够像单击的按钮或上下文菜单一样生成 JOptionPane.showInputDialog 的组件,但不必与用户交互,而是通过代码交互。 我想我可以使用隐形按钮并模拟鼠标单击事件,但这非常老套...

此外,我尝试生成 Threads 和 Runnables,从而生成 JOptionPane.showInputDialog,但这也没有帮助。 除非我从 GUI 源生成 JOptionPane,否则一切都会停止,并且对话框将无法工作。

最佳答案

发布者将有一个公共(public)添加/删除监听器,订阅者将在其中添加自身或通过另一个 channel 添加到发布者中的 EventListenerList。

您可以创建自己的监听器接口(interface),该接口(interface)扩展了 EventListener 和触发事件的函数。下面是一个例子:

import java.util.EventListener;

public interface MyEventListener extends EventListener {
   public void myEventOccurred(MyEvent event);
}

然后,您可以创建自定义事件类,即上面示例中的“MyEvent”,如下所示:

import java.util.EventObject;

public class MyEvent extends EventObject {
  // customer fields and methods here
  public MyEvent(Object source) //more possible args here {
    super(source);
    //other things here to do what you want
  }
}

现在您可以让订阅者实现 MyEventListener 并重写 myEventOccurred(..) 方法。

关于java - 从 GUI 代码外部请求用户输入,在这种情况下我是否需要事件或操作来与 GUI 进行通信?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8916790/

相关文章:

java - 如何在java中用cypher加载CSV文件?

java - 如何在空布局中添加滚动条?

Java JPanel 不会出现在 Linux 中的 JFrame 中

c# - EventHandler 在 .dll 中始终为 null,从另一个类订阅

c++ - 创建字符串到函数 vector 的 HashMap

java - Spring @CacheEvict 使用通配符

java - 如何使用 jacoco 获取外部 java 库的代码覆盖率?

java - 禁用 JTree 节点的三键编辑,但保留键盘键进行编辑,以便在编辑之前保存节点的旧名称

android - Firebase 分析事件不显示值(value)

java - Windows找不到 '\bin\ssvagent.exe'