在Java中使用BorderLayout自动调整大小

时间:2017-11-20 20:21:56

标签: java jframe resize netbeans-8 border-layout

这是我的带有BorderLayout的jFrame表单,其中按钮将放置在导航栏面板中,jDesktopPane将放置在内容面板中。带有CardLayout的DesktopPane将显示不同大小的jPanel表单。我希望内容面板(包括整个表单)根据显示的jPanel表单的不同大小调整大小。是否有可能做到这一点?如果没有,那么我已经尝试使用代码调整面板甚至整个表单的大小,但它不起作用。

System Design

我尝试使用这几个代码,但它不起作用。

Main_Menu form = new Main_Menu();
form.pack();
form.setSize(900, 548);
form.setPreferredSize(new Dimension(900, 548));
form.validate();

2 个答案:

答案 0 :(得分:1)

所以,基于可用的有限信息,我写了一个快速测试,似乎工作得很好

import java.awt.BorderLayout;
import java.awt.CardLayout;
import java.awt.Color;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JDesktopPane;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import javax.swing.border.EmptyBorder;

public class Test {

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

    public Test() {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                JFrame frame = new JFrame();

                CardLayout layout = new CardLayout();
                JDesktopPane pane = new JDesktopPane();
                Navigator navigator = new Navigator(pane, layout);
                pane.setLayout(layout);
                pane.setBackground(Color.GREEN);

                frame.add(new TopPane(), BorderLayout.NORTH);
                frame.add(new NavigationPane(navigator), BorderLayout.WEST);


                for (int index = 0; index < 5; index++) {
                    pane.add(new ContentPane(index), Integer.toString(index));
                }

                JLabel initial = new JLabel("All your content belong to us");
                initial.setBorder(new EmptyBorder(20, 20, 20, 20));
                pane.add(initial, "initial");

                layout.show(pane, "initial");

                frame.add(pane);
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class Navigator {
        private JComponent parent;
        private CardLayout layout;

        public Navigator(JComponent parent, CardLayout layout) {
            this.parent = parent;
            this.layout = layout;
        }

        public void show(String name) {
            layout.show(parent, name);
        }
    }

    public class TopPane extends JPanel {

        public TopPane() {
            setLayout(new GridBagLayout());
            setBorder(new EmptyBorder(20, 20, 20, 20));
            setBackground(Color.BLUE);
            JLabel title = new JLabel("Top Panel");
            title.setForeground(Color.WHITE);
            add(title);
        }

    }

    public class NavigationPane extends JPanel {

        private Navigator navigator;

        public NavigationPane(Navigator navigator) {
            setLayout(new GridBagLayout());
            setBorder(new EmptyBorder(20, 20, 20, 20));
            setBackground(Color.ORANGE);

            GridBagConstraints gbc = new GridBagConstraints();
            gbc.gridwidth = GridBagConstraints.REMAINDER;
            gbc.fill = GridBagConstraints.BOTH;
            for (int index = 0; index < 5; index++) {
                JButton btn = new JButton("Test " + index);
                btn.setActionCommand(Integer.toString(index));
                add(btn, gbc);

                btn.addActionListener(new ActionListener() {
                    @Override
                    public void actionPerformed(ActionEvent e) {
                        String name = e.getActionCommand();
                        navigator.show(name);
                    }
                });
            }
        }
    }

    public class ContentPane extends JPanel {
        public ContentPane(int value) {
            setLayout(new GridBagLayout());
            setBorder(new EmptyBorder(20, 20, 20, 20));
            setBackground(Color.MAGENTA);
            add(new JLabel("Hello from " + Integer.toString(value)));
        }
    }
}

避免setPreferred/Minimum/MaximumSize,您要覆盖组件和布局管理器为提供动态调整提示而执行的工作

如果这无法解决您的问题,请考虑提供Minimal, Complete, and Verifiable example

答案 1 :(得分:-1)

尝试使用pack();而不是form.pack();。或setLayout或使用CardLayout