Utilizzando MigLayout, perché è un JButton seguendo un JTable non risponde e come risolvere questo problema?

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

Domanda

Sto avendo un problema da capogiro per quanto riguarda l'uso di un JButton a seguito di una JTable con MigLayout. E 'del tutto insensibile a meno che io spingo abbastanza lontano oltre il JTable (allora può comportarsi in modo corretto).

Ho provato a fare funzionare il codice sia con la JAR MigLayout della versione che usiamo per prodotti di fascia di utenti e con il più recente molto uno; stesso risultato.

Ecco un esempio di codice che riproduce il problema (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();
    }

}

Suppongo che abbia qualcosa a che fare con l'intestazione della tabella e la tabella stessa finendo nella stessa cella di layout, ma non sono davvero sicuro di questo.

Come ho detto, se premo il tasto abbastanza lontano oltre il JTable, funzionerà di nuovo. Se mi cade sulla riga successiva, non funziona, devo spostarlo verso il basso una riga in più.

L'unica libreria avete bisogno nel vostro spazio di lavoro per eseguire il codice è MigLayout .

Grazie a tutti per il vostro aiuto, molto apprezzato!

M. Joanis

È stato utile?

Soluzione

Non credo che sia un problema MigLayout, per se . Il pulsante funziona correttamente senza la linea

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

Si potrebbe provare avvolgendo la combinazione intestazione / tavola in un sotto-pannello:

JPanel sub = new JPanel();
sub.add(table.getTableHeader(), "grow");
sub.add(scrollpane, "grow");
panel.add(sub);
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top