Java 使用JFrame.pack()时如何使用均匀放置的分隔符布局两个JSplitPane
此代码应生成一个具有2个垂直拆分窗格的框架 这应该初始化,以使分隔器均匀放置 但是,这仅在帧大小固定时有效。 这似乎是因为分裂的首选高度之和 窗格对于我的屏幕(1280x1024)太大。报告的帧高度 通过getSize()最终大于我的屏幕高度,因此 隔板位置不好 使用frame.pack()时应如何执行此操作Java 使用JFrame.pack()时如何使用均匀放置的分隔符布局两个JSplitPane,java,swing,jsplitpane,Java,Swing,Jsplitpane,此代码应生成一个具有2个垂直拆分窗格的框架 这应该初始化,以使分隔器均匀放置 但是,这仅在帧大小固定时有效。 这似乎是因为分裂的首选高度之和 窗格对于我的屏幕(1280x1024)太大。报告的帧高度 通过getSize()最终大于我的屏幕高度,因此 隔板位置不好 使用frame.pack()时应如何执行此操作 您可以使用JSplitPanes类中的方法:我用来告诉JSplitPanes如何分配大小。另外,即使在调整窗口大小时,拆分窗格也能保持均匀分布。一旦调整其中一个窗格的大小,它们将失去均匀分
您可以使用JSplitPanes类中的方法:我用来告诉
JSplitPanes
如何分配大小。另外,即使在调整窗口大小时,拆分窗格也能保持均匀分布。一旦调整其中一个窗格的大小,它们将失去均匀分布
jsl2.addAncestorListener(new BaseAncestorListener() {
@Override
public void ancestorAdded(AncestorEvent event) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
jsl2.setDividerLocation(getSize().height / 3); }
});
}
});
请注意,您不一定再需要AncestorListener
。我只是用它来打印JScrollPanes
的大小
import java.awt.BorderLayout;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JSplitPane;
import javax.swing.JTable;
import javax.swing.event.AncestorEvent;
import javax.swing.event.AncestorListener;
public class TestSplitPanels extends JPanel {
public static void main(String[] args) {
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
final TestSplitPanels tps = new TestSplitPanels();
frame.setContentPane(tps);
frame.pack();
frame.setVisible(true);
}
public TestSplitPanels() {
JTable jt1 = new JTable();
JTable jt2 = new JTable();
JTable jt3 = new JTable();
final JScrollPane jsr1 = new JScrollPane();
final JScrollPane jsr2 = new JScrollPane();
final JScrollPane jsr3 = new JScrollPane();
jsr1.setViewportView(jt1);
jsr2.setViewportView(jt2);
jsr3.setViewportView(jt3);
JSplitPane jsl1 = new JSplitPane();
JSplitPane jsl2 = new JSplitPane();
jsl1.setOrientation(JSplitPane.VERTICAL_SPLIT);
jsl1.setTopComponent(jsr1);
jsl1.setBottomComponent(jsl2);
jsl1.setResizeWeight(0.33); // <-- here
jsl2.setOrientation(JSplitPane.VERTICAL_SPLIT);
jsl2.setTopComponent(jsr2);
jsl2.setBottomComponent(jsr3);
jsl2.setResizeWeight(0.5); // <-- here
this.addAncestorListener(new BaseAncestorListener() {
@Override
public void ancestorMoved(AncestorEvent event) {
System.out.println("jsr1 size: " + jsr1.getSize());
System.out.println("jsr2 size: " + jsr2.getSize());
System.out.println("jsr3 size: " + jsr3.getSize());
System.out.println("----");
}
});
setLayout(new BorderLayout());
add(jsl1, BorderLayout.CENTER);
}
public static class BaseAncestorListener implements AncestorListener {
@Override
public void ancestorAdded(AncestorEvent event) {
}
@Override
public void ancestorRemoved(AncestorEvent event) {
}
@Override
public void ancestorMoved(AncestorEvent event) {
}
}
}
导入java.awt.BorderLayout;
导入javax.swing.JFrame;
导入javax.swing.JPanel;
导入javax.swing.JScrollPane;
导入javax.swing.JSplitPane;
导入javax.swing.JTable;
导入javax.swing.event.AncestorEvent;
导入javax.swing.event.AncestorListener;
公共类TestSplitPanels扩展了JPanel{
公共静态void main(字符串[]args){
JFrame=新JFrame();
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
最终TestSplitPanels tps=新的TestSplitPanels();
frame.setContentPane(tps);
frame.pack();
frame.setVisible(true);
}
公共TestSplitPanels(){
JTable jt1=新的JTable();
JTable jt2=新的JTable();
JTable jt3=新的JTable();
final JScrollPane jsr1=新的JScrollPane();
final JScrollPane jsr2=新的JScrollPane();
final JScrollPane jsr3=新的JScrollPane();
jsr1.setViewportView(jt1);
jsr2.setViewportView(jt2);
jsr3.setViewportView(jt3);
JSplitPane jsl1=新的JSplitPane();
JSplitPane jsl2=新的JSplitPane();
jsl1.setOrientation(JSplitPane.VERTICAL_SPLIT);
jsl1.setTopComponent(jsr1);
jsl1.setBottomComponent(jsl2);
jsl1.setResizeWeight(0.33);//谢谢您的回复。但是,我不明白这有什么帮助。我已经在代码中使用了setDividerLocation(int)。如果我使用setDividerLocation(double),它将根据拆分窗格的当前大小而不是父组件的大小(这是我想要的)放置分隔符。感谢您的回复。这可能会有所帮助。我注意到,即使JFrame大小固定,拆分面板分隔器也不总是落在同一个位置。因此,这可能意味着存在穿线问题。但是,即使您进行了更改,我也无法使分隔器按预期定位,甚至无法保持一致的定位。您比我抢先了一步。;)setResizeWeight
是一个不错的选择。谢谢,这很有效。我在文档中看到了setResizeWeight(double),但我误解了它的作用。我认为如果用户更改分隔符的位置,在调整窗口大小时,它们的设置将丢失,而不是保持固定的“权重”。事实并非如此。事实上,用户的分隔符设置并未丢失,您的解决方案运行良好。再次感谢。
import java.awt.BorderLayout;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JSplitPane;
import javax.swing.JTable;
import javax.swing.event.AncestorEvent;
import javax.swing.event.AncestorListener;
public class TestSplitPanels extends JPanel {
public static void main(String[] args) {
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
final TestSplitPanels tps = new TestSplitPanels();
frame.setContentPane(tps);
frame.pack();
frame.setVisible(true);
}
public TestSplitPanels() {
JTable jt1 = new JTable();
JTable jt2 = new JTable();
JTable jt3 = new JTable();
final JScrollPane jsr1 = new JScrollPane();
final JScrollPane jsr2 = new JScrollPane();
final JScrollPane jsr3 = new JScrollPane();
jsr1.setViewportView(jt1);
jsr2.setViewportView(jt2);
jsr3.setViewportView(jt3);
JSplitPane jsl1 = new JSplitPane();
JSplitPane jsl2 = new JSplitPane();
jsl1.setOrientation(JSplitPane.VERTICAL_SPLIT);
jsl1.setTopComponent(jsr1);
jsl1.setBottomComponent(jsl2);
jsl1.setResizeWeight(0.33); // <-- here
jsl2.setOrientation(JSplitPane.VERTICAL_SPLIT);
jsl2.setTopComponent(jsr2);
jsl2.setBottomComponent(jsr3);
jsl2.setResizeWeight(0.5); // <-- here
this.addAncestorListener(new BaseAncestorListener() {
@Override
public void ancestorMoved(AncestorEvent event) {
System.out.println("jsr1 size: " + jsr1.getSize());
System.out.println("jsr2 size: " + jsr2.getSize());
System.out.println("jsr3 size: " + jsr3.getSize());
System.out.println("----");
}
});
setLayout(new BorderLayout());
add(jsl1, BorderLayout.CENTER);
}
public static class BaseAncestorListener implements AncestorListener {
@Override
public void ancestorAdded(AncestorEvent event) {
}
@Override
public void ancestorRemoved(AncestorEvent event) {
}
@Override
public void ancestorMoved(AncestorEvent event) {
}
}
}