JTable有一个方法getVisibleRowCount(),它显示要显示的首选行数。
我想确定当前在JTable中可见的实际行数。我怎么能这样做?
我目前的尝试是:
int rowsVisible = table.getSize().getHeight()/table.getRowHeight();
但它给我的价值远高于我能看到的价值。
例如,当有10行或11行可见时,这给我的结果为18。
答案 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();