2009-02-27 6 views
0

J'ai obtenu une interface graphique Java Swing et j'ai eu un problème avec un JTable dans un JScrollPane. Pour une raison quelconque, lorsque les lignes du modèle de table sont augmentées pendant l'exécution du programme, le JScrollPane n'est pas mis à jour - si les lignes sont augmentées de sorte que la hauteur de la table soit supérieure à la hauteur de la vue défilement, le les volets de défilement ne sont pas mis à jour comme supposé. (Les nouvelles lignes sont affichées à l'écran comme prévu). Si la fenêtre est redimensionnée, le défilement est mis à jour comme prévu.Swing GUI: défilement non mis à jour quand un JTable devient plus grand

La politique de défilement vertical est VERTICAL_SCROLLBAR_AS_NEEDED, les modèles de table fireTableDataChanged est appelé ..

Malheureusement le code est un peu complexe, donc je ne peux pas fournir un exemple de code l'origine du problème. Mais la pensée de se demander si quelqu'un a des idées droites ..

EDIT: Encore un peu plus confuse: la politique de défilement horizontal est HORIZONTAL_SCROLLBAR_AS_NEEDED, et si la largeur de la table si sur la largeur de vue (qui est, la barre de défilement horizontale est utilisé), ce problème ne se produit pas ...

EDIT2: Le problème n'est pas que la table doit être défilée mais que les barres de défilement ne sont pas activées comme elles le devraient.

Répondre

0

Hmm .. après son retour à la question que j'ai découvert que notre La personnalisation d'en-tête de ligne dans JScrollPane était à l'origine du problème. (Certaines tailles préférées ont été définies avec des valeurs non-sensibles, etc.)

4

Vous devrez peut-être publier un peu de votre code. Je viens d'en cloque le test et il fonctionne suivant comme prévu, par exemple les barres de défilement verticales sont activées lorsque le nombre de lignes dépasse la hauteur de la fenêtre:

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

Merci; le dernier '}' a été oublié en dehors de la section de code. Mais oui, je pense que je vais devoir travailler sur une version de test qui a le problème (ou savoir comment corriger le bogue) – Touko

Questions connexes