【问题标题】:How to set divider location for JSplitPane on start-up如何在启动时为 JSplitPane 设置分隔线位置
【发布时间】: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


【解决方案1】:

我不确定它是否对您有帮助,但我们有一种方法在这种情况下最有帮助:

public static JSplitPane setDividerLocation(final JSplitPane splitter, final double proportion) {
    if (splitter.isShowing()) {
        if ((splitter.getWidth() > 0) && (splitter.getHeight() > 0)) {
            splitter.setDividerLocation(proportion);
        } else {
            splitter.addComponentListener(new ComponentAdapter() {
                @Override
                public void componentResized(ComponentEvent ce) {
                    splitter.removeComponentListener(this);
                    setDividerLocation(splitter, proportion);
                }
            });
        }
    } else {
        splitter.addHierarchyListener(new HierarchyListener() {
            @Override
            public void hierarchyChanged(HierarchyEvent e) {
                if (((e.getChangeFlags() & HierarchyEvent.SHOWING_CHANGED) != 0) && splitter.isShowing()) {
                    splitter.removeHierarchyListener(this);
                    setDividerLocation(splitter, proportion);
                }
            }
        });
    }
    return splitter;
}

使用它代替invokeLater 调用

setDividerLocation(splitPane, 0.5);

【讨论】:

  • 像魅力一样工作。谢谢!
  • 是的,它可以工作,但你为什么返回拆分器的引用?
  • @superuser000001 我只是在我们的资源中找到了这个方法。但你可以让它无效。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-04
相关资源
最近更新 更多