2010-02-04 4 views
1

Le code suivant montre un bogue que j'essaie de corriger. J'ai deux façons d'afficher une table (hiérarchie ci-dessous):Swing: impossible d'afficher correctement JTable

  1. JTable directement dans un JOptionPane: montre la fin de la table.

    JOptionPane 
        JTable 
    
  2. JTable dans un scrollpane dans un JPanel dans un JOptionPane: ne peut pas sembler montrer la table.

    JOptionPane 
        JPanel 
         JScrollPane 
          JTable 
    

Puisqu'il est la même fonction pour créer la table, je suis assez positif que je fais quelque chose de mal w/r/t dimensionnement/mise en page. Aucune suggestion?

import java.awt.Dimension; 
import javax.swing.JOptionPane; 
import javax.swing.JPanel; 
import javax.swing.JScrollPane; 
import javax.swing.JTable; 
import javax.swing.table.AbstractTableModel; 

public class TableTest2 { 
    public static void testTable(JTable t) { 
     t.setModel(new AbstractTableModel() { 
      public String getColumnName(int col) { return "col"+Integer.toString(col); } 
      public int getRowCount() { return 4; } 
      public int getColumnCount() { return 4; } 
      public Object getValueAt(int row, int col) { 
       return Integer.toString(row*col); 
      } 
      public boolean isCellEditable(int row, int col) { return false; } 
      public void setValueAt(Object value, int row, int col) { } 
     }); 
    } 
    public static void main(String[] args) { 
     doTest1(); 
     doTest2(null, null); 
     doTest2(new Dimension(500,500), null); 
     doTest2(new Dimension(500,500), new Dimension(400,400)); 
    } 
    private static void doTest1() { 
     JTable t = new JTable(); 
     t.setPreferredSize(new Dimension(500,500)); 
     TableTest2.testTable(t); 
     JOptionPane.showMessageDialog(null, t, "test1", JOptionPane.INFORMATION_MESSAGE); 
    } 
    private static void doTest2(Dimension d1, Dimension d2) { 
     JTable t = new JTable(); 
     TableTest2.testTable(t); 
     JPanel panel = new JPanel(); 
     JScrollPane sp = new JScrollPane(); 
     sp.add(t); 
     if (d1 != null) 
      sp.setPreferredSize(d1); 
     panel.add(sp); 
     if (d2 != null) 
      panel.setPreferredSize(d2); 
     JOptionPane.showMessageDialog(null, panel, "test2", JOptionPane.INFORMATION_MESSAGE); 
    } 
} 

Répondre

2

Essayez ceci:

JScrollPane sp = new JScrollPane(t); 

fournissant le composant pour le scrollpane dans le constructeur.

Vous n'ajoutez pas de composants au scrollpane. Vous pouvez définir une fenêtre lik Ethis:

sp.getViewPort().setView(t); 

plutôt que

sp.add(t); 
+0

Huh. Ça marche. Pourquoi? –

+0

Ah, votre édition rend clair. Merci! –

+0

@Jason S Pas de problème. Heureux de vous aider. –

Questions connexes