You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何布局JTable实现SQL数据按训练项单独展示?

训练项独立展示的JTable布局解决方案

一、多JTable方案完全可行,解决滚动面板显示问题

你想给每个训练项单独创建JTable是完全没问题的,之前把多个JTable直接丢进JScrollPane没显示第二个,核心原因是JScrollPane默认只承载一个视图组件。正确的做法是先把所有训练项的JLabel+JTable组合放进一个垂直布局的容器,再把这个容器塞进JScrollPane。

具体步骤:

  • 新建一个JPanel,设置BoxLayout垂直排列(或者用GridLayout按需调整)
  • 遍历每个训练项:
    1. 创建JLabel标注训练项名称+部位,用加粗字体突出标题
    2. 用该训练项的SQL查询结果构建TableModel,生成对应JTable
    3. 给单个JTable套一个小JScrollPane(避免单表格内容过长撑满界面),和JLabel一起加到外层JPanel
  • 最后把外层JPanel放进全局JScrollPane,再添加到窗口主面板

代码片段参考:

// 外层容器,垂直排列所有训练项组件
JPanel contentPanel = new JPanel();
contentPanel.setLayout(new BoxLayout(contentPanel, BoxLayout.Y_AXIS));

// 循环处理每个训练项(这里假设trainingItems是你的训练项列表)
for (TrainingItem item : trainingItems) {
    // 添加训练项标题
    JLabel titleLabel = new JLabel(item.getName() + " - " + item.getBodyPart());
    titleLabel.setFont(new Font("微软雅黑", Font.BOLD, 16));
    contentPanel.add(titleLabel);
    
    // 构建该训练项的表格模型(这里替换成你的SQL查询逻辑)
    DefaultTableModel model = new DefaultTableModel(getColumns(item), getDataFromSQL(item.getId()));
    JTable table = new JTable(model);
    
    // 给单个表格加滚动条,固定高度避免界面混乱
    JScrollPane tableScroll = new JScrollPane(table);
    tableScroll.setPreferredSize(new Dimension(800, 220));
    contentPanel.add(tableScroll);
    
    // 加个垂直间隔,让训练项之间更清爽
    contentPanel.add(Box.createVerticalStrut(18));
}

// 全局滚动容器,包裹所有内容
JScrollPane outerScroll = new JScrollPane(contentPanel);
yourMainPanel.add(outerScroll);

二、无需多JTable的轻量化替代方案

如果不想创建大量JTable,推荐这两个更优的思路:

1. 单JTable+分组行渲染

用一个JTable承载所有数据,把训练项名称+部位作为分组标题行,通过自定义TableCellRenderer区分样式:

  • 给TableModel加一个隐藏列,标记该行是标题行还是数据行
  • 渲染时,标题行用加粗背景、居中对齐,数据行用普通样式
  • 调整行高让分组更醒目,适合数据量不大的场景

2. 折叠/标签页组件

  • JTabbedPane:每个训练项对应一个标签页,标签上显示名称+部位,切换标签展示对应表格,适合训练项不多的情况
  • 折叠面板(如SwingX的JAccordion):每个训练项是可折叠的面板,点击展开显示表格,收起隐藏,适合需要紧凑布局的场景
  • JTree+JTable组合:训练项作为JTree节点,点击节点后在右侧展示对应表格,适合训练项数量多的场景

三、点击按钮生成对应表格的实现逻辑

要实现“点击按钮生成对应JTable”的需求,只需给按钮绑定点击事件,动态添加组件后刷新界面:

JButton chestBtn = new JButton("胸部训练");
chestBtn.addActionListener(e -> {
    // 查询胸部训练的SQL数据,构建表格模型
    DefaultTableModel chestModel = getTrainingModelByPart("胸部");
    JTable chestTable = new JTable(chestModel);
    
    // 创建标题Label
    JLabel chestLabel = new JLabel("胸部训练 - 胸大肌/胸小肌");
    chestLabel.setFont(new Font("微软雅黑", Font.BOLD, 16));
    
    // 添加到外层容器
    contentPanel.add(chestLabel);
    contentPanel.add(new JScrollPane(chestTable));
    contentPanel.add(Box.createVerticalStrut(18));
    
    // 刷新界面,让新组件显示
    contentPanel.revalidate();
    contentPanel.repaint();
});

内容的提问来源于stack exchange,提问作者mrjbcam

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 21:30:52