Java 中处理循环事件的优雅方法?

2024-01-11

我认为这对我来说不是一个特定的问题;每个人以前可能都遇到过这个问题。 为了正确地说明它,这里有一个简单的 UI:

正如您所看到的,这两个旋转器控制着一个变量——“A”。唯一的区别是他们使用不同的视图来控制它。

由于这两个旋钮的显示值是同步的,因此会出现循环事件。

如果我更改顶部微调器,“A”将更改,底部微调器的值也将相应更新。However,更新底部微调器的调用(例如 setValue)也会触发另一个事件,指示顶部微调器根据底部微调器的值进行更新。这会造成一个坏循环,最终导致 StackOverFlow 异常。

我以前的解决方案有点麻烦:我放置了一个保护布尔值来指示是否应该执行第二次更新调用。

现在我想问“我该如何优雅地处理这种情况? ( 一般而言,不特定于旋转器 )"

thx


Update:

由于我有两个答案建议我利用观察者结构,所以我必须对此说一些话。

就像我所说的,它很棒,但远非完美。不仅因为其固有的复杂性,还因为其无力解决问题.

为什么?要了解其原因,您必须认识到紧耦合Java Swing 中的视图和模型控制器。让我们以我的微调 UI 为例。假设变量A实际上是一个Observer对象。然后,在顶部微调器触发第一个状态更改事件后,观察者“A”将更新其值并触发 PropertyChange 事件以通知底部微调器。然后是第二次更新,更新底部微调器的视图。However,改变底部微调器的视图不可避免地会触发一个冗余事件,该事件将尝试再次设置“A”的值。之后,致命循环完全构建完毕,并且将抛出堆栈溢出。

理论上,观察者模型试图通过引入2条独立的反馈路径来解决直接循环。链式更新赔率(在事件响应代码中)隐式形成连接两条路径的桥梁,再次形成循环。


回到模型-视图-控制器,想想你的模型是什么,你的视图是什么。

在当前的实现中,您有两个模型(每个 Spinner 控件一个),并且它们通过视图层同步。

不过,您应该做的是共享相同的支持模型。对于具有减去值的微调器,创建原始模型的代理。 IE:

class ProxySpinnerModel implements SpinnerModel {
    getValue() { return originalSpinner.getValue() - 10 }
    setValue(v) { originalSpinner.setValue(v+10) }
}

spinnerA = new JSpinner()
spinnerB = new JSpinner( new ProxySpinnerModel( spinnerA.getModel() ) )

