web-dev-qa-db-de.com

JTable Scrollen zu einem angegebenen Zeilenindex

Ich habe eine JTable, die sich innerhalb eines JScrollPane. befindet. Zeilen werden zur Laufzeit zur Tabelle hinzugefügt, basierend auf Ereignissen, die in meiner Anwendung auftreten. Ich möchte, dass das Scoll-Fenster am unteren Rand der Tabelle angezeigt wird, wenn der Tabelle eine neue Zeile hinzugefügt wird.

Für JLists Es gibt die [ensureIndexIsVisible][1](), die das Anzeigen eines bestimmten Index in der Liste erzwingt. Ich suche das gleiche, aber nach einer JTable. Es sieht so aus, als müsste ich die Bildlaufansicht manuell im Bildlauffenster verschieben, aber ich dachte, es müsste einen einfacheren Weg geben.

45
Chris Dail

Sehen Sie sich dieses Beispiel an: http://www.exampledepot.com/egs/javax.swing.table/Vis.html

update: Der Link ist veraltet, hier ist der Code (von http://smi-protege.stanford.edu/repos/protege/protege-core/trunk/src/edu/stanford/smi/protege/util/ ComponentUtilities.Java )

public static void scrollToVisible(JTable table, int rowIndex, int vColIndex) {
        if (!(table.getParent() instanceof JViewport)) {
            return;
        }
        JViewport viewport = (JViewport)table.getParent();

        // This rectangle is relative to the table where the
        // northwest corner of cell (0,0) is always (0,0).
        Rectangle rect = table.getCellRect(rowIndex, vColIndex, true);

        // The location of the viewport relative to the table
        Point pt = viewport.getViewPosition();

        // Translate the cell location so that it is relative
        // to the view, assuming the northwest corner of the
        // view is (0,0)
        rect.setLocation(rect.x-pt.x, rect.y-pt.y);

        table.scrollRectToVisible(rect);

        // Scroll the area into view
        //viewport.scrollRectToVisible(rect);
    }
35
Pierre

Es ist sehr einfach, JTable hat auch die Methode scrollRectToVisible. Wenn Sie möchten, können Sie so etwas versuchen, um die Scrollpane nach unten zu bewegen, wenn ein neuer Datensatz hinzugefügt wird:

jTable1.getSelectionModel().setSelectionInterval(i, i);
jTable1.scrollRectToVisible(new Rectangle(jTable1.getCellRect(i, 0, true)));

Woider zuletzt hinzugefügte Datensatz ist.

69
martinusadyh

JList verwendet intern scrollRectToVisible und gibt die Koordinaten an, zu denen geblättert werden soll. Ich denke, Sie müssen eine ähnliche Funktionalität für JTable umcodieren.

5
Valentin Rocher

Die erste Antwort funktioniert gut, aber die ausgewählte Zeile wird am unteren Rand der Tabelle positioniert. Also habe ich diese modifizierte Version erstellt:

private void scrollToVisible(int rowIndex, int vColIndex ) {
        JTable table = getTablePanel().getTable();
        if (!(table.getParent() instanceof JViewport)) {
            return;
        }
        if (table.getRowCount()<1){
            return;
        }
        JViewport viewport = (JViewport)table.getParent();
        // view dimension
        Dimension dim = viewport.getExtentSize();
        // cell dimension
        Dimension dimOne = new Dimension(0,0);

        // This rectangle is relative to the table where the
        // northwest corner of cell (0,0) is always (0,0).
        Rectangle rect = table.getCellRect(rowIndex, vColIndex, true);
        Rectangle rectOne;
        if (rowIndex+1<table.getRowCount()) {
            if (vColIndex+1<table.getColumnCount())
                vColIndex++;
            rectOne = table.getCellRect(rowIndex+1, vColIndex, true);
            dimOne.width=rectOne.x-rect.x;
            dimOne.height=rectOne.y-rect.y;
        }

        // '+ veiw dimension - cell dimension' to set first selected row on the top

        rect.setLocation(rect.x+dim.width-dimOne.width, rect.y+dim.height-dimOne.height);

        table.scrollRectToVisible(rect);
    }

Jetzt wird die ausgewählte Zeile oben in der Tabelle positioniert.

1
MGaidamak

Es scheint mir viel einfacher, die Position des Ansichtsfensters festzulegen, anstatt die Tabelle zu scrollen. Folgendes ist mein Code.

public void scrollCellToView(int rowIndex, int vColIndex) {
    if (!(this.getParent() instanceof JViewport)) {
        return;
    }
    JViewport viewport = (JViewport) this.getParent();
    Rectangle rect = this.getCellRect(rowIndex, vColIndex, true);
    Rectangle viewRect = viewport.getViewRect();

    int x = viewRect.x;
    int y = viewRect.y;

    if (rect.x >= viewRect.x && rect.x <= (viewRect.x + viewRect.width - rect.width)){

    } else if (rect.x < viewRect.x){
        x = rect.x;
    } else if (rect.x > (viewRect.x + viewRect.width - rect.width)) {
        x = rect.x - viewRect.width + rect.width;
    }

    if (rect.y >= viewRect.y && rect.y <= (viewRect.y + viewRect.height - rect.height)){

    } else if (rect.y < viewRect.y){
        y = rect.y;
    } else if (rect.y > (viewRect.y + viewRect.height - rect.height)){
        y = rect.y - viewRect.height + rect.height;
    }

    viewport.setViewPosition(new Point(x,y));
}
0
user3015208