2009-02-27 8 views
0

Bir Java Swing GUI var ve JScrollPane'da JTable ile ilgili bir sorunum var. Bazı nedenlerden dolayı, programın yürütülmesi sırasında tablo modelinin satırları arttığında, JScrollPane güncelleştirilmez; yani satırlar artırılırsa, tablonun yüksekliği kaydırma görünümünün yüksekliğinden fazla olur; kaydırma bölmeleri varsayılan olarak güncellenmez. (Yeni satırlar ekranda beklendiği gibi gösterilir). Pencere yeniden boyutlandırılırsa, kaydırma beklendiği gibi güncellenir. Ben soruna neden bir kod örneğini sağlayamaz böyleceSwing GUI: Bir JTable büyürse kaydırma işlemi güncellenmiyor

dikey kaydırma politikası, masa modelleri fireTableDataChanged denir VERTICAL_SCROLLBAR_AS_NEEDED olduğunu ..

Maalesef kod biraz karmaşık. Ama birisi düz bazı fikirleri var sormaya düşündük ..

DÜZENLEME: Hala kafa karıştırıcı biraz daha: Tablo genişliği (görünüm genişliği boyunca yatay kaydırma çubuğu olan yani yatay kaydırma politikası HORIZONTAL_SCROLLBAR_AS_NEEDED edilir ve eğer varsa (Bu tabloyu kapaBu tabloyu aç), bu sorun oluşmuyor ...

EDIT2: Sorun, tablonun kaydırılmasının gerekmediği, ancak kaydırma çubuğunun gerektiği gibi etkinleştirilmemesidir.

cevap

0

Hmm .. konuya döndükten sonra bizim JScrollPane içinde özelleştirme satırı üstbilgisi soruna neden oldu. (Bazı tercih edilenler hassas olmayan değerler vb. Ile ayarlanmıştır.)

4

Bazı kodlarınızı göndermeniz gerekebilir. Sadece aşağıdaki testi hamile ettik ve dikey kaydırma çubukları satır sayısı viewport yüksekliğini aştığında devreye girer, yani reklamı gibi çalışır: Ben öğrendim

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

Teşekkürler; son '}' kod bölümünün dışında unutuldu. Ama evet, problemi olan bazı test sürümlerini çalıştırmam gerektiğini düşünüyorum (ya da hatayı nasıl düzelteceğinizi öğrenin) – Touko