Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Swing:区分用户诱导组件和自动组件大小调整(编写自定义LayoutManager)的问题_Java_Multithreading_Swing_Events_Synchronization - Fatal编程技术网

Java Swing:区分用户诱导组件和自动组件大小调整(编写自定义LayoutManager)的问题

Java Swing:区分用户诱导组件和自动组件大小调整(编写自定义LayoutManager)的问题,java,multithreading,swing,events,synchronization,Java,Multithreading,Swing,Events,Synchronization,我正在尝试编写自己的布局管理器 组件必须相对放置并调整大小。相互之间的关系。 这意味着:当用户拖动或调整组件大小时,其他 组件(但不是用户手动更改的组件)必须 被改变 Swing告诉布局管理器在每次 其中一些已被移动/调整大小。这是一个布局问题 管理器本身移动/调整组件大小: 它失败了,方法失败了 layoutContainer(容器父级)被多次调用 整个事情的示例(简化,事实上我的布局管理器就是这样做的 更复杂的东西): [-component1-][-component2------][-

我正在尝试编写自己的布局管理器

组件必须相对放置并调整大小。相互之间的关系。
这意味着:当用户拖动或调整组件大小时,其他 组件(但不是用户手动更改的组件)必须 被改变

Swing告诉布局管理器在每次 其中一些已被移动/调整大小。这是一个布局问题 管理器本身
移动/调整组件大小:
它失败了,方法失败了 layoutContainer(容器父级)被多次调用

整个事情的示例(简化,事实上我的布局管理器就是这样做的 更复杂的东西):

  • [-component1-][-component2------][-component3-]
  • 用户将component2的大小调整为更小,我的布局管理器将进行调整 其他组件,以便所有组件占用与以前相同的空间:
    [-component1-][-component2-][-component3------]
  • 在这里,操作应该停止,但它们仍在继续:现在是布局管理器 由于调整component3的大小而调用
我如何(以优雅的方式)实现我的意图 多谢各位

编辑:

在回答者提出建议后,删除了与线程相关的信息。

我无法说明布局管理器的正确实现,但就线程而言,Swing中的所有事件都在Swing UI线程上调度,即同一线程。因此,同步对象将没有效果,因为只涉及一个线程。您可以通过打印
thread.currentThread()
或在调试器中检查来查看哪个线程正在调用方法


根据你想做什么,你可能想看看。我发现它功能强大,使用方便。正确实现Swing布局管理器是一项非常重要的任务。

这不是线程同步问题

您说过,当用户更改对象的大小或位置时,必须更改其他对象。我猜您正在列出某种更改事件,以便在用户更改对象时触发布局的重新计算。如果是这样,我进一步猜测您的布局管理器正在触发此事件,导致再次调用它


当然,这只是猜测,没有检查代码。

这种反馈循环在处理事件时并不少见。有几种方法可以用来打破这个循环,我建议您尝试的方法是跟踪组件的计算大小。然后,在处理调整大小事件时,将实际大小与计算的大小进行比较,如果它们相等,则不做任何操作即可返回。这可能是最稳健的方法,因为它不依赖于事件的顺序或频率。正如其他地方所述,您不需要从布局管理器中接触任何与线程相关的内容。

好的,我喜欢听到Swing在一个线程中处理所有内容。但如何阻止这种雪球效应呢?应该处理用户引起的组件移动,而不是自动移动。我没有监听事件。当某些内容被移动时,Swing会调用layoutmanager的“layoutContainer(容器父级)”。如果您正在侦听事件,则组件无法调整大小。用户正在做的事情是调整大小,因此您必须有一个鼠标侦听器或拖动侦听器。您可以将鼠标向下移动,在布局管理器上设置用户正在拖动的标志,并在看到鼠标向上时清除该标志。然后您可以区分“用户”更改(拖动期间)和“系统”事件。您还可以捕获用户在同一地点/时间积极修改的组件。否,在移动/调整任何组件的大小后,(通过Swing)调用布局管理器的“layoutContainer(Container parent)”方法。就这样。请相信我;)“将实际尺寸与计算尺寸进行比较”<这很有帮助!非常感谢你。