Usando MigLayout, ¿por qué es un JButton siguiendo un JTable no responde y cómo solucionar este problema?

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

Pregunta

Estoy teniendo un problema abrumador con respecto al uso de un JButton después de un JTable con MigLayout. Es totalmente insensibles a no ser que la empujo lo suficiente más allá de la JTable (entonces se puede comportarse correctamente).

He tratado de ejecutar el código tanto con el JAR MigLayout de la versión que utilizamos para los productos de consumo final y con el más reciente; mismo resultado.

Aquí hay un código de ejemplo que reproduce el 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();
    }

}

Supongo que tiene algo que ver con la cabecera de la tabla y la propia tabla de acabar en la misma celda de disposición, pero realmente no estoy seguro de ello.

Como ya he dicho, si pulso el botón lo suficiente más allá de la JTable, va a trabajar de nuevo. Si lo dejo caer en la fila siguiente, que no funciona, tengo que moverlo hacia abajo una fila más.

La única biblioteca que necesita en su espacio de trabajo para ejecutar el código es MigLayout .

Gracias a todos por su ayuda, muy apreciada!

M. Joanis

¿Fue útil?

Solución

No creo que sea un problema MigLayout, por sí . El botón funciona correctamente sin la línea

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

Es posible que trate de envolver la combinación encabezado / mesa en un subpanel:

JPanel sub = new JPanel();
sub.add(table.getTableHeader(), "grow");
sub.add(scrollpane, "grow");
panel.add(sub);
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top