2009-05-12 13 views
43

Mam JTable, która jest w ramach JScrollPane. Wiersze są dodawane do tabeli w czasie wykonywania na podstawie zdarzeń, które występują w mojej aplikacji. Chcę, aby okienko skarbonek przewijało się do dolnej części tabeli po dodaniu nowego wiersza do tabeli.JTable Przewijanie do określonego indeksu wierszy

Dla bibliotek JLists Istnieje [ensureIndexIsVisible][1](), które wymuszają widoczny indeks na liście. Szukam tej samej rzeczy, ale dla JTable. Wygląda na to, że mógłbym ręcznie przesunąć przewijany widok na panelu przewijania, ale pomyślałem, że musi być łatwiejszy sposób.

Odpowiedz

33

Zobacz ten przykład: http://www.exampledepot.com/egs/javax.swing.table/Vis.html

aktualizacji: link jest nieaktualny, oto kod (od 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); 
    } 
+0

Niewłaściwy i zbyt skomplikowany! Można to zrobić w jednym wierszu: – Elmue

+0

table.scrollRectToVisible (table.getCellRect (wiersz, kolumna, prawda)); – Elmue

4

JList wewnętrznie używać scrollRectToVisible i określić współrzędne, aby przewinąć do. Myślę, że będziesz musiał przekodować podobną funkcjonalność dla JTable.

65

To bardzo proste, JTable ma również metodę scrollRectToVisible. Jeśli chcesz, możesz spróbować coś takiego, aby przejść do ScrollPane do dołu, jeśli nowy rekord w brzmieniu:

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

Gdzie i jest ostatni dodany rekord.

+1

Działa to dobrze, zgodnie z oczekiwaniami, i działa tak, jak ensureindexisvisible() (lub jakakolwiek jest ta metoda) z Jlist. Kod oznaczony jako odpowiedź nie działa poprawnie. nie przewinął się do indeksu po wywołaniu 5-6 dłuższej listy i nie wyświetlał całego wiersza za każdym razem, gdy przewijał. niektóre rzędy zostały odcięte. To powinna być odpowiedź. – Bastiat

+1

Prosty i działa. Tylko jedno pytanie, jaki jest cel pierwszej linii? Wygląda na to, że druga linia jest wystarczająca. Btw, musiałem również przewinąć do konkretnej kolumny i działa też dobrze, ustawiając drugi parametr getCellRect. – Smig

+0

... i jaki powinien być sens nowego prostokąta()? getCellRect() zwraca już prostokąt! – Elmue

1

Pierwsza odpowiedź działa dobrze, ale wybrany wiersz zostanie umieszczony u dołu tabeli. Stworzyłem zmodyfikowaną wersję:

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); 
    } 

Teraz wybrany wiersz zostanie umieszczony na górze tabeli.

+0

Nie, nie trzeba przewijać widoku do dowolnego miejsca w tabeli (wszystkie komponenty mają metodę getVisibleRect). – kleopatra

0

Wydaje mi się, że łatwiej jest ustawić położenie rzutni zamiast przewijać tabelę. Oto mój kod.

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

Wydaje się działać świetnie! dostosowane tutaj: http://tinybrain.de/1004329 –

Powiązane problemy