2013-08-21 16 views
1

這裏是什麼,我一直在使用的示例表:JTable的自動滾屏的方法是一排太高

JScrollPane scrollPane = new JScrollPane(); 
contentPane.add(scrollPane); 

table = new JTable(); 
DefaultTableModel tableModel = new DefaultTableModel(new Object[]{"Row 1","Row 2"},0); 
table.setModel(tableModel); 
scrollPane.setViewportView(table); 

我已經嘗試都具有相同的結果使用以下方法自動滾動。

// Method 1 
JScrollBar vertical = scrollPane.getVerticalScrollBar(); 
vertical.setValue(vertical.getMaximum()); 

// Method 2 
table.scrollRectToVisible(table.getCellRect(table.getRowCount(), 0, true)); 

兩個例子去表中的近底部,直到最後一個(底部)行用戶必須向下滾動才能看到,當加入另一行只是再次發生。


編輯:實施例的代碼複製問題

import java.awt.*; 
import javax.swing.*; 

import java.awt.event.ActionListener; 
import java.awt.event.ActionEvent; 
import javax.swing.JScrollPane; 
import javax.swing.table.DefaultTableModel; 

public class ScrollTableEx extends JFrame { 

    private static final long serialVersionUID = 1L; 
    public int i = 100; 
    public JScrollPane scrollPane; 
    public JPanel contentPane; 
    public JTable table; 
    public JButton add; 
    public DefaultTableModel model = new DefaultTableModel(new Object[] { "Int (+)", "Int (-)" }, 0); 

    public static void main(String[] args) { 
     ScrollTableEx frame = new ScrollTableEx(); 
     frame.setVisible(true); 
    } 

    public ScrollTableEx() { 
     setResizable(false); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setLayout(new BorderLayout()); 
     setSize(500,400); 

     scrollPane = new JScrollPane(); 

     table = new JTable(); 
     table.setCellSelectionEnabled(true); 
     table.setModel(model); 
     scrollPane.setViewportView(table); 

     for (int i = 0; i < 100; i++) { 
      model.addRow(new Object[] { i, i * -1 }); 
      Rectangle goodRect = table.getCellRect(model.getRowCount() - 1, 0, true); 
      table.scrollRectToVisible(goodRect); 
     } 

     JButton add = new JButton("Add"); 
     add.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent arg0) { 
       Rectangle goodRect = table.getCellRect(model.getRowCount() - 1, 0, true); 
       table.scrollRectToVisible(goodRect); 
       model.addRow(new Object[] { i, i * -1 }); 
       i++; 
      } 
     }); 

     add(add, BorderLayout.NORTH); 
     add(scrollPane, BorderLayout.CENTER); 
    } 
} 
+0

雖然不直接相關到你的問題,'scrollPane.setBounds(664,0,229,236);'沒有任何好處。您應該在適當的佈局管理器上進行中繼 – MadProgrammer

+0

當您在滾動窗格中環繞組件時,WindowBuilder for eclipse是如何執行此操作的;它並沒有造成任何其他項目中的麻煩。 –

+3

'.setBounds'是一個滴答作響的定時炸彈,WindowsBuilder也不會這麼做。 – MadProgrammer

回答

4

問題是,JTableTableModel都是0索引。也就是說,最後的值實際上是rowCount - 1

所以當你使用table.getCellRect(table.getRowCount(), 0, true),它實際上返回正確的位置的Rectangle,只需用0高度,因爲該行實際上並不存在。

相反,你要使用table.getCellRect(table.getRowCount() - 1, 0, true)

import java.awt.BorderLayout; 
import java.awt.EventQueue; 
import java.awt.Rectangle; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JScrollPane; 
import javax.swing.JTable; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 
import javax.swing.table.DefaultTableModel; 

public class ScrollTable { 

    public static void main(String[] args) { 
     new ScrollTable(); 
    } 

    public ScrollTable() { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { 
       } 

       final DefaultTableModel model = new DefaultTableModel(new Object[]{"Test"}, 0); 
       for (int index = 0; index < 100; index++) { 
        model.addRow(new Object[]{index}); 
       } 

       final JTable table = new JTable(model); 

       JButton add = new JButton("Add"); 
       add.addActionListener(new ActionListener() { 
        @Override 
        public void actionPerformed(ActionEvent e) { 
         model.addRow(new Object[]{model.getRowCount()}); 
         Rectangle badRect = table.getCellRect(model.getRowCount(), 0, true); 
         Rectangle goodRect = table.getCellRect(model.getRowCount() - 1, 0, true); 

         System.out.println("bad = " + badRect); 
         System.out.println("goodRect = " + goodRect); 

         table.scrollRectToVisible(goodRect); 
        } 
       }); 

       JFrame frame = new JFrame("Testing"); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.setLayout(new BorderLayout()); 
       frame.add(new JScrollPane(table)); 
       frame.add(add, BorderLayout.SOUTH); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 
     }); 
    } 

} 

我會避免使用.setBounds在可能的情況。它沒有考慮到不同計算機和操作系統之間存在的差異,儘管在開發時可能看起來非常好,但當您將其移動到另一個系統時,它可能會產生不可靠的結果 - 恕我直言:

+0

我嘗試了你所建議的將-1加到getrowcount()並且它仍然不起作用。我將如何去除滾動窗格上的setbounds,因爲我的contentpane是絕對佈局,我如何才能完全按照需要獲取它? –

+1

奇怪,因爲它對我來說很好。你能運行我的測試代碼嗎? – MadProgrammer

+0

我運行了你的代碼,它的工作原理就像我希望我的工作一直滾動到底部一樣。 –