我正在尝试编写自己的布局管理器。
组件必须相互放置并且相对的大小。
这意味着:当用户拖动或调整组件的大小时,其他一些组件
组件(但不由用户手动更改的组件)必须
被改变了。
Swing告诉布局管理器每次布局组件
其中一些被移动/调整大小。这是布局的问题
经理本身移动/调整组件大小:
它失败了,方法
layoutContainer(Container parent)被多次调用。
整个事物的示例(简化,实际上我的布局管理器确实如此) 更复杂的东西):
[-component1-][-component2-------][-component3-]
[-component1-][-component2-][-component3-------]
我怎样才能达到目的(以优雅的方式)? 谢谢。
修改
在回答者提出建议后删除了与线程相关的信息。
答案 0 :(得分:2)
这种反馈循环在处理事件时并不罕见。您可以使用几种方法来摆脱这种循环,我建议您尝试的方法是跟踪计算出的组件大小。然后,当您处理resize事件时,将实际大小与计算出的大小进行比较,如果它们相等则只返回而不做任何事情。这可能是最强大的方法,因为它不依赖于事件的顺序或频率。如其他地方所述,您不需要触摸布局管理器中与线程相关的任何内容。
答案 1 :(得分:1)
这不是线程同步问题。
您说当用户更改对象的大小或位置时,必须更改其他对象。我猜你正在列出某种变化事件,这样你就可以在用户更改对象时触发重新计算布局。如果是这样,我进一步猜测你的布局管理器正在触发这个事件,导致它再次被调用。
当然,这只是在没有审核您的代码的情况下的推测。
答案 2 :(得分:0)
我不能说布局管理器的正确实现,但就线程而言,Swing中的所有事件都是在Swing UI线程上调度的,即同一个线程。因此,同步对象将不起作用,因为只涉及一个线程。您可以通过打印Thread.currentThread()
或在调试器中检查方法来查看调用方法的线程。
根据您要执行的操作,您可能需要查看miglayout。我发现它非常强大且易于使用。正确实现Swing布局管理器是一项非常重要的任务。