Swing布局管理器/解决方案可替代动态创建和嵌套的拆分窗格? [英] Swing layout manager/solution to replace dynamically created and nested split panes?

查看:133
本文介绍了Swing布局管理器/解决方案可替代动态创建和嵌套的拆分窗格?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在使用文本编辑器,其中用户可以自由地将编辑器窗口垂直或水平划分任意次数(即,划分为任意数量的窗格).单个窗口可以在垂直和水平方向上进行划分(例如,2行,其中包含3列,等等).每个窗格在JScrollPane和状态栏内都包含一个JTextArea.

I'm working on a text editor in which the user is free to divide the editor window vertically or horizontally any number of times (ie, into any number of panes). A single window can be divided both vertically and horizontally (for example, 2 rows, one which contains 3 columns, etc). Each pane contains a JTextArea inside a JScrollPane and a status bar.

到目前为止,我的方法是使用嵌套的JSplitPanes.我一直在努力布置拆分窗格的分隔器,以便在所有垂直或水平拆分的窗格之间均等地划分窗口中的空间.我已经很接近正确了,但是我不得不在许多地方使用setPreferredSize()(

My approach thus far has been to use nested JSplitPanes. I've struggled to arrange the split pane dividers so that the space in the window is divided equally among all the vertically- or horizontally-split panes. I've come quite close to getting it right, but I've had to resort to using setPreferredSize() in a number of places (Should I avoid the use of set[Preferred|Maximum|Minimum]Size methods in Java Swing?).

我想知道完全采用另一种方法是否更容易/更好. MultiSplitPane 看起来很诱人. ..

I am wondering if it would be easier/better to take a different approach entirely. MultiSplitPane looks tempting...

最适合我的情况的布局/方法是什么?

What would be the best layout/approach for my situation?

推荐答案

我决定花一些时间来学习MultiSplitPane布局.看起来是个不错的解决方案.

I decided to invest some time in learning the MultiSplitPane layout. It looks like a good solution.

这是我作为测试编写的代码.本质上,这是对布局的模拟,该布局随着用户以各种方式分割窗口而动态变化.这有点冗长,但是对于尝试学习MultiSplitPane的人来说可能会有所帮助.

Here is the code I wrote as a test. It's essentially a simulation of a layout that changes dynamically as the user splits the window in various ways. It's a bit lengthy, but maybe it will be helpful to someone who is trying to learn MultiSplitPane.

最终结果如下:

import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.Container;
import java.awt.Dimension;
import java.util.LinkedList;

import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;

import org.jdesktop.swingx.MultiSplitPane;
import org.jdesktop.swingx.MultiSplitLayout.*;

@SuppressWarnings("serial")
class MultiSplitPaneTest extends JFrame {
    private final static String sampleText;

    static {
        String text = "I'm working on a text editor in which the user is free to divide the editor window vertically or horizontally any number of times (ie, into any number of panes).\n";
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < 10; i++) {
            sb.append(text);
        }
        sampleText = sb.toString();
    }

    private class MyScrollPane extends JScrollPane {
        public MyScrollPane(final Component view) {
            super(view);
        }
        @Override
        public Dimension getPreferredSize() {
            return new Dimension(1440, 900);
        }
    }

    public MultiSplitPaneTest() {
        // The application opens with a window containing a single pane (a single text area).

        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        Container cp = getContentPane();
        cp.setLayout(new BorderLayout());

        JTextArea ta1 = new JTextArea();
        ta1.setText("TEXT AREA 1\n" + sampleText);

        MyScrollPane sp1 = new MyScrollPane(ta1);
        sp1.setViewportView(ta1);

        cp.add(sp1, BorderLayout.CENTER);

        pack();
        setLocationRelativeTo(null);
        setVisible(true);

        // -------------------------------------------------

        // Let's say the user splits the window horizontally, creating a second pane.
        // We'll simulate that with the following code.

        JTextArea ta2 = new JTextArea();
        ta2.setText("TEXT AREA 2\n" + sampleText);

        MyScrollPane sp2 = new MyScrollPane(ta2);
        sp2.setViewportView(ta2);

        Leaf leaf1 = new Leaf("1");
        Leaf leaf2 = new Leaf("2");

        LinkedList<Node> rootChildren = new LinkedList<>();
        rootChildren.add(leaf1);
        rootChildren.add(new Divider());
        rootChildren.add(leaf2);

        Split root = new Split();
        root.setRowLayout(true);
        root.setChildren(rootChildren);

        MultiSplitPane multiSplitPane = new MultiSplitPane();
        multiSplitPane.getMultiSplitLayout().setModel(root);

        multiSplitPane.add(sp1, "1");
        multiSplitPane.add(sp2, "2");

        cp.remove(sp1);
        cp.add(multiSplitPane, BorderLayout.CENTER);

        // --------------------------------------------------

        // Let's say the user splits the window horizontally again, creating a new pane on the very left.

        JTextArea ta3 = new JTextArea();
        ta3.setText("TEXT AREA 3\n" + sampleText);

        MyScrollPane sp3 = new MyScrollPane(ta3);
        sp3.setViewportView(ta3);

        Leaf leaf3 = new Leaf("3");

        rootChildren.add(0, leaf3);
        rootChildren.add(1, new Divider());

        root.setChildren(rootChildren);

        multiSplitPane.add(sp3, "3");

        multiSplitPane.revalidate();

        // --------------------------------------------------

        // Let's say the user decides to remove the center pane (that is, the first pane that we started with).

        rootChildren.remove(2); // Remove leaf1.
        rootChildren.remove(2); // Remove the divider following leaf1.

        root.setChildren(rootChildren);

        multiSplitPane.remove(sp1);

        multiSplitPane.revalidate();

        // --------------------------------------------------

        // Let's say the user creates another pane, this time splitting the pane on the right vertically.

        rootChildren.remove(leaf2);

        JTextArea ta4 = new JTextArea();
        ta4.setText("TEXT AREA 4\n" + sampleText);

        MyScrollPane sp4 = new MyScrollPane(ta4);
        sp4.setViewportView(ta4);

        Leaf leaf4 = new Leaf("4");

        LinkedList<Node> branchChildren = new LinkedList<>();
        branchChildren.add(leaf2);
        branchChildren.add(new Divider());
        branchChildren.add(leaf4);

        Split branch = new Split();
        branch.setRowLayout(false);
        branch.setChildren(branchChildren);

        rootChildren.add(branch);

        root.setChildren(rootChildren);

        multiSplitPane.add(sp4, "4");

        multiSplitPane.revalidate();
    }
}

这篇关于Swing布局管理器/解决方案可替代动态创建和嵌套的拆分窗格?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