现在,您不需要添加侦听器,因为它们都使用相同的模型,并且默认实现(originalModel)已经具有向视图触发的更改侦听器。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java 中处理循环事件的优雅方法? 的相关文章

  • 使用 GWT CellTableBuilder 构建树表

    Is it possible to build a tree table like this http www sencha com examples ExamplePlace basictreegrid with the new Cell
  • 添加动态数量的监听器(Spring JMS)

    我需要添加多个侦听器 如中所述application properties文件 就像下面这样 InTopics Sample QUT4 Sample T05 Sample T01 Sample JT7 注意 这个数字可以多一些 也可以少一些
  • 如何在spring mvc中从控制器名称+操作名称获取映射的URL?

    是否有现有的解决方案可以从 Spring MVC3 中的 控制器名称 操作名称 获取映射的 URL 例如 asp net mvc 或 Rails 中的 UrlHelper 我觉得非常有用 thx 也许 你想要这样的东西 in your Co
  • 如何使用 SimpleDateFormat 解析多种格式的日期

    我正在尝试解析文档中的一些日期 用户似乎以类似但不完全相同的格式输入了这些日期 以下是格式 9 09 9 2009 09 2009 9 1 2009 9 1 2009 尝试解析所有这些内容的最佳方法是什么 这些似乎是最常见的 但我想让我困扰
  • Java:使用 HttpURLConnection 的 HTTP PUT

    如何执行 HTTP PUT 我正在使用的类似乎认为它正在执行 PUT 但端点将其视为我执行了 GET 我做错了什么吗 URL url new URL https HttpURLConnection conn HttpURLConnectio
  • Firestore - RecycleView - 图像持有者

    我不知道如何编写图像的支架 我已经设置了 2 个文本 但我不知道图像的支架应该是什么样子 你能帮我告诉我图像的文字应该是什么样子才能正确显示吗 holder artistImage setImageResource model getArt
  • 内存一致性 - Java 中的happens-before关系[重复]

    这个问题在这里已经有答案了 在阅读有关内存一致性错误的 Java 文档时 我发现与创建 发生 之前 关系的两个操作相关的点 当语句调用时Thread start 每个具有 与该语句发生之前的关系也有一个 与 new 执行的每个语句之间发生的
  • 在java中实现你自己的阻塞队列

    我知道这个问题之前已经被问过并回答过很多次了 但我只是无法根据互联网上找到的示例找出窍门 例如this http tutorials jenkov com java concurrency blocking queues html or t
  • 如何获取 WebElement 的父级[重复]

    这个问题在这里已经有答案了 我试过了 private WebElement getParent final WebElement webElement return webElement findElement By xpath 但我得到
  • Java 服务器-客户端 readLine() 方法

    我有一个客户端类和一个服务器类 如果客户端向服务器发送消息 服务器会将响应发送回客户端 然后客户端将打印它收到的所有消息 例如 如果客户端向服务器发送 A 则服务器将向客户端发送响应 1111 所以我在客户端类中使用 readLine 从服
  • Java 8 中函数式接口的使用

    这是来自的后续问题Java 8 中的 双冒号 运算符 https stackoverflow com questions 20001427 double colon operator in java 8其中 Java 允许您使用以下方式引用
  • Git 无法识别重命名和修改的包文件

    我有一个名为的java文件package old myfile java 我已经通过 git 提交了这个文件 然后我将我的包重命名为new所以我的文件在package new myfile java 我现在想将此文件重命名 和内容更改 提交
  • Java 数组的最大维数

    出于好奇 在 Java 中数组可以有多少维 爪哇language不限制维数 但是JavaVM规范将维度数限制为 255 例如 以下代码将无法编译 class Main public static void main String args
  • 无法加载或查找主类,可以在命令行中使用,但不能在 IDE 中使用[重复]

    这个问题在这里已经有答案了 在将其标记为重复之前 请先听我说完 我正在尝试使用 gradle 导入一个 java 项目 功能齐全 适用于所有其他笔记本电脑 没有问题 我的项目 100 正常运行 适用于所有其他笔记本电脑 当我的笔记本电脑被重
  • Android Studio 将音乐文件读取为文本文件,如何恢复它?

    gameAlert mp3是我的声音文件 运行应用程序时 它询问我该文件不与任何文件类型关联 请定义关联 我选择TextFile错误地 现在我的音乐文件被读取为文本文件 我如何将其转换回music file protected void o
  • 尝试使用等于“是”或“否”的字符串变量重新启动 do-while 循环

    计算行程距离的非常简单的程序 一周前刚刚开始 我有这个循环用于解决真或假问题 但我希望它适用于简单的 是 或 否 我为此分配的字符串是答案 public class Main public static void main String a
  • 解析输入,除了 System.in.read() 之外不使用任何东西

    我很难找到具体的细节System in read 有效 也许有人可以帮助我 似乎扫描仪会更好 但我不允许使用它 我被分配了一个任务 我应该以 Boolean Operator Boolean 的形式读取控制台用户输入 例如T F 或 T T
  • JSON 到 hashmap (杰克逊)

    我想将 JSON 转换为 HashMapJackson http jackson codehaus org 这是我的 JSON String json Opleidingen name Bijz trajecten zorg en welz
  • Java:多线程内的 XA 事务传播

    我如何使用事务管理器 例如Bitronix http docs codehaus org display BTM Home JBoss TS http www jboss org jbosstm or Atomikos http www a
  • 嵌入式 Jetty - 以编程方式添加基于表单的身份验证

    有没有一种方法可以按如下方式以编程方式添加基于表单的身份验证 我用的是我自己的LdapLoginModule 最初我使用基本身份验证并且工作正常 但现在我想在登录页面上进行更多控制 例如显示徽标等 有没有好的样品 我正在使用嵌入式 jett

