2010-03-24 12 views
1

J'ai un problème époustouflant concernant l'utilisation d'un JButton suite à un JTable avec MigLayout. Il ne répond absolument pas à moins que je le pousse assez loin après le JTable (alors il peut se comporter correctement).En utilisant MigLayout, pourquoi un JButton suite à un JTable ne répond pas et comment résoudre ce problème?

J'ai essayé d'exécuter le code avec le JAR MigLayout de la version que nous utilisons pour les produits des utilisateurs finaux et avec le plus récent; même résultat.

Voici un exemple de code à reproduire le problème (Main.java):

import java.awt.Dimension; 

import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.JScrollPane; 
import javax.swing.JTable; 
import javax.swing.JTextField; 
import javax.swing.table.DefaultTableModel; 

import net.miginfocom.swing.MigLayout; 

@SuppressWarnings("serial") 
public class Main extends JFrame { 

    private JPanel panel; 
    private JTextField textField; 
    private JButton chooseButton; 
    private JTable table; 
    private JButton reloadButton; 
    private final DefaultTableModel model = new DefaultTableModel() { 
     @Override 
     public boolean isCellEditable(int row, int column) { 
      return false; 
     } 
    }; 

    public Main() { 
     panel = new JPanel(new MigLayout("debug", "[][grow][]")); 
     setContentPane(panel); 
     setDefaultCloseOperation(EXIT_ON_CLOSE); 

     /*** First row ***/ 
     // "File:" 
     panel.add(new JLabel("File:")); 

     // textField for filename 
     textField = new JTextField("No file selected yet!"); 
     textField.setEditable(false); 
     panel.add(textField, "growx"); 

     // "Choose..." button 
     chooseButton = new JButton("Choose..."); 
     panel.add(chooseButton, "wrap, sg buttons"); 

     /*** Second row ***/ 
     panel.add(new JLabel()); 
     table = new JTable(model); 
     model.setColumnIdentifiers(new String[] {"col title"}); 
     JScrollPane scrollpane = new JScrollPane(table); 
     Dimension scrollpaneDimension = new Dimension(125, 110); 
     scrollpane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS); 
     table.setPreferredScrollableViewportSize(scrollpaneDimension); 
     table.setFillsViewportHeight(true); 
     panel.add(table.getTableHeader(), "grow"); 
     panel.add(scrollpane, "grow"); 

     reloadButton = new JButton("Reload"); 
     panel.add(reloadButton, "top, wrap, sg buttons"); 

     pack(); 
     setVisible(true); 
    } 

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

} 

Je suppose qu'il a quelque chose à voir avec l'en-tête de table et la table elle-même se retrouver dans la même cellule de mise en page, mais je Je ne suis pas vraiment sûr de ça. Comme je l'ai dit, si je pousse le bouton assez loin après le JTable, il va fonctionner à nouveau. Si je le laisse tomber sur le rang suivant, ça ne marche pas, je dois le descendre d'une rangée de plus.

La seule bibliothèque dont vous avez besoin dans votre espace de travail pour exécuter le code est MigLayout.

Merci à tous pour votre aide, très appréciée!

M. Joanis

+0

Le problème n'aurait rien à voir avec MigLayout, désolé mig! – Joanis

Répondre

2

Je ne pense pas que ce soit un problème MigLayout, en soi. Le bouton fonctionne correctement sans la ligne

panel.add(table.getTableHeader(), "grow"); 

Vous pouvez essayer envelopper la combinaison tête/table dans un sous-groupe:

JPanel sub = new JPanel(); 
sub.add(table.getTableHeader(), "grow"); 
sub.add(scrollpane, "grow"); 
panel.add(sub); 
+0

Enlever cette ligne semble résoudre le problème sans aucun effet secondaire. Comme le code était comme ça, j'ai supposé que c'était nécessaire. Si je trouve qu'il y a un effet négatif à supprimer cette ligne, je vais essayer de les ajouter à leur propre petit JPanel et ça devrait marcher aussi ... Merci beaucoup! Une solution facile, mais nous avons passé des heures à essayer de résoudre ce problème sans jamais songer à supprimer cette ligne. – Joanis

+0

Je l'ai négligé au début, aussi. Cela peut représenter un oubli par l'auteur original lors de l'ajout de 'JTable' à un' JScrollPane'. – trashgod