2

JTableにはgetVisibleRowCount()メソッドがあり、表示する行の優先数を示します。

JTableに現在表示されている実際の行数を確認したいと思います。これどうやってするの?

私の現在の試みは次のとおりです。

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

しかし、それが私に与える価値は、私が見ることができるものよりもかなり高いです。

たとえば、10行または11行が表示されている場合、結果は18になります。

4

5 に答える 5

10

テーブルに聞いてください、それはあなたのためにすべての大変な仕事をしています:

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

これはテストしていませんが、がにJTable含まれているJScrollPane場合は、を使用してスクロールペインにビューポートを要求し、ビューgetViewPortポートからサイズを取得できると思います。

その高さをテーブルの行の高さで割ると、より適切な見積もりが得られる可能性があります

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

かなり近いです

于 2012-08-09T16:25:27.573 に答える
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 に答える
0

ロビンが提供した方法は完全には正しくありません。テーブルの行の高さが異なる場合は機能しません。また、行の間隔やその他の小さなニュアンスもチェックしません。

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 に答える