2011-08-13 25 views
8

Duplicar posible:
JTable Scrolling to a specified row indexScroll un JScrollPane a una fila específica en un JTable

Tengo un JTable y programación que seleccionar una fila mediante el uso de este código:

myTable.setRowSelectionInterval(i, j); 

(donde i y j son números de fila y columna válidos, respectivamente).

El problema es que cuando se salta a una fila, el JScrollPane no se mueve. En este caso, la tabla es bastante larga y, a menudo, la "fila seleccionada" no está visible en la pantalla, por lo que el usuario tiene que seguir desplazándose hacia arriba o hacia abajo manualmente para encontrarla. Me gustaría saber cómo puedo hacer que JScrollPane salte automáticamente a la ubicación específica de la fila.

Editar: Se encuentra presente un trazador de líneas que puede hacerlo:

table.scrollRectToVisible(table.getCellRect(row,0, true)); 
+0

que no funciona como esperaba, póngalo al código que publiqué, tiene que mover con JViewPort correctamente – mKorbel

Respuesta

6

simplemente se extiende mensaje por @eng .Fad +1, no funciona como esperaba (con la ayuda de StanislavL de otro foro Java Swing)

import java.awt.*; 
import javax.swing.*; 
import javax.swing.event.*; 
import javax.swing.table.DefaultTableModel; 

public class TableSelectionGood implements ListSelectionListener { 

    private JTable[] tables; 
    private boolean ignore = false; 

    public TableSelectionGood() { 
     Object[][] data1 = new Object[100][5]; 
     Object[][] data2 = new Object[50][5]; 
     Object[][] data3 = new Object[50][5]; 
     for (int i = 0; i < data1.length; i++) { 
      data1[i][0] = "Company # " + (i + 1); 
      for (int j = 1; j < data1[i].length; j++) { 
       data1[i][j] = "" + (i + 1) + ", " + j; 
      } 
     } 
     for (int i = 0; i < data2.length; i++) { 
      data2[i][0] = "Company # " + ((i * 2) + 1); 
      for (int j = 1; j < data2[i].length; j++) { 
       data2[i][j] = "" + ((i * 2) + 1) + ", " + j; 
      } 
     } 
     for (int i = 0; i < data3.length; i++) { 
      data3[i][0] = "Company # " + (i * 2); 
      for (int j = 1; j < data3[i].length; j++) { 
       data3[i][j] = "" + (i * 2) + ", " + j; 
      } 
     } 
     String[] headers = {"Col 1", "Col 2", "Col 3", "Col 4", "Col 5"}; 
     DefaultTableModel model1 = new DefaultTableModel(data1, headers); 
     DefaultTableModel model2 = new DefaultTableModel(data2, headers); 
     DefaultTableModel model3 = new DefaultTableModel(data3, headers); 
     final JTable jTable1 = new JTable(model1); 
     jTable1.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); 
     final JScrollPane sp1 = new JScrollPane(); 
     sp1.setPreferredSize(new Dimension(600, 200)); 
     sp1.setViewportView(jTable1); 
     final JTable jTable2 = new JTable(model2); 
     jTable2.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); 
     final JScrollPane sp2 = new JScrollPane(); 
     sp2.setPreferredSize(new Dimension(600, 200)); 
     sp2.setViewportView(jTable2); 
     final JTable jTable3 = new JTable(model3); 
     jTable3.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); 
     final JScrollPane sp3 = new JScrollPane(); 
     sp3.setPreferredSize(new Dimension(600, 200)); 
     sp3.setViewportView(jTable3); 
     TableSelectionGood tableSelection = new TableSelectionGood(jTable1, jTable2, jTable3); 
     JPanel panel1 = new JPanel(); 
     panel1.setLayout(new GridLayout(3, 0, 10, 10)); 
     panel1.add(sp1); 
     panel1.add(sp2); 
     panel1.add(sp3); 
     JFrame frame = new JFrame("tableSelection"); 
     frame.add(panel1); 
     frame.pack(); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setVisible(true); 
    } 

    public TableSelectionGood(JTable... tables) { 
     for (JTable table : tables) { 
      table.getSelectionModel().addListSelectionListener(this); 
     } 
     this.tables = tables; 
    } 

    private JTable getTable(Object model) { 
     for (JTable table : tables) { 
      if (table.getSelectionModel() == model) { 
       return table; 
      } 
     } 
     return null; 
    } 

    private void changeSelection(JTable table, String rowKey) { 
     int col = table.convertColumnIndexToView(0); 
     for (int row = table.getRowCount(); --row >= 0;) { 
      if (rowKey.equals(table.getValueAt(row, col))) { 
       table.changeSelection(row, col, false, false); 
       return; 
      } 
     } 
     table.clearSelection(); 
    } 

    @Override 
    public void valueChanged(ListSelectionEvent e) { 
     if (e.getValueIsAdjusting() || ignore) { 
      return; 
     } 
     ignore = true; 
     try { 
      JTable table = getTable(e.getSource()); 
      int row = table.getSelectedRow(); 
      String rowKey = table.getValueAt(row, table.convertColumnIndexToView(0)).toString(); 
      for (JTable t : tables) { 
       if (t == table) { 
        continue; 
       } 
       changeSelection(t, rowKey); 
       JViewport viewport = (JViewport) t.getParent(); 
       Rectangle rect = t.getCellRect(t.getSelectedRow(), 0, true); 
       Rectangle r2 = viewport.getVisibleRect(); 
       t.scrollRectToVisible(new Rectangle(rect.x, rect.y, (int) r2.getWidth(), (int) r2.getHeight())); 
       System.out.println(new Rectangle(viewport.getExtentSize()).contains(rect)); 
      } 
     } finally { 
      ignore = false; 
     } 
    } 

    public static void main(String[] args) { 
     TableSelectionGood tableSelection = new TableSelectionGood(); 
    } 
} 
6

he utilizado esto en mi viejo proyecto:

public static void scrollToVisible(JTable table, int rowIndex, int vColIndex) 
{ 
    if (!(table.getParent() instanceof JViewport)) return; 
    JViewport viewport = (JViewport)table.getParent(); 
    Rectangle rect = table.getCellRect(rowIndex, vColIndex, true); 
    Point pt = viewport.getViewPosition(); 
    rect.setLocation(rect.x-pt.x, rect.y-pt.y); 
    viewport.scrollRectToVisible(rect); 
} 

Referencia: http://www.exampledepot.com/egs/javax.swing.table/Vis.html

+0

Copia exacta de [JTable Scrolling a un índice de fila especificado] (http://stackoverflow.com/ preguntas/853020/jtable-scrolling-a-specific-row-index) 's respuesta. – Jeffrey

+0

@Jeffrey Gracias Jeffery por el enlace. Usé este código en el pasado y no recuerdo dónde lo obtuve desde –

+5

. Después de usar este código por un tiempo, me pareció un poco problemático con las tablas largas. Me encontré con un agradable un trazador de líneas aunque: \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t table.scrollRectToVisible (table.getCellRect (fila, 0, true)); – David

Cuestiones relacionadas