2

JTable 有一个方法 getVisibleRowCount(),它显示要显示的首选行数。

我想确定 JTable 中当前可见的实际行数。我怎样才能做到这一点?

我目前的尝试是:

int rowsVisible = table.getSize().getHeight()/table.getRowHeight();

但它给我的价值比我看到的要高得多。

例如,当有 10 或 11 行可见时,这给了我 18 的结果。

4

5 回答 5

10

Ask the table, it's doing all the hard work for you:

Rectangle vr = table.getVisibleRect ();
int first = table.rowAtPoint(vr.getLocation());
vr.translate(0, vr.height);
int visibleRows = table.rowAtPoint(vr.getLocation()) - first;
于 2012-08-10T10:39:29.620 回答
1

这些尝试中没有一个是正确的。只是因为它不关心向下滚动... :-/

我根据我能找到的正确答案编写了代码,这些答案已经过尝试并且是正确的(我希望如此)。

但我只为第 0 列尝试过...

public static int getNumberOfVisibleRows(JTable table) {
    Rectangle vr = table.getVisibleRect();
    int first = table.rowAtPoint(vr.getLocation());
    vr.translate(0, vr.height);
    return table.rowAtPoint(vr.getLocation()) - first;
}

public static void scrollToVisible(JTable table, int rowIndex, int columnIndex, int numberOfVisibleRows) {
    Rectangle visibleRect = table.getVisibleRect();
    Rectangle rect1 = table.getCellRect(rowIndex, columnIndex, false);
    if (visibleRect.y > rect1.y) {
        table.scrollRectToVisible(rect1);
    } else {
        Rectangle rect2 = table.getCellRect(rowIndex + numberOfVisibleRows, columnIndex, false);
        int width = rect2.y - rect1.y;
        table.scrollRectToVisible(new Rectangle(rect1.x, rect1.y, rect1.width, rect1.height + width));
    }
}
于 2013-11-27T15:51:20.510 回答
1

我没有对此进行测试,但我希望当 aJTable包含在 a 中时JScrollPane,您可以使用 向滚动窗格询问其视口getViewPort,并从视口中检索大小。

如果将该高度除以表格的行高,您可能会得到更好的估计

final int pageSize = 
    (int) (table.getParent().getSize().getHeight() / table.getRowHeight());

非常接近

于 2012-08-09T16:25:27.573 回答
0

Robin提供的方式并不完全正确 - 当表格具有不同的行高时,它将不起作用。它也不会检查行间距和其他一些细微差别。

以下是适用于任何 L&F 和表格设置的示例:

public static void main ( String args[] )
{
    final JLabel rows = new JLabel ( "Visible rows: ?", JLabel.CENTER );

    final JTable table = new JTable ( new DefaultTableModel ( 30, 3 )
    {
        public String getColumnName ( int column )
        {
            return "title";
        }

        public Object getValueAt ( int row, int column )
        {
            return "cell";
        }
    } );

    JScrollPane scroll = new JScrollPane ( table )
    {
        public Dimension getPreferredSize ()
        {
            Dimension ps = super.getPreferredSize ();
            ps.height = 150;
            return ps;
        }
    };
    scroll.addComponentListener ( new ComponentAdapter ()
    {
        public void componentResized ( ComponentEvent e )
        {
            Rectangle vr = table.getVisibleRect ();
            int visibleRows = 0;
            for ( int i = 0; i < table.getRowCount (); i++ )
            {
                Rectangle cell = table.getCellRect ( i, 0, false );
                if ( cell.y <= vr.y && cell.y + cell.height >= vr.y ||
                        cell.y <= vr.y + vr.height &&
                                cell.y + cell.height >= vr.y + vr.height ||
                        cell.y >= vr.y && cell.y + cell.height <= vr.y + vr.height )
                {
                    visibleRows++;
                }
            }
            rows.setText ( "Visible rows: " + visibleRows );
        }
    } );

    JPanel panel = new JPanel ( new BorderLayout ( 25, 25 ) );
    panel.setBorder ( BorderFactory.createEmptyBorder ( 25, 25, 25, 25 ) );
    panel.add ( rows, BorderLayout.NORTH );
    panel.add ( scroll, BorderLayout.CENTER );

    JFrame frame = new JFrame ();
    frame.add ( panel );
    frame.setDefaultCloseOperation ( JFrame.EXIT_ON_CLOSE );
    frame.pack ();
    frame.setLocationRelativeTo ( null );
    frame.setVisible ( true );
}

只需尝试调整表格大小即可查看效果。

您还可以修改“单元格可见”条件以排除(作为示例)可见少于 5 个像素(或其高度的一半)的行。

于 2012-08-10T10:22:23.257 回答
-4

尝试:

table.getModel().getRowCount();
于 2012-08-09T16:20:41.637 回答