En utilisant MigLayout, pourquoi un JButton suit une JTable qui ne répond pas et comment résoudre ce problème?

StackOverflow https://stackoverflow.com/questions/2511286

Question

J'ai un problème ahurissants concernant l'utilisation d'un JButton suite à une JTable avec MigLayout. Il est totalement insensible à moins que je pousse assez loin au-delà du JTable (il peut se comporter correctement).

J'ai essayé de lancer le code à la fois le JAR MigLayout de la version que nous utilisons pour les produits de l'utilisateur final et au 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 ne suis vraiment pas sûr de cela.

Comme je l'ai dit, si je pousse le bouton assez loin devant le JTable, il fonctionnera à nouveau. Si je laisse tomber sur la ligne suivante, il ne fonctionne pas, je dois le déplacer vers le bas une ligne supplémentaire.

La seule bibliothèque que 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

Était-ce utile?

La solution

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);
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top