我怎样才能像附加的 gif 那样制作布局?

How can i make a layout like the attached gif?

我的问题是关于 Java Swing 中的布局。

我想制作如下所示的屏幕。我在 youtube 上看到了这个视频,并制作了我想要的部分的 gif。

我想要 2 个面板和一个这样的按钮:

当我单击按钮时,JPanel 将被隐藏并且 JTable 的宽度将是 100%,就像这样 html/css; (当再次点击按钮时,将显示 JPanel 等。)

我该怎么做?我应该使用哪种布局?

有不止一种方法可以做到这一点,但这里有一个使用 BorderLayout 作为主要布局的示例,并将按钮左对齐 FlowLayout:

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingConstants;
import javax.swing.SwingUtilities;

public class LayoutDemo {
    private LayoutDemo() {
        JFrame frame = new JFrame("Demo");
        frame.setLocationByPlatform(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JPanel buttonHolder = new JPanel(new FlowLayout(FlowLayout.LEADING));
        frame.add(buttonHolder, BorderLayout.NORTH);
        JButton button = new JButton("Toggle visibility");
        buttonHolder.add(button);

        final JPanel left = new JPanel();
        left.setPreferredSize(new Dimension(100, 200));
        left.setBackground(Color.BLUE);
        frame.add(left, BorderLayout.LINE_START);

        JLabel table = new JLabel("This pretends to be a table", SwingConstants.CENTER);
        table.setPreferredSize(new Dimension(400, 200));
        frame.add(table);

        button.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                left.setVisible(!left.isVisible());
            }
        });

        frame.pack();
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                new LayoutDemo();
            }
        });
    }
}

我使用 setPreferredSize() 给组件一些合理的默认大小,但通常它应该由布局管理器根据子组件的大小自动计算,或者在自定义组件的情况下,你应该覆盖 getPreferredSize() return 适合组件的内容。

结果如下: