Usando o Miglayout, por que um JButton está seguindo um JTable sem resposta e como consertar isso?

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

Pergunta

Estou tendo um problema impressionante em relação ao uso de um jbutton após um jtable com o Miglayout. É totalmente sem resposta, a menos que eu o empurre o suficiente para além do jtable (então ele pode se comportar corretamente).

Eu tentei executar o código com o jarra Miglayout da versão que usamos para os produtos do usuário final e com o mais recente; mesmo resultado.

Aqui está um código de amostra reproduzindo o 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();
    }

}

Suponho que isso tenha algo a ver com o cabeçalho da tabela e a própria tabela acabando na mesma célula de layout, mas realmente não tenho certeza disso.

Como eu disse, se eu empurrar o botão o suficiente para além do jtable, ele funcionará novamente. Se eu o soltar na próxima linha, ele não funciona, tenho que movê -lo mais uma linha.

A única biblioteca que você precisa no seu espaço de trabalho para executar o código é Miglayout.

Obrigado a todos pela sua ajuda, muito apreciada!

M. Joanis

Foi útil?

Solução

Eu não acho que seja um problema de miglayout, por si só. O botão funciona corretamente sem a linha

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

Você pode tentar embrulhar a combinação de cabeçalho/tabela em um sub-pai:

JPanel sub = new JPanel();
sub.add(table.getTableHeader(), "grow");
sub.add(scrollpane, "grow");
panel.add(sub);
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top