2011-05-10 69 views
1

我有一个包含3个JScrollPanes(各包含一个JTable)添加有BoxLayout的一个JPanel,所以我看到在第3个表和我动态加载数据,代码逻辑为3个表和仅几乎相同对于每个表我想有自动滚动到表的底部时,新的行添加到表中的列名和一些细胞呈现不同的是,前2代表工作完善和滚动进入表底,但最后这个表的滚动条做奇怪的事情!我对3张桌子使用完全相同的滚动方法,但前两个作品不起作用!JTable的自动滚动到下

任何想法?

我去掉了一些列添加代码为clearity但这是想法;

private JScrollPane fillThirdTable(ArrayList<DisplayVariable> displayList) { 
    DefaultTableModel model = new DefaultTableModel(); 

    ToolTipTable answer = new ToolTipTable(model); 

      answer.setRowHeight(60); 
    answer.setAutoResizeMode(JTable.AUTO_RESIZE_OFF); 
    answer.setSize(1300, 400); 
    DefaultTableCellRenderer dtcr = new DefaultTableCellRenderer(); 
    dtcr.setHorizontalAlignment(SwingConstants.CENTER); 
    answer.getColumn("Display Variable ID").setCellRenderer(dtcr); 

    JScrollPane scrollPane = null; 
    for (DisplayVariable var : displayList) { 

     model.addRow(new Object[] { id, shown, name, value }); 
     answer.setFillsViewportHeight(true);  
    } 


    TableColumn c= answer.getColumnModel().getColumn(3); 
    c.setCellRenderer(new MultiLineCellRenderer()); 

    TableColumn c2= answer.getColumnModel().getColumn(2); 
    c2.setCellRenderer(new MultiLineCellRenderer()); 


    scrollPane = new JScrollPane(answer); 
    scrollPane.setSize(1300, 400); 

//here I call the method 
    scrollToVisible(answer, (displayList.size()-1), 1); 

    return scrollPane; 

} 

这是自动滚动的方法;

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

    // Scroll the area into view 
    viewport.scrollRectToVisible(rect); 
} 
+2

猜测(通过去除效果的setSize),但使用空布局的另一个问题?如果是这样的话:dontdontdontdont永远不会null layoutManager。真正做到:从不 – kleopatra 2011-05-11 08:34:56

回答

0

我只是删除在“scrollPane.setSize(1300,400)”和它的工作

1

我看不到你讲的东西,这是从http://www.exampledepot.com/egs/javax.swing.table/pkg.html

例如例只是完整副本(这里有三个JTable中过,但另一回事)

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

public class TableSelection implements ListSelectionListener { 

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

    public TableSelection() { 
     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); 
     //TableSelection tableSelection = new TableSelection(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 TableSelection(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) { 
     TableSelection tableSelection = new TableSelection(); 
    } 
} 
+0

我只是删除了“scrollPane.setSize(1300,400)”和它的工作! – Spring 2011-05-10 21:36:23

+0

您的随机代码片段的存储看起来infinits :-) BTW,如什么都不做与原始的问题(你忘了注册听众) – kleopatra 2011-05-11 08:46:06

6

据我所知,你不需要在父母身上工作。只要使用此:

public void scrollToVisible(JTable table, int rowIndex, int vColIndex) { 
    table.scrollRectToVisible(table.getCellRect(rowIndex, vColIndex, true)); 
} 

我确实有与先前滚动的问题是通过使用SwingUtilities.invokeLater()排序,所以你可能想尝试,以及:

public void scrollToVisible(final JTable table, final int rowIndex, final int vColIndex) { 
    SwingUtilities.invokeLater(new Runnable() { 
     @Override 
     public void run() { 
      table.scrollRectToVisible(table.getCellRect(rowIndex, vColIndex, false)); 
     } 
    }); 
} 
+0

,谢谢,我只是删除了“scrollPane.setSize(1300,400)”和有效! – Spring 2011-05-10 21:50:30