随机推荐

  • 玩!框架 - 创建简单的 html 链接

    我有一个使用多个 HTML 文件和一个 CSS 文件制作的网站 我目前正在尝试切换到 Play 斯卡拉框架 由于某种原因 我很难弄清楚如何将一个 html 页面链接到另一个页面 现在 我的所有 html 文件都保存在 views 文件夹中
  • 我在哪里可以购买 .app TLD? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 在哪里可以购买 app 顶级域名 TLD 我去了 Network Solutions GoDaddy 等
  • Nexus 支持批量上传工件吗?

    我想知道我们是否可以将工件批量上传到 Nexus 的存储库中 您可以通过多种方式做到这一点 使用 Nexus工件上传页面 http www sonatype com books nexus book reference ch04s05 ht
  • 触发器:插入的表如何工作?如何访问它的行?

    我有下表 Data Table name ID Identity column PCode Postal Code 我创建了以下触发器 CREATE TRIGGER Trig ON Data FOR INSERT AS BEGIN Sele
  • 为什么我的指令抛出“Error: $injector:unpr Unknown Provider”

    我正在努力将我的控制器 工厂和指令重构为推荐的Angular 风格指南 https github com johnpapa angular styleguide file templates and snippets for 角度片段 ht
  • .NETBeans + 请求范围 - 有可能吗?

    我有我的网络应用程序 我需要 当用户执行请求 我的意思是 调用页面 时 创建一个对象 该对象为每个请求 因此数据在每个请求时更新 和每个用户存储一些信息 它从数据库获取这些信息 所以UserA 与 UserB 不共享相同的对象 我曾经使用
  • 使用 Word 时出现运行时错误 462 Excel VBA

    第二次或第三次运行此循环时 我不断收到 462 错误 我不认为我有任何漂浮的物体 但也许我错过了一些东西 我对此有点陌生 该宏将从 Excel 中获取所有图表 将它们作为图片粘贴到 Word 中 调整它们的大小 保存文档并关闭它 For 循
  • PHP/JS - 动态创建缩略图或存储为文件

    对于图像托管 Web 应用程序 对于我存储的图像 是否可以使用 PHP 或其他方式 动态创建缩略图 或者我应该将 1 个或多个不同大小的缩略图保存到磁盘并加载它们 任何帮助表示赞赏 将缩略图保存到磁盘 图像处理需要大量资源 并且根据图像的大
  • 使用 fread 导入 csv 时出现“字符串中嵌入 nul”错误

    我有一个大文件 3 5G 我试图使用它导入data table fread 它最初是从一个 rpt 文件创建的 该文件以文本形式打开并保存为 CSV 这对于较小的文件 相同类型的数据 相同的列等 效果很好 这只是为了更长的时间范围和更广泛的
  • Chrome、Opera 和 Safari 中 Flash 下弹出弹出菜单

    我在以下位置创建了一个弹出导航菜单 http lixmebel com http lixmebel com gt 在 gt 下 在 Firefox 和 Internet Explorer 中 一切正常 菜单会在 Flash 上弹出 但在 C
  • kafka-console-consumer 自定义反序列化器

    我想使用我的自定义value deserializer使用 kafka console consumer 命令行工具时 像这样的事情 kafka console consumer bootstrap server kafka2 29092
  • 当只有其中之一进行类型检查时,为什么这两个隐式都匹配?

    我正在尝试诊断由不同的隐式扩展错误引起的编译器错误 这是我所看到的 scala Welcome to Scala 2 13 1 OpenJDK 64 Bit Server VM Java 1 8 0 252 Type in expressi
  • 如何循环空手道响应数组并将其传递到另一个 Web 服务响应的 json 路径中

    我正在使用空手道版本 0 8 0 1 我想执行以下步骤来测试一些响应 我做了一个获取网络服务 1 使用 jsonpath 从 Web 服务 1 的响应中查找货币值 currencies 第 2 步给出了以下结果 USD HKD SGD IN
  • 当结果具有相同分数时在 Azure 搜索中进行分页

    我在电子商务网站上使用 Azure 搜索 现在在搜索页面上遇到分页问题 当我重新加载搜索页面时 我可以获得不同的产品顺序 因此 当我使用分页时 我可以在不同页面上看到相同的产品 这一点至关重要 我开始研究出了什么问题 我在 Microsof
  • 从 cakephp 的数组中删除数组键

    打印数组 array Order gt array id gt 1 base price gt 65 min price gt 95 检索数据时是否可以删除键 Order 如果不是 我如何使用 array shift 或以一行结束并防止出现
  • Haskell 中类型安全的“read”

    向你学习 Haskell http learnyouahaskell com making our own types and typeclasses讨论以下数据类型 data Day Monday Tuesday Wednesday Th
  • Python 等待队列和事件

    我有一个队列和一个事件 我想在事件设置为 True 时退出循环 但是循环中有一个queue get 它会阻塞 直到其中有东西为止 当设置 closeEvent 事件标志时 如何中止 self commandQueue get 的等待 注意
  • webapp2.Route 带有可选的前导部分

    我正在学习webapp2 http webapp improved appspot com 框架以其强大的Route http webapp improved appspot com api webapp2 html webapp2 Rou
  • 当方法名称是动态时,如何在 Ruby 中调用方法? [复制]

    这个问题在这里已经有答案了 video Video new thumb video thumbnail video thumbnail video video thumbnail works fine video thumbnail vid
  • Java 中处理循环事件的优雅方法?

    我认为这对我来说不是一个特定的问题 每个人以前可能都遇到过这个问题 为了正确地说明它 这里有一个简单的 UI 正如您所看到的 这两个旋转器控制着一个变量 A 唯一的区别是他们使用不同的视图来控制它 由于这两个旋钮的显示值是同步的 因此会出现