2009-02-27 66 views
0

我得到了Java Swing GUI,並在JTableJScrollPane中遇到了問題。出於某種原因,在程序執行期間表格模型的行數增加時,JScrollPane不會更新 - 即,如果增加行數以使表的高度超過滾動視圖的高度,則滾動窗格不會按假定更新。 (新行按預期顯示在屏幕上)。如果窗口大小調整,滾動按預期更新。Swing GUI:當JTable變大時滾動不會更新

垂直滾動是VERTICAL_SCROLLBAR_AS_NEEDED,錶款fireTableDataChanged被稱爲..

不幸的是,代碼有點複雜,所以我不能提供導致該問題的代碼示例。但是想過要問,如果有人有一些想法直..

編輯:還有更有點混亂:水平滾動策略HORIZONTAL_SCROLLBAR_AS_NEEDED,如果表格寬度若超過視圖寬度(即,水平滾動條使用),則不會發生此問題...

EDIT2:問題不在於表格應該滾動,而是滾動條未被激活,因爲它們應該如此。

回答

0

嗯..回到問題後,我發現,我們的在JScrollPane中自定義行標題導致了問題。 (有些偏好設置了不太明智的值等)。

4

您可能需要發佈一些代碼。我剛剛敲了下面的測試,它像宣傳的那樣,即當行數超過視高度垂直滾動條被激活:

import java.awt.GridLayout; 
import java.util.ArrayList; 
import java.util.List; 

import javax.swing.JFrame; 
import javax.swing.JScrollPane; 
import javax.swing.JTable; 
import javax.swing.ScrollPaneConstants; 
import javax.swing.table.AbstractTableModel; 

public class JTableTest { 

    public static void main(String[] args) { 
     final MyTableModel tm = new MyTableModel(); 
     tm.addData(new Data("R1C1", "R1C2")); 

     JTable table = new JTable(tm); 
     JScrollPane scrollPane = new JScrollPane(table); 
     scrollPane.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED); 
     JFrame frame = new JFrame(); 
     frame.setLayout(new GridLayout()); 
     frame.add(scrollPane); 
     frame.pack(); 
     frame.setSize(400, 150); 
     frame.setVisible(true); 

     Thread t = new Thread(new Runnable() { 
      private int count = 2; 
      public void run() { 
       for (; ;) { 
        tm.addData(new Data("R" + count + "C1", "R" + count + "C2")); 
        count++; 
        try { 
         Thread.sleep(2000); 
        } catch (InterruptedException e) { 
         // TODO Auto-generated catch block 
         e.printStackTrace(); 
        } 
       } 
      } 
     }); 
     t.start(); 
    } 

    private static class MyTableModel extends AbstractTableModel { 
     private List<Data> dataList = new ArrayList<Data>(); 

     public int getColumnCount() { 
      return 2; 
     } 

     public void addData(Data data) { 
      dataList.add(data); 
      fireTableRowsInserted(dataList.size()-1, dataList.size()-1); 
     } 

     public int getRowCount() { 
      return dataList.size(); 
     } 

     public Object getValueAt(int rowIndex, int columnIndex) { 
      Data data = dataList.get(rowIndex); 
      return columnIndex == 0 ? data.data1 : data.data2; 
     } 
    } 

    private static class Data { 
     public String data1; 
     public String data2; 

     public Data(String data1, String data2) { 
      this.data1 = data1; 
      this.data2 = data2; 
     } 
    } 
} 
+0

謝謝;最後的'}'在代碼部分之外被遺忘了。但是,是的,我會認爲我需要編寫一些確實存在問題的測試版本(或者找出如何解決該問題) – Touko 2009-02-27 14:00:46