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

public class M1 {
    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> {
            // 1. 创建主窗口
            JFrame frame = new JFrame("上-下(下分左右)布局+滚动示例");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.setSize(600, 500);

            // 2. 外层容器:实现“上-下”结构(用BorderLayout)
            JPanel outerPanel = new JPanel(new BorderLayout(8, 8)); // 区域间距8像素

            // -------------------- 上部分区域 --------------------
            JPanel topPanel = new JPanel();
            topPanel.add(new JLabel("上部分区域 - 标题/筛选栏"));
            topPanel.setPreferredSize(new Dimension(580, 120)); // 固定高度(触发垂直超限)
            topPanel.setBackground(Color.LIGHT_GRAY);
            outerPanel.add(topPanel, BorderLayout.NORTH);

            // -------------------- 下部分容器(分左右) --------------------
            JPanel bottomContainer = new JPanel(new BorderLayout(8, 8)); // 下部分的左右分栏容器

            // 下左区域:多内容组件(触发滚动)
            JPanel bottomLeft = new JPanel();
            bottomLeft.setLayout(new BoxLayout(bottomLeft, BoxLayout.Y_AXIS)); // 垂直排列
            
            for (int i = 1; i <= 25; i++) {
                bottomLeft.add(new JLabel("下左列表项 " + i));
                bottomLeft.add(Box.createVerticalStrut(5)); // 间距
            }
            bottomLeft.setPreferredSize(new Dimension(300, 400)); // 固定宽度
            bottomLeft.setBackground(Color.yellow);
            bottomContainer.add(bottomLeft, BorderLayout.WEST);

            // 下右区域:多按钮组件(触发滚动)
            JPanel bottomRight = new JPanel();
            bottomRight.setLayout(new BoxLayout(bottomRight, BoxLayout.Y_AXIS)); // 垂直排列
            for (int i = 1; i <= 25; i++) {
                bottomRight.add(new JButton("下右操作按钮 " + i));
                bottomRight.add(Box.createVerticalStrut(5)); // 间距
            }
            bottomRight.setPreferredSize(new Dimension(300, 400)); // 固定宽度
            bottomContainer.add(bottomRight, BorderLayout.EAST);

            // 将下部分容器加入外层的“下”区域(BorderLayout.CENTER)
            outerPanel.add(bottomContainer, BorderLayout.CENTER);
            bottomRight.setBackground(Color.RED);
            // 3. 无参JScrollPane绑定外层容器(关键:必须设置视口内容)
            JScrollPane scrollPane = new JScrollPane();
            scrollPane.setViewportView(outerPanel); // 整体布局容器作为滚动面板的内容

            // 4. 配置滚动条策略(按需显示垂直/水平滚动条)
            scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);
            scrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);

            // 5. 将滚动面板添加到主窗口
            frame.add(scrollPane, BorderLayout.CENTER);

            // 显示窗口
            frame.setLocationRelativeTo(null);
            frame.setVisible(true);
        });
    }
}

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