Как выбрать то, что JPanel в разделенной панели изменяет размер, когда все приложение. изменен размер?

Поэтому я программирую приложение, используя Java Swing, и мне интересно, как сделать так, чтобы при изменении размера всего приложения только некоторые панели изменяли размеры различными способами. Посмотрите на две картинки ниже:

JavaSwing перед изменением размераJavaSwing после изменения размера

У меня есть три вертикальные панели, как вы можете видеть. Теперь, когда высота приложения увеличена, высота всех трех панелей также должна увеличиться, что работает нормально. Однако, когда ширина увеличивается, я хочу, чтобы ширина только средней панели (которая будет "рабочей областью") увеличивалась. Вместо этого, как вы можете видеть, последняя третья панель справа - единственная, ширина которой увеличивается.

Как мне сделать так, чтобы только середина JPanel растягивается и сжимается при изменении размера всего окна по оси x? Кроме того, позже я хотел бы сделать так, чтобы эта панель рабочего пространства не всегда была посередине; так как пользователь может перемещать две другие панели, чтобы настроить приложение по своему вкусу, например, чтобы две другие панели располагались друг над другом слева, а рабочая область - справа. Однако, независимо от того, где она находится, я хочу, чтобы панель рабочего пространства имела размеры, как мне это сделать?

2 ответа

Решение

Хитрость заключается в том, чтобы позвонить setResizeWeight(double) на правильной разделенной панели с соответствующим значением. НАПРИМЕР

Две разделенные панели при минимальном размере

Две раздельные панели с дополнительной шириной

Две раздельные панели с дополнительной шириной и высотой

import java.awt.*;
import javax.swing.*;
import javax.swing.border.EmptyBorder;

public class DualingSplitPanes {

    private JComponent ui = null;

    DualingSplitPanes() {
        initUI();
    }

    protected final void addPanelsToUi(JPanel p1, JPanel p2, JPanel p3) {
        JSplitPane sp1 = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, p1, p2);
        JSplitPane sp2 = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, sp1, p3);
        sp2.setResizeWeight(1);

        ui.add(sp2);
    }

    public void initUI() {
        if (ui!=null) return;

        ui = new JPanel(new BorderLayout(4,4));
        ui.setBorder(new EmptyBorder(4,4,4,4));

        JPanel treeContainer = new JPanel(new GridLayout());
        JTree tree = new JTree();
        tree.setVisibleRowCount(5);
        for (int i=tree.getVisibleRowCount()-1; i>-1; i--) {
            tree.expandRow(i);
        }
        treeContainer.add(new JScrollPane(tree));

        JPanel workSpaceContainer = new JPanel(new GridLayout());
        workSpaceContainer.add(new JTextArea(5, 10));

        JPanel searchContainer = new JPanel(new BorderLayout(4, 4));
        searchContainer.add(new JScrollPane(new JTextArea(5, 10)));

        addPanelsToUi(treeContainer, workSpaceContainer, searchContainer);
    }

    public JComponent getUI() {
        return ui;
    }

    public static void main(String[] args) {
        Runnable r = new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (Exception useDefault) {
                }
                DualingSplitPanes o = new DualingSplitPanes();

                JFrame f = new JFrame(o.getClass().getSimpleName());
                f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
                f.setLocationByPlatform(true);

                f.setContentPane(o.getUI());
                f.pack();
                f.setMinimumSize(f.getSize());

                f.setVisible(true);
            }
        };
        SwingUtilities.invokeLater(r);
    }
}

Вы можете установить ограничения для блоков, чтобы они зависели от соответствующей стороны окна.

Таким образом, левая панель - это X пикселей слева, а правая - Y пикселей справа, а затем средняя ограничена наличием левой стороны X+ слева и правой стороны Y+ справа.

Это работает до тех пор, пока вы не измените размер окна слишком маленьким (потому что тогда элементы станут слишком большими).

Другие вопросы по тегам