Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/389.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用JFrame.pack()时如何使用均匀放置的分隔符布局两个JSplitPane_Java_Swing_Jsplitpane - Fatal编程技术网

Java 使用JFrame.pack()时如何使用均匀放置的分隔符布局两个JSplitPane

Java 使用JFrame.pack()时如何使用均匀放置的分隔符布局两个JSplitPane,java,swing,jsplitpane,Java,Swing,Jsplitpane,此代码应生成一个具有2个垂直拆分窗格的框架 这应该初始化,以使分隔器均匀放置 但是,这仅在帧大小固定时有效。 这似乎是因为分裂的首选高度之和 窗格对于我的屏幕(1280x1024)太大。报告的帧高度 通过getSize()最终大于我的屏幕高度,因此 隔板位置不好 使用frame.pack()时应如何执行此操作 您可以使用JSplitPanes类中的方法:我用来告诉JSplitPanes如何分配大小。另外,即使在调整窗口大小时,拆分窗格也能保持均匀分布。一旦调整其中一个窗格的大小,它们将失去均匀分

此代码应生成一个具有2个垂直拆分窗格的框架 这应该初始化,以使分隔器均匀放置

但是,这仅在帧大小固定时有效。 这似乎是因为分裂的首选高度之和 窗格对于我的屏幕(1280x1024)太大。报告的帧高度 通过getSize()最终大于我的屏幕高度,因此 隔板位置不好

使用frame.pack()时应如何执行此操作


您可以使用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) {
        }

    }
}