嵌套的 JSplitPane 问题; setPreferredSize 和 setDividerLocation 不起作用

问题描述

我有一个包含两个 JPanel 的 JFrame,一个是 menuBar,另一个是框架的主体。我希望将主体分成三个 JScrollPanes,以便它们可以扩展或缩小尺寸。我嵌套了两个 JSplitPanes 来实现这一点。我的问题是我为 JSplitPanes 定义的 setDividerLocation 和 setPreferredSize 不起作用。我尝试了 resetToPreferredSizes 并且这对 JFrame 也没有明显的影响。

这是我的代码

    public class HomeView {
    private JFrame frame;
    private JPanel top;
    private JPanel center;
    private JPanel bottom;

    private JScrollPane lPane;
    private JScrollPane cPane;
    private JScrollPane rPane;

    private JSplitPane cr;
    private JSplitPane lcr;

    public static void main(String[] args) {
        EventQueue.invokelater(new Runnable() {
            public void run() {
                try {
                    HomeView window = new HomeView();
                    window.frame.setVisible(true);
                    window.cr.resetToPreferredSizes();
                } catch (Exception e) {
                    e.printstacktrace();
                }
            }
        });
    }

    
    public HomeView() {
        initialize();
    }

    private void initialize() {
        frame = new JFrame();
        frame.setDefaultCloSEOperation(JFrame.disPOSE_ON_CLOSE);

        frame.setSize(Constants.pcSize);
        frame.setBackground(Color.BLACK);

        top = new JPanel();
        top.setBackground(P.light);

        center = new JPanel();
        center.setBackground(P.mix);

        bottom = new JPanel();
        bottom.setBackground(P.lightGrey);

        GroupLayout groupLayout = new GroupLayout(frame.getContentPane());
        groupLayout.setHorizontalGroup(groupLayout.createParallelGroup(Alignment.TRAILING)
                .addGroup(groupLayout.createSequentialGroup().addGap(P.Xa)
                        .addComponent(top,GroupLayout.DEFAULT_SIZE,C.mWidth,Short.MAX_VALUE).addGap(P.Xa))
                .addGroup(groupLayout.createSequentialGroup().addGap(P.Xb)
                        .addComponent(center,C.pWidth,Short.MAX_VALUE).addGap(P.Xb))
                .addGroup(groupLayout.createSequentialGroup().addGap(P.Xc)
                        .addComponent(bottom,C.bWidth,Short.MAX_VALUE).addGap(P.Xc)));
        groupLayout.setVerticalGroup(groupLayout.createParallelGroup(Alignment.LEADING)
                .addGroup(groupLayout.createSequentialGroup().addGap(P.H1)
                        .addComponent(top,C.mHeight,Short.MAX_VALUE).addGap(P.H2)
                        .addComponent(center,C.pHeight,Short.MAX_VALUE).addGap(P.H3)
                        .addComponent(bottom,C.bHeight,Short.MAX_VALUE).addGap(P.HZ)));

        lPane = new JScrollPane();
        lPane.setPreferredSize(new Dimension(C.lWidth,C.lHeight));

        cPane = new JScrollPane();
        cPane.setPreferredSize(new Dimension(C.cWidth,C.cHeight));

        rPane = new JScrollPane();
        rPane.setPreferredSize(new Dimension(C.rWidth,C.rHeight));

        cr = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT,cPane,rPane);
        cr.setPreferredSize(new Dimension(C.crWidth,C.crHeight));
        cr.setDividerSize(P.D);
        cr.setDividerLocation(0.8125);
        cr.setBorder(BorderFactory.createCompoundBorder());
        cr.resetToPreferredSizes();

        lcr = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT,lPane,cr);
        lcr.setDividerSize(P.D);
        lcr.setDividerLocation(0.2);
        lcr.setBorder(BorderFactory.createCompoundBorder());
        lcr.resetToPreferredSizes();

        GroupLayout layoutC = new GroupLayout(center);
        layoutC.setHorizontalGroup(
                layoutC.createParallelGroup(Alignment.LEADING).addGroup(layoutC.createSequentialGroup().addGap(0)
                        .addComponent(lcr,C.lcrWidth,GroupLayout.DEFAULT_SIZE).addGap(0)));
        layoutC.setVerticalGroup(layoutC.createParallelGroup(Alignment.LEADING).addGroup(layoutC.createSequentialGroup()
                .addGap(0).addComponent(lcr,C.lcrHeight,GroupLayout.DEFAULT_SIZE).addGap(0)));
        center.setLayout(layoutC);

        frame.getContentPane().setLayout(groupLayout);
        frame.pack();
    }
}

我的 C 和 P 类只是存储值。

public class P {

    public static int Xa = 0;
    public static int Xb = 1;
    public static int Xc = 1;

    public static int H1 = 0;
    public static int H2 = 1;
    public static int H3 = 1;
    public static int HZ = 0;
    
    public static int D = 4;
    
    public static Color white = new Color(255,255,255);
    public static Color black = new Color(0,0);
    public static Color dark = new Color(60,60,60);
    public static Color light = new Color(220,220,255);
    public static Color mix = new Color(150,180,210);
    public static Color javaDefault = new Color(204,204,204);
    public static Color distinct = new Color(180,55,55);
    public static Color ciel = new Color(0,55);
    public static Color darkGrey = new Color(88,88,88);
    public static Color lightGrey = new Color(230,230,230);
    
}
public class C {
    public static Dimension pcSize = Toolkit.getDefaultToolkit().getScreenSize();

    private static String s = File.separator;
    public static File defaultFile = new File("Metadata" + s + "default");
    public static File userFile = new File("Metadata" + s + "user");

    private static int tolR = 8;
    private static int tolL = 8;
    private static int tolT = 31;
    private static int tolB = 8;

    public static int pcWidth = pcSize.width;
    public static int pcHeight = pcSize.height;

    public static int sHeight = pcHeight - tolT - tolB;
    public static int sWidth = pcWidth - tolR - tolL;

    public static int mHeight = (int) ((double) (sHeight * 0.062));
    public static int mWidth = sWidth - (2 * P.Xa);
    
    public static int bHeight = (int) ((double) (sHeight * 0.0345));
    public static int bWidth = sWidth - (2 * P.Xc);
    
    public static int pHeight = sHeight - P.H1 - mHeight - P.H2 - P.H3 - bHeight - P.HZ;
    public static int pWidth = sWidth - (2 * P.Xb);
    
    public static int lHeight = pHeight;
    public static int lWidth = (int)((double) (sWidth * 0.2));
    
    public static int cHeight = pHeight;
    public static int cWidth = (int)((double) (sWidth * 0.65));
    
    public static int rHeight = pHeight;
    public static int rWidth = sWidth - lWidth - cWidth;
    
    public static int crWidth = cWidth + rWidth;
    public static int crHeight = cHeight;
    
    public static int lcrWidth = pWidth;
    public static int lcrHeight = pHeight;
}

我刚刚添加了它们,以防有人想尝试运行我的代码

我的结果:

enter image description here

这不是预期的首选大小或分隔符位置。我尝试删除它们,但输出没有变化。我希望有人能帮我发现哪里出了问题?。耐心等待。

解决方法

cr.setDividerLocation(0.8125);

setDividerLocation( double ) 方法仅适用于“已实现”的框架。也就是说,在调用布局管理器之前,组件没有大小。因此,在调用 pack() 方法之前,您需要在框架上调用 setVisible(true)setDividerLocation()

然而,这并不是一个好的解决方案,因为您的课程设计不当。您的 HomeView 班级不应了解有关框架的任何信息。它应该是一个独立的组件,就像可以添加到任何框架或对话框的 JLabel 或 JButton。框架应在您的 main() 方法中创建。

那么更好的解决方案是在您的类的构造函数中将代码包装在 SwingUtilities.invokeLater() 中,将代码添加到 Event Dispatch Thread (EDT) 的末尾,以确保代码在框架可见后执行。类似的东西

SwingUtilities.invokeLater(new Runnable()
{
    public void run()
    {
        cr.setDividerLocation(0.8125);
    }
});

阅读 How to Use Split Panes 上的 Swing 教程。 SplitPaneDemo 代码将演示如何更好地构建您的代码。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...