【发布时间】:2017-03-05 22:37:52
【问题描述】:
我有 JPanel,其中包含 JSplitPane。 JPanel 在运行时使用invokeAndWait 方法注入到JFrame 中。然后调用 invokeLater 来更新 SplitPane 中的分隔符位置。
问题是,当调用分隔线更新时,JPanel 宽度仍然为 0。
当我在代码中的任何位置(invokeLater 除外)添加睡眠或断点时,代码工作正常。
final JPanel viewPanel = new JPanel();
viewPanel.setLayout(new BorderLayout());
final JPanel header = getPresenterHeader(getPageTitle(), getPageInstructions());
viewPanel.add(header, BorderLayout.NORTH);
viewPanel.add(getSplitPane(), BorderLayout.CENTER);
toolbar = createActionsToolBar();
toolbar.addAction(new ExitPresenterAction(this));
viewPanel.add(toolbar, BorderLayout.SOUTH);
addContent(viewPanel);
SwingUtilities.invokeLater(new Runnable()
{
@Override
public void run()
{
splitPane.setDividerLocation(0.5);
}
});
【问题讨论】:
-
不应该,
invokeLater如果在 EDT 中调用会被延迟。 -
是的,我无法理解它。据我了解
invokeLater,它应该等待 GUI 展开。 -
确保在event dispatch thread 之前为example 构建您的Swing GUI 对象。
-
我已更改您问题的标题。新标题可能有助于其他开发人员找到此解决方案。
标签: java multithreading swing awt invokelater