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

如何让两个横向排列的JTable共享视图并保持视图对齐?

解决两个JTable视图同步的方案

这个需求我之前也遇到过,核心就是要让两个横向排列的JTable保持垂直视图完全对齐,结合你已经实现的共享行选择模型,咱们可以通过以下步骤搞定:

1. 确认共享选择模型(你已经做了,再核对下)

首先确保两个表格共用同一个行选择模型,这样选中行的状态会完全同步:

// 让左侧表格使用右侧表格的选择模型
leftTable.setSelectionModel(rightTable.getSelectionModel());

2. 同步垂直视图滚动

因为只有右侧表格在带垂直滚动条的JScrollPane里,我们需要监听右侧滚动视图的位置变化,然后同步左侧表格的视图位置:

关键实现步骤:

  • 把左侧表格放入一个JViewport中(不需要额外的滚动条,只用来控制视图滚动),这样才能让左侧表格的视图跟随右侧滚动:
// 为左侧表格创建Viewport,用于控制视图滚动
JViewport leftViewport = new JViewport();
leftViewport.setView(leftTable);

// 把左侧Viewport和右侧ScrollPane加入同一个容器(比如JPanel)实现横向排列
JPanel container = new JPanel(new BorderLayout());
container.add(leftViewport, BorderLayout.WEST);
container.add(rightScrollPane, BorderLayout.EAST);
  • 监听右侧JScrollPane的JViewport位置变化,同步左侧视图:
JViewport rightViewport = rightScrollPane.getViewport();
rightViewport.addChangeListener(e -> {
    // 获取右侧视图的垂直偏移量
    Point rightViewPos = rightViewport.getViewPosition();
    // 同步左侧视图的垂直位置,x轴保持0(左侧表格不需要水平滚动)
    leftTable.scrollRectToVisible(new Rectangle(0, rightViewPos.y, 1, leftTable.getRowHeight()));
});

3. 处理选中行的视图同步

当用户选中某一行时,如果该行不在当前视图范围内,需要自动滚动到该行,确保两个表格都能看到选中行:

leftTable.getSelectionModel().addListSelectionListener(e -> {
    if (!e.getValueIsAdjusting()) { // 避免多次触发
        int selectedRow = leftTable.getSelectedRow();
        if (selectedRow != -1) {
            // 让右侧表格滚动到选中行
            rightTable.scrollRectToVisible(rightTable.getCellRect(selectedRow, 0, true));
            // 同步左侧表格的视图到选中行
            leftTable.scrollRectToVisible(leftTable.getCellRect(selectedRow, 0, true));
        }
    }
});

4. 注意细节

  • 确保行高一致:如果两个表格的行高不同,视图同步会出现错位,所以要统一行高:
leftTable.setRowHeight(rightTable.getRowHeight());
// 或者直接设置固定行高
leftTable.setRowHeight(25);
rightTable.setRowHeight(25);
  • 数据更新时同步视图:如果表格数据动态更新,建议在数据模型变更后手动触发一次视图同步,比如调用leftTable.scrollRectToVisible(rightTable.getVisibleRect())。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 11:59:49