Как создать два JSplitPanes с равномерно расположенными разделителями при использовании JFrame.pack () - PullRequest
2 голосов
/ 29 марта 2011

Этот код должен создать кадр с 2 вертикальными разделенными панелями это должно инициализировать так, чтобы разделители были расположены равномерно.

Однако это работает, только если размер кадра фиксирован. Кажется, это потому, что сумма предпочтительных высот раскола панель слишком велика для моего экрана (1280x1024). Высота JFrame сообщила by getSize () оказывается больше, чем моя высота экрана и, таким образом, делители плохо расположены.

Как это сделать при использовании frame.pack ()?

import java.awt.*;
import javax.swing.*;
import javax.swing.event.*;

public class TestSplitPanels extends JPanel {


public static void main(String[] args) {
    JFrame frame = new JFrame();
    frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);

    TestSplitPanels tps = new TestSplitPanels();

    frame.setContentPane(tps);

    frame.pack();

    // uncomment this and the dividers are nicely positioned
    // frame.setSize(600,600);

    frame.setVisible(true);

}

public TestSplitPanels() {
    JTable jt1 = new JTable();

    JTable jt2 = new JTable();

    JTable jt3 = new JTable();

    // wrap every JTable in a scroll pane

    JScrollPane jsr1 = new JScrollPane();
    jsr1.setViewportView(jt1);

    JScrollPane jsr2 = new JScrollPane();
    jsr2.setViewportView(jt2);

    JScrollPane jsr3 = new JScrollPane();
    jsr3.setViewportView(jt3);


    final JSplitPane jsl1 = new JSplitPane();
    final JSplitPane jsl2 = new JSplitPane();

    /* 
     * Make a vertical split pane who's top component is
     * is the first scroll pane and bottom component is 
     * another scroll pane. Try to set the divider location
     * at a third of the height of the parent component,
     * when that value is known
     */
    jsl1.setOrientation(JSplitPane.VERTICAL_SPLIT);
    jsl1.setTopComponent(jsr1);
    jsl1.setBottomComponent(jsl2);
    jsl1.addAncestorListener(new BaseAncestorListener() {

        @Override
        public void ancestorAdded(AncestorEvent event) {
            jsl1.setDividerLocation(getSize().height/3);
        }
    });

    /*
     * Set components and set the divider position as before
     * for the second split pane
     */
    jsl2.setOrientation(JSplitPane.VERTICAL_SPLIT);
    jsl2.setTopComponent(jsr2);
    jsl2.setBottomComponent(jsr3);
    jsl2.addAncestorListener(new BaseAncestorListener() {

        @Override
        public void ancestorAdded(AncestorEvent event) {
            jsl2.setDividerLocation(getSize().height/3);
        }
    });

    setLayout(new BorderLayout());
    add(jsl1, BorderLayout.CENTER);

}

public static class BaseAncestorListener 
    implements AncestorListener {

    @Override
    public void ancestorAdded(AncestorEvent event) {
    }

    @Override
    public void ancestorRemoved(AncestorEvent event) {
    }

    @Override
    public void ancestorMoved(AncestorEvent event) {
    }

}

}

Ответы [ 3 ]

5 голосов
/ 29 марта 2011

Я использовал setResizeWeigth, чтобы сообщить JSplitPanes, как распределить размер.В качестве бонуса, разделенные панели сохраняют равномерное распределение даже при изменении размера окна.Они потеряют равномерное распределение, как только вы измените размер одной из панелей.

Обратите внимание, что вам не обязательно больше нужна AncestorListener.Я использовал его только для распечатки размеров JScrollPanes.

import java.awt.BorderLayout;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JSplitPane;
import javax.swing.JTable;
import javax.swing.event.AncestorEvent;
import javax.swing.event.AncestorListener;

public class TestSplitPanels extends JPanel {

    public static void main(String[] args) {
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        final TestSplitPanels tps = new TestSplitPanels();
        frame.setContentPane(tps);
        frame.pack();
        frame.setVisible(true);
    }

    public TestSplitPanels() {

        JTable jt1 = new JTable();
        JTable jt2 = new JTable();
        JTable jt3 = new JTable();

        final JScrollPane jsr1 = new JScrollPane();
        final JScrollPane jsr2 = new JScrollPane();
        final JScrollPane jsr3 = new JScrollPane();

        jsr1.setViewportView(jt1);
        jsr2.setViewportView(jt2);
        jsr3.setViewportView(jt3);

        JSplitPane jsl1 = new JSplitPane();
        JSplitPane jsl2 = new JSplitPane();

        jsl1.setOrientation(JSplitPane.VERTICAL_SPLIT);
        jsl1.setTopComponent(jsr1);
        jsl1.setBottomComponent(jsl2);
        jsl1.setResizeWeight(0.33); // <-- here

        jsl2.setOrientation(JSplitPane.VERTICAL_SPLIT);
        jsl2.setTopComponent(jsr2);
        jsl2.setBottomComponent(jsr3);
        jsl2.setResizeWeight(0.5); // <-- here

        this.addAncestorListener(new BaseAncestorListener() {
            @Override
            public void ancestorMoved(AncestorEvent event) {
                System.out.println("jsr1 size: " + jsr1.getSize());
                System.out.println("jsr2 size: " + jsr2.getSize());
                System.out.println("jsr3 size: " + jsr3.getSize());
                System.out.println("----");
            }
        });

        setLayout(new BorderLayout());
        add(jsl1, BorderLayout.CENTER);
    }

    public static class BaseAncestorListener implements AncestorListener {

        @Override
        public void ancestorAdded(AncestorEvent event) {
        }

        @Override
        public void ancestorRemoved(AncestorEvent event) {
        }

        @Override
        public void ancestorMoved(AncestorEvent event) {
        }

    }
}
0 голосов
/ 29 марта 2011
jsl2.addAncestorListener(new BaseAncestorListener() {
            @Override
            public void ancestorAdded(AncestorEvent event) {
                SwingUtilities.invokeLater(new Runnable() {
                    public void run() {
                        jsl2.setDividerLocation(getSize().height / 3);                    }
                });
            }
        });
0 голосов
/ 29 марта 2011

Вы можете использовать метод: setDividerLocation в JSplitPaneClass

...