【问题标题】:How to make this 3 column splitter in Java?如何在 Java 中制作这 3 列拆分器?
【发布时间】:2015-03-13 21:18:37
【问题描述】:

我正在使用 Java 和 MiGLayout 尝试重新创建此布局:

http://www.methvin.com/splitter/3csplitter.html

所以是这样的:

  • 每列都需要调整大小
  • 调整主窗口大小时左右列的大小保持不变
  • 中间列填充所有可用空间并在调整大小时更改大小

也就是说,左右面板需要“粘”在窗口的左右两侧,而且还可以调整大小(调整大小时不按比例变化)

我尝试了很多方法,但调整大小始终是个问题。这是当前代码,它尝试使用嵌套的 JSplitPane 进行此操作。

public class MainGUI extends JFrame {
    private String app_name = "Layout Test";
    private int window_x_min = 700;
    private int window_y_min = 450;

    public MainGUI() {
        setTitle(app_name);
        setSize(window_x_min + 200, window_y_min + 100);
        setMinimumSize(new Dimension(window_x_min, window_y_min));
        setLocationRelativeTo(null);
        setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);

        JPanel panel = new JPanel();
        this.setContentPane(panel);
        panel.setLayout(new MigLayout("","[]","[grow]"));
        JSplitPane splitpane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT);
        splitpane.setContinuousLayout(true);

        splitpane.setTopComponent(new JButton("middle"));
        splitpane.setBottomComponent(new JButton("right"));

        JSplitPane splitpane2 = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT);
        splitpane2.setContinuousLayout(true);
        splitpane.setDividerLocation(450);

        splitpane2.setBottomComponent(splitpane);
        splitpane2.setTopComponent(new JButton("left"));

        panel.add(splitpane2, "push, grow");

        this.pack();
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setVisible(true);
    }
}

我已经设法让它最初按我喜欢的方式加载,但是存在以下问题:

  • 从右侧调整大小会更改“右侧”面板的大小,而不是中间面板的大小
  • 从左侧调整大小也会改变“右侧”面板的大小

应用程序的左侧似乎正在运行,我需要右侧以相同的方式运行。希望我说得通,谢谢!

【问题讨论】:

    标签: java swing layout layout-manager miglayout


    【解决方案1】:

    您需要管理调整拆分窗格大小时空间的分配方式。这是通过使用setResizeWeight() 方法完成的。默认情况下,该值为 0.0f,这意味着“左”组件是固定的。因此,您需要在其中一个拆分窗格上操作此属性。阅读 API 以了解有关此属性如何工作的更多信息。

    我不使用 MigLayout,但是使用标准 BorderLayout 做一个简单的测试,你需要添加的是:

    splitpane.setResizeWeight(1.0f);
    

    另外,当您发布SSCCE 时,不要忘记包含 main() 方法,这样我们就可以复制/粘贴/执行代码。我们应该不需要做任何额外的工作。

    【讨论】:

    • 谢谢!我很抱歉没有使用 Main 方法。这是一个简单的修复,我很感激你的帮助。
    猜你喜欢
    • 2011-01-20
    • 1970-01-01
    • 1970-01-01
    • 2016-11-14
    • 1970-01-01
    • 2015-01-14
    • 2012-02-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多