【问题标题】:How can I make a method wait for an Input from another class?如何让方法等待另一个类的输入?
【发布时间】:2018-02-13 16:06:56
【问题描述】:

我有一个类可以打开一个带有列表的窗口,用户可以从中选择一个项目。所有这些都有效,如果选择了一个列表项,则值会被存储,并且窗口中有一个按钮可以保存值并关闭窗口。

这就是窗口的样子。

现在我的问题是:我需要一个方法来返回用户单击“确定”时选择的值。我的尝试如下所示:

public Field returnSelectedField() {
    FieldSelector fs = new FieldSelector(); //FieldSelector is the class I mentioned before
    return fs.saved;
}

问题是,此方法会立即继续运行,因此它不会等待用户单击按钮并保存他的选择。现在,我已经阅读了有关多线程的信息,并使这个方法正在等待另一个类完成运行,但是我还没有找到一个我理解它是如何工作的教程。

如果你们中的一位经验丰富的编码人员能够提供指向简单教程的链接或解决此问题的想法,我将不胜感激。我想有一个简单的,我只是找不到。

【问题讨论】:

  • 如何处理单击按钮时发生的情况? “确定”按钮是否与您提到的保存值并关闭窗口的按钮相同?因为这是我在图片上看到的唯一按钮。
  • 是的。按下按钮将值保存在类中的“已保存”变量中并关闭窗口。
  • 那么,你如何处理那个按钮事件呢? - 如果可以展示您的方法。另外,为了澄清一下,您使用的是 Swing 是吗?
  • 我认为您以错误的方式面对问题。使用列表小部件获取输入并将该输入传递给业务逻辑不应该涉及多线程(至少在您正在编程的高级别)。它应该通过回调来解决。
  • @KleoG 啊等等,我错了。我有一个 ListSelectionListener 将所选值保存在已保存的变量中,按钮所做的唯一事情就是关闭窗口。因此 ListSelectionListener 以所选值作为参数运行以下方法:public void verarbeitung(Object o) { String name = o.toString(); for (int i = 0; i < globalList.size(); i++) { if (name.equals(globalList.get(i).getName())) { saved = globalList.get(i); } } }

标签: java multithreading wait


【解决方案1】:

我认为这个材料会很有用 https://docs.oracle.com/javase/tutorial/uiswing/events/actionlistener.html

它有很好的按钮示例)

这是关于Listeners的官方文档,如果对你来说太难理解,请尝试在那个主题上找到smth

简单地说 - ActionListener 是一个“监听”或等待某个事件的类,在你的情况下 - 按钮按下,当它发生时开始执行你想要的一些动作)

public Field selected;

public void actionPerformed(ActionEvent e) { 
     selected =  fs.saved;

}

public Field returnSelectedField() {  

   return selected;

}

【讨论】:

  • 谢谢,但我认为处理按钮的操作不是我的问题。更多的是从我提到的方法中获取返回值,并让该方法基本上等待我打开的列表中的值。
  • @Ceratius 也许我不完全理解你,但据我了解,你不需要你的方法,你可以将 ActionListener 添加到你的按钮,所以当用户执行一个动作(按下按钮) - @ 987654323@方法被调用,所以在这个方法中你可以得到你需要的值
  • 是的,但问题是我需要一个返回该值的方法。由于 actionPerformed 必须是 void 方法,这是不可能的,还是有办法?
  • @Ceratius 不,你不能直接从actionPerformed(ActionEvent e) 返回值但我更正了我的第一个答案,以展示这样做的可能性 =) 看看
猜你喜欢
  • 1970-01-01
  • 2016-11-29
  • 2011-04-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-22
  • 2016-09-14
相关资源
最近更新 更多