ロビンが提供した方法は完全には正しくありません。テーブルの行の高さが異なる場合は機能しません。また、行の間隔やその他の小さなニュアンスもチェックしません。
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ピクセル(または高さの半分)未満の行を(例として)除外することもできます。