如何创建一个JTable,其中第一列始终位于JScrollPane视口中?

voo*_*ant 9 java swing jtable jscrollpane

在JScrollPane中设置表的最佳方法是什么,使得第一列始终在屏幕上的相同位置,而不管水平滚动和重叠在下面的列?

当滚动条位于最左侧时,列看起来正常,但是当用户向右滚动时,辅助列(2和on)在第一列下方移动,直到最后一列出现在视口的最右侧?

我从Eckstein的"Java Swing"一书中找到了一个样本,但它不允许调整第一列的大小.我在想一些方案,其中一个JPanel持有一个水平结构,一个表保存辅助列,另一个JPanel浮动在它们上面(无论滚动如何都是固定的).该结构将保持视口范围不变,因为第一列浮动.理想情况下,我可以使用相同的模型使用两个表,但我不确定整个想法是否是一个天真的解决方案.

理想情况下,我喜欢一种设置,其中多个表垂直位于同一个滚动窗格上,其中所有第一列都对齐并一起移动,各个表之间只有很小的水平间隙.

cam*_*ckr 12

固定列表可以满足您的大部分需求.

它不支持调整固定列的大小,因此您需要添加以下代码:

MouseAdapter ma = new MouseAdapter()
{
    TableColumn column;
    int columnWidth;
    int pressedX;

    public void mousePressed(MouseEvent e)
    {
        JTableHeader header = (JTableHeader)e.getComponent();
        TableColumnModel tcm = header.getColumnModel();
        int columnIndex = tcm.getColumnIndexAtX( e.getX() );
        Cursor cursor = header.getCursor();

        if (columnIndex == tcm.getColumnCount() - 1
        &&  cursor == Cursor.getPredefinedCursor(Cursor.E_RESIZE_CURSOR))
        {
            column = tcm.getColumn( columnIndex );
            columnWidth = column.getWidth();
            pressedX = e.getX();
            header.addMouseMotionListener( this );
        }
    }

    public void mouseReleased(MouseEvent e)
    {
        JTableHeader header = (JTableHeader)e.getComponent();
        header.removeMouseMotionListener( this );
    }

    public void mouseDragged(MouseEvent e)
    {
        int width = columnWidth - pressedX + e.getX();
        column.setPreferredWidth( width );
        JTableHeader header = (JTableHeader)e.getComponent();
        JTable table = header.getTable();
        table.setPreferredScrollableViewportSize(table.getPreferredSize());
        JScrollPane scrollPane = (JScrollPane)table.getParent().getParent();
        scrollPane.revalidate();
    }
};

JTable fixed = fixedColumnTable.getFixedTable();
fixed.getTableHeader().addMouseListener( ma );
Run Code Online (Sandbox Code Playgroud)


小智 5

JScrollPane有一个专门用于此的区域,行标题(参见API中的图表:)

您需要做的就是: - 为此固定区域创建额外的JTable - 将其连接到数据模型的第一列 - 将其设置为行标题 - 并在主表中省略或删除第一列数据.

当滚动窗格上下滚动时,两个表将同步滚动而不添加任何代码.当滚动窗格水平滚动时,行标题始终保持可见,只有主表滚动.

对于大多数情况,您需要的唯一添加的代码是列调整大小,如camickr的示例.