Подтвердить что ты не робот

Проблема с JSplitPane SetDividerLocation

У меня есть JSplitPane, который при отображении должен разделить панель на 50%.

Теперь, указав аргумент 0.5 (как предложено) в setDividerLocation, Java, похоже, относится к нему как к обычному числу, а не к проценту. Как и в случае, разделитель вместо перехода к середине панели находится почти в начале левой панели (панель вертикально разделена). Любая работа вокруг?

4b9b3361

Ответ 1

Я что-то упустил? На этот вопрос, похоже, довольно много запутанных ответов... но я думаю, что простой setResizeWeight (0.5) решит проблему... он описан в Учебное пособие по SplitPane

Ответ 2

Метод setDividerLocation (double) работает только на "реализованном" кадре, что означает, что после того, как вы упаковали или сделали рамку видимой.

Метод setDividerLocation (int) может быть использован в любое время.

Ответ 3

Вы можете установить положение разделителя разделенных панелей в процентах, когда видна панель разделения. Вы можете задействовать события владельца панели разбиения, чтобы определить, когда в нем будет установлено OK, чтобы установить местоположение разделителя. Например:

public class MyFrame extends JFrame {

  public MyFrame() {

    final JSplitPane splitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT);
    // ... set up the split pane, and add to the frame ...

    // Listen for the frame "shown" event.

    addComponentListener(new ComponentAdapter() {

      @Override
      public void componentShown(ComponentEvent componentEvent) {

        // Set the divider location to 20%.
        // This works because we know the pane is visible.

        splitPane.setDividerLocation(.2);

        // Stop listening for "shown" events.

        removeComponentListener(this);
      }

    });

    pack();
  }
}

Ответ 4

это исправляет:

public class JSplitPane3 extends JSplitPane {
    private boolean hasProportionalLocation = false;
    private double proportionalLocation = 0.5;
    private boolean isPainted = false;

    public void setDividerLocation(double proportionalLocation) {
        if (!isPainted) {
            hasProportionalLocation = true;
            this.proportionalLocation = proportionalLocation;
        } else {
            super.setDividerLocation(proportionalLocation);
        }
    }

    public void paint(Graphics g) {
        super.paint(g);
        if (!isPainted) {
            if (hasProportionalLocation) {
                super.setDividerLocation(proportionalLocation);
            }
            isPainted = true;
        }
    }

}

Ответ 5

Если вы счастливы, что делитель перемещается в середину каждый раз при изменении размера панели, вы можете добавить компонент ComponentListener и вызвать метод setDividerLocation (0.5) метода componentResized.

Ответ 6

Это работает для меня, на основе ссылки Dave Rays .

/**
 * Set JSplitPane proportional divider location
 * 
 * @param jsplitpane JSplitPane to set
 * @param proportionalLocation double <0.0; 1.0>
 */
public static void setJSplitPaneDividerLocation(final JSplitPane jsplitpane, final double proportionalLocation)
{
    if (jsplitpane.isShowing())
    {
        if (jsplitpane.getWidth() > 0 && jsplitpane.getHeight() > 0)
        {
            jsplitpane.setDividerLocation(proportionalLocation);
        }
        else
        {
            jsplitpane.addComponentListener(new ComponentAdapter()
            {
                @Override
                public void componentResized(ComponentEvent ce)
                {
                    jsplitpane.removeComponentListener(this);
                    setJSplitPaneDividerLocation(jsplitpane, proportionalLocation);
                }
            });
        }
    }
    else
    {
        jsplitpane.addHierarchyListener(new HierarchyListener()
        {
            @Override
            public void hierarchyChanged(HierarchyEvent e)
            {
                if ((e.getChangeFlags() & HierarchyEvent.SHOWING_CHANGED) != 0 && jsplitpane.isShowing())
                {
                    jsplitpane.removeHierarchyListener(this);
                    setJSplitPaneDividerLocation(jsplitpane, proportionalLocation);
                }
            }
        });
    }
}

Ответ 7

использовать setResizeWeight(double);

Ответ 9

В Component с JSplitPane выполняется следующее:

@Override
public void setVisible(final boolean b) {
    super.setVisible(b);
    SwingUtilities.invokeLater(new Runnable() {

        @Override
        public void run() {
            AppFrame.this.jSplitPane.setDividerLocation(0.9d);
        }

    });
}

Ответ 10

Я обнаружил, что комбинация setResizeWeight и setDividerLocation, вызываемая позже, обеспечивает поведение, которое можно было бы ожидать:

_splitPane.setResizeWeight(0.5);

SwingUtilities.invokeLater(new Runnable() {
    @Override
    public void run() {
        _splitPane.setDividerLocation(0.5);
    }
});