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

时间:2009-05-29 23:02:46

标签: java multithreading swing events synchronization

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

组件必须相互放置并且相对的大小。
这意味着:当用户拖动或调整组件的大小时,其他一些组件 组件(但由用户手动更改的组件)必须 被改变了。

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

整个事物的示例(简化,实际上我的布局管理器确实如此) 更复杂的东西):

  • [-component1-][-component2-------][-component3-]
  • 用户将component2调整为更小,我的布局管理器会调整 其他组件使所有组件都占用与以前相同的空间:
    [-component1-][-component2-][-component3-------]
  • 此处,应停止,但它们会继续:现在是布局管理器 因调整component3的大小而被调用

我怎样才能达到目的(以优雅的方式)? 谢谢。

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

3 个答案:

答案 0 :(得分:2)

这种反馈循环在处理事件时并不罕见。您可以使用几种方法来摆脱这种循环,我建议您尝试的方法是跟踪计算出的组件大小。然后,当您处理resize事件时,将实际大小与计算出的大小进行比较,如果它们相等则只返回而不做任何事情。这可能是最强大的方法,因为它不依赖于事件的顺序或频率。如其他地方所述,您不需要触摸布局管理器中与线程相关的任何内容。

答案 1 :(得分:1)

这不是线程同步问题。

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

当然,这只是在没有审核您的代码的情况下的推测。

答案 2 :(得分:0)

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

根据您要执行的操作,您可能需要查看miglayout。我发现它非常强大且易于使用。正确实现Swing布局管理器是一项非常重要的任务。