【问题标题】:Multiple Interdependent JComponents without Recursive Loop没有递归循环的多个相互依赖的 JComponent
【发布时间】:2013-12-03 16:24:53
【问题描述】:

对于最小的例子,我有三个需要相互交互的 Swing JComponent 元素:一个 JSlider 和两个 JTextFields。 JSlider 从 0 到 50,其中一个 JTextFields 显示 JSlider 的值,第二个 JTextField 显示总值的百分比(即 JSlider 中的 2 将在第二个 @987654330 中更新 4% @)。

三个元素中的任何一个的更改都应该更新所有其他元素。所以JSlider 中的ChangeEvent 应该触发JTextFields 中的setText() 事件。但是,setText() 在TextFields 中触发ActionEvents,在这种情况下,这应该触发JSlider 的值变化。

我一直在用“刷新”boolean 标志来解决这个问题,在处理ActionEvent / ChangeEvent 之前将检查布尔值。但我想知道是否有任何更程序化或更简洁的方法来防止 ActionEvent / ChangeEvent 循环。

如果有任何见解,我将不胜感激!


编辑

我正在尝试使用直方图信息进行这项工作,其中百分比值与滑块值不完全匹配(即会有舍入错误)。建议的 SpinSliders 依赖于 setText() 方法能够“解决”最终值。换句话说,如果输入到setText() 的值与它已经包含的文本相同,它不会触发ActionEvent,从而有效地结束循环。如果舍入关闭,则JSlider 的setValue() 和JTextField 的setText() 将永远不会因为舍入而达到“平衡”状态。我希望简明扼要地描述问题。

【问题讨论】:

  • 您可以在每个组件的侦听器中计算新值。此计算在滑块和绝对值文本字段中很简单。在百分比文本字段中,您必须做一个产品。然后,您可以调用 update 函数来更新所有三个字段(是的,即使是刚刚更改的字段)。因此,请确保您有办法区分更改侦听器中的程序化事件和用户启动的事件。另一种选择是使用mediator pattern
  • SpinSlider 可能是一个有用的例子。
  • @MisterSmith 我一直在研究更改侦听器的程序化事件与用户启动的事件,但我发现是空的。这种区别是最有意义的,但在 Java API 中我找不到任何东西。
  • 您或许可以利用getValueIsAdjusting()。
  • @trashgod 做到了!谢谢!我确保滑块仅在 getValueAdusting() 时更新,而文本字段仅在相反条件下更新。不过,我必须将更新模块化,以便滑块和两个文本字段都有自己的更新方法。如果您想添加一个,我很乐意将此标记为答案。

标签: java swing loops actionevent


【解决方案1】:

SpinSlider 可能是一个有用的起点。由于您必须能够“确定”最终值,因此一旦最终值可用,请使用 getValueIsAdjusting() 进行更新。

【讨论】:

    猜你喜欢
    • 2011-09-18
    • 2013-10-21
    • 2013-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-12
    • 2014-07-27
    • 2016-10-03
    相关资源
    最近更新 更多