为JPanel设置灵活的大小

时间:2013-11-05 21:26:20

标签: java swing

我的ContentPane包含多个JPanels,其中包含JTabbedPanes和其他内容。当用户缩小或扩展窗口时,如何使这些JPanel更改其大小。有没有办法设置百分比大小?

JPanel panelOne = new JPanel;
panelOne.setSize( // % of );

2 个答案:

答案 0 :(得分:3)

您可以在ContentPanes上使用各种布局方法。对于基于相对于画布的大小进行缩放的内容,您可以尝试使用SpringLayout并定义与内容窗格本身相关的边框。其他元素可以约束到该锚定元素或内容窗格。

您可以使用约束来基于ContentPane或其他元素拉伸面板。

您可以使用WindowBuilder为Eclipse可视化地规划SpringLayout(以及其他可能的布局,例如Mig,Grid等)。根据您的布局的大小和比例,您可能会发现其他布局更符合您的要求或偏好。

答案 1 :(得分:3)

使用适当的布局管理器,这就是它们的用途。他们负责监视监视父容器更改所涉及的所有脏工作,并根据更改计算所需的设置。

查看Laying Out Components Within a Container

animated gif

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.GridBagLayout;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTabbedPane;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.border.CompoundBorder;
import javax.swing.border.EmptyBorder;
import javax.swing.border.LineBorder;

public class TestSizableComponents {

    public static void main(String[] args) {
        new TestSizableComponents();
    }

    public TestSizableComponents() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                }

                JTabbedPane tabbedPane = new JTabbedPane();
                for (int index = 0; index < 10; index++) {
                    tabbedPane.add(Integer.toString(index), new TabPane(Integer.toString(index)));
                }

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLayout(new BorderLayout());
                frame.add(new HeaderPane(), BorderLayout.NORTH);
                frame.add(tabbedPane);
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class HeaderPane extends JPanel {

        public HeaderPane() {

            setLayout(new GridBagLayout());
            add(new JLabel("Look ma, no hands"));
            setBorder(new CompoundBorder(new LineBorder(Color.RED), new EmptyBorder(10, 10, 10, 10)));

        }

        @Override
        public Dimension getPreferredSize() {
            return new Dimension(200, 100);
        }

    }

    public class TabPane extends JPanel {

        public TabPane(String name) {

            setLayout(new GridBagLayout());
            add(new JLabel(name));
            setBorder(new EmptyBorder(10, 10, 10, 10));

        }

        @Override
        public Dimension getPreferredSize() {
            return new Dimension(200, 200);
        }

    }

}