Как установить расположение делителя для JSplitPane при запуске

У меня есть JPanel, который содержит JSplitPane. JPanel вводится во время выполнения в JFrame с использованием метода invokeAndWait. Затем вызывается invokeLater для обновления расположения разделителя в SplitPane.
Проблема в том, что когда вызывается обновление делителя, ширина JPanel по-прежнему равна 0.
Когда я добавляю sleep или точку останова где-либо в коде (кроме 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);
        }
    }); 

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);
Другие вопросы по тегам