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