JTable当前显示的行数是多少?

时间:2012-08-09 16:16:53

标签: java swing jtable

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

我想确定当前在JTable中可见的实际行数。我怎么能这样做?

我目前的尝试是:

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

但它给我的价值远高于我能看到的价值。

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

5 个答案:

答案 0 :(得分:9)

问问桌子,它正在为你做一切艰苦的工作:

Rectangle vr = table.getVisibleRect ();
int first = table.rowAtPoint(vr.getLocation());
vr.translate(0, vr.height);
int visibleRows = table.rowAtPoint(vr.getLocation()) - first;

答案 1 :(得分:1)

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

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

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

非常接近

答案 2 :(得分: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));
    }
}

答案 3 :(得分: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 );
}

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

此外,您可以修改“is cell visible”条件以排除(例如)可见的小于5像素(或其高度的一半)的行。

答案 4 :(得分:-4)

尝试:

table.getModel().getRowCount();