Ответ 1
Я что-то упустил? На этот вопрос, похоже, довольно много запутанных ответов... но я думаю, что простой setResizeWeight (0.5) решит проблему... он описан в Учебное пособие по SplitPane
У меня есть JSplitPane, который при отображении должен разделить панель на 50%.
Теперь, указав аргумент 0.5 (как предложено) в setDividerLocation, Java, похоже, относится к нему как к обычному числу, а не к проценту. Как и в случае, разделитель вместо перехода к середине панели находится почти в начале левой панели (панель вертикально разделена). Любая работа вокруг?
Я что-то упустил? На этот вопрос, похоже, довольно много запутанных ответов... но я думаю, что простой setResizeWeight (0.5) решит проблему... он описан в Учебное пособие по SplitPane
Метод setDividerLocation (double) работает только на "реализованном" кадре, что означает, что после того, как вы упаковали или сделали рамку видимой.
Метод setDividerLocation (int) может быть использован в любое время.
Вы можете установить положение разделителя разделенных панелей в процентах, когда видна панель разделения. Вы можете задействовать события владельца панели разбиения, чтобы определить, когда в нем будет установлено 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();
}
}
это исправляет:
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;
}
}
}
Если вы счастливы, что делитель перемещается в середину каждый раз при изменении размера панели, вы можете добавить компонент ComponentListener и вызвать метод setDividerLocation (0.5) метода componentResized.
Это работает для меня, на основе ссылки 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);
}
}
});
}
}
использовать setResizeWeight(double);
Здесь есть решение которое представляет собой простую функцию, которая не требует подклассификации или любых других изменений в вашей области разделения.
В 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);
}
});
}
Я обнаружил, что комбинация setResizeWeight
и setDividerLocation
, вызываемая позже, обеспечивает поведение, которое можно было бы ожидать:
_splitPane.setResizeWeight(0.5);
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
_splitPane.setDividerLocation(0.5);
}
});