Java JSplitPane集合分割定位问题

Java JSplitPane集合分割定位问题,java,jsplitpane,Java,Jsplitpane,我有一个JSplitPane,当显示它时,应该将窗格拆分50% 现在给setDividerLocation一个0.5的参数(如建议的那样),Java似乎将其视为一个普通数字,而不是一个百分比。如中所示,分隔符几乎位于左窗格的开头,而不是窗格的中间(窗格垂直分割)。 任何解决方法?setDividerLocation(double)方法仅适用于“已实现”的帧,这意味着在打包或使帧可见之后 setDividerLocation(int)方法可以在任何时候使用。如果您希望在每次调整窗格大小时分隔符移到

我有一个JSplitPane,当显示它时,应该将窗格拆分50%

现在给setDividerLocation一个0.5的参数(如建议的那样),Java似乎将其视为一个普通数字,而不是一个百分比。如中所示,分隔符几乎位于左窗格的开头,而不是窗格的中间(窗格垂直分割)。 任何解决方法?

setDividerLocation(double)方法仅适用于“已实现”的帧,这意味着在打包或使帧可见之后


setDividerLocation(int)方法可以在任何时候使用。

如果您希望在每次调整窗格大小时分隔符移到中间位置,您可以添加ComponentListener,并让其ComponentResistized方法调用setDividerLocation(0.5)。

这将修复它:

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;
        }
    }

}

有一个解决方案是一个简单的函数,它不需要对拆分窗格进行子分类或任何其他更改。

我是否遗漏了什么?这个问题似乎有很多相当复杂的答案。。。但是我认为一个简单的setResizeWeight(0.5)可以解决这个问题。。。这本书是基于戴夫·雷的,对我有用

/**
*设置JSplitPane比例分配器位置
* 
*@param jsplitpane要设置的jsplitpane
*@参数比例分配双精度
*/
公共静态无效设置JSplitPane-JSplitPane-JSplitPane-JSplitPane-JSplitPane-JSplitPane-JSplitPane-JSplitPane-JSplitPane-JSplitPane-JSplitPane最终双比例分配)
{
if(jsplitpane.isShowing())
{
if(jsplitpane.getWidth()>0&&jsplitpane.getHeight()>0)
{
jsplitpane.setDividerLocation(比例分配);
}
其他的
{
addComponentListener(新的ComponentAdapter()
{
@凌驾
public void componentResistized(ComponentEvent ce)
{
jsplitpane.removeComponentListener(此);
设置JSPLITPANEDIVIDERLOCATION(jsplitpane,比例分配);
}
});
}
}
其他的
{
jsplitpane.addHierarchyListener(新的HierarchyListener()
{
@凌驾
公共无效层次结构已更改(层次结构事件e)
{
if((e.getChangeFlags()&HierarchyEvent.SHOWING_CHANGED)!=0&&jsplitpane.isShowing())
{
removeHierarchyListener(这个);
设置JSPLITPANEDIVIDERLOCATION(jsplitpane,比例分配);
}
}
});
}
}

使用
设置大小权重(双倍)

使用
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);
        }

    });
}

只有在拆分窗格可见时,才能将拆分窗格分隔符的位置设置为百分比。您可以点击拆分窗格所有者的事件,以确定何时可以设置分隔符的位置。例如:

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's "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();
  }
}

我发现以后调用的
setResizeWeight
setDividerLocation
组合提供了人们期望的行为:

_splitPane.setResizeWeight(0.5);

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

您可以使用setResizeWeight(…)方法进行此操作。为了澄清,如果我在代码中手动指定它,我将仅使用paint()而不使用HasControlLocation。比这个怪物还要短。刚刚遇到这个,它已经困扰了我们很多年了+1我一直使用这种方法。但是,我注意到,在移动分隔器之前,您确实会立即看到它位于错误的位置。为了解决这个问题,我选择了覆盖validate(),而不是覆盖paint(Graphics)。谢谢看起来很奇怪,虽然最流行的答案没有提到。。。关于一个2年前的问题,这显然是可以理解的
_splitPane.setResizeWeight(0.5);

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