JTable 有一个方法 getVisibleRowCount(),它显示要显示的首选行数。
我想确定 JTable 中当前可见的实际行数。我怎样才能做到这一点?
我目前的尝试是:
int rowsVisible = table.getSize().getHeight()/table.getRowHeight();
但它给我的价值比我看到的要高得多。
例如,当有 10 或 11 行可见时,这给了我 18 的结果。
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;
这些尝试中没有一个是正确的。只是因为它不关心向下滚动... :-/
我根据我能找到的正确答案编写了代码,这些答案已经过尝试并且是正确的(我希望如此)。
但我只为第 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));
}
}
我没有对此进行测试,但我希望当 aJTable
包含在 a 中时JScrollPane
,您可以使用 向滚动窗格询问其视口getViewPort
,并从视口中检索大小。
如果将该高度除以表格的行高,您可能会得到更好的估计
final int pageSize =
(int) (table.getParent().getSize().getHeight() / table.getRowHeight());
非常接近
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 个像素(或其高度的一半)的行。
尝试:
table.getModel().getRowCount();