Java 使用3个面板创建JSplitPane

Java 使用3个面板创建JSplitPane,java,swing,Java,Swing,我想创建一个包含3个JPanel的窗口,由splitPane-s分隔。左边的,右边的应该是用户可调整的,中间的一个应该填满剩余的空间。< /P> 我已经创建了它,但是如果我移动第一个拆分窗格,那么第二个拆分窗格也在移动。我也不确定,我是否用最好的方法来满足我的需求 import java.awt.BorderLayout; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JSplitPane; p

我想创建一个包含3个JPanel的窗口,由splitPane-s分隔。左边的,右边的应该是用户可调整的,中间的一个应该填满剩余的空间。< /P> 我已经创建了它,但是如果我移动第一个拆分窗格,那么第二个拆分窗格也在移动。我也不确定,我是否用最好的方法来满足我的需求

import java.awt.BorderLayout;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JSplitPane;

public class MyWindow extends JFrame {

    public MyWindow() {
        this.setLayout(new BorderLayout());

        JPanel leftPanel = new JPanel();
        JPanel centerPanel = new JPanel();
        JPanel centerPanel2 = new JPanel();
        JPanel rightPanel = new JPanel();

        JSplitPane sp = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, leftPanel, centerPanel);
        JSplitPane sp2 = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, centerPanel2, rightPanel);

        centerPanel.setLayout(new BorderLayout());
        this.add(sp, BorderLayout.CENTER);
        centerPanel.add(sp2, BorderLayout.CENTER);

        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        this.setSize(500, 500);
        this.setVisible(true);
    }

}

您所做的事情在我看来非常奇怪,即将
中心面板
添加到拆分窗格,然后将拆分窗格添加到
中心窗格
。不确定,但我认为后者否定了前者

您只需将第一个拆分窗格添加到第二个拆分窗格

import java.awt.BorderLayout;
import java.awt.Color;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JSplitPane;
import javax.swing.SwingUtilities;

public class MyWindow extends JFrame {

    public MyWindow() {
        this.setLayout(new BorderLayout());

        JPanel leftPanel = new JPanel();
        leftPanel.setBackground(Color.BLUE);
        JPanel centerPanel = new JPanel();
        centerPanel.setBackground(Color.CYAN);
        JPanel rightPanel = new JPanel();
        rightPanel.setBackground(Color.GREEN);

        JSplitPane sp = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, leftPanel, centerPanel);
        JSplitPane sp2 = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, sp, rightPanel);

        this.add(sp2, BorderLayout.CENTER);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        this.setSize(500, 500);
        this.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable(){
            public void run() {
                new MyWindow();
            }
        });
    }
}

某种程度上。左窗格的大小只能调整到第二个分隔符。另一方面,右窗格可以一直收缩到最左侧面板的最左侧边界。这是一个半解决方案,但实际上并不是正确的方法。几乎就是这样。您需要做的就是将
sp
的最小大小设置为分隔器位置+2*分隔器大小+1,这似乎可以完成任务。我没有费心深入探究为什么会出现这种情况,但它修复了@searchengine27评论中的错误。因此,您可以为此编写一个新组件,也可以简单地为
sp
创建一个匿名类。请注意,这只能防止分隔器收缩左侧面板。另一个解决方案是调整正确组件的大小。我不明白这怎么可能。最小尺寸分隔器位置+分隔器尺寸对我来说很好。我向
sp
添加了一个属性侦听器,而不是一个匿名类。