Используя MigLayout, почему JButton после JTable не отвечает и как это исправить?

У меня ошеломляющая проблема с использованием JButton после JTable с MigLayout. Он полностью не отвечает, если я не протолкну его достаточно далеко за пределы JTable (тогда он может вести себя правильно).

Я попытался запустить код как с MigLayout JAR версии, которую мы используем для продуктов конечных пользователей, так и с самой последней версией; такой же результат.

Вот пример кода, воспроизводящего проблему (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();
    }

}

Я предполагаю, что это как-то связано с заголовком таблицы и самой таблицей, оказавшейся в одной и той же ячейке макета, но я действительно не уверен в этом.

Как я уже сказал, если я нажму кнопку достаточно далеко за JTable, она снова заработает. Если я перетащу его в следующую строку, это не сработает, мне придется переместить его еще на одну строку вниз.

Единственная библиотека, которая вам нужна в рабочей области для запуска кода, — это Миглайаут.

Спасибо всем за помощь, очень признателен!

М. Джоанис


person Joanis    schedule 24.03.2010    source источник
comment
Проблема не будет иметь никакого отношения к MigLayout, извините, Миг!   -  person Joanis    schedule 25.03.2010


Ответы (1)


Я не думаю, что это проблема MigLayout, сама по себе. Кнопка работает корректно без линии

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

Вы можете попробовать обернуть комбинацию заголовка/таблицы в подпанель:

JPanel sub = new JPanel();
sub.add(table.getTableHeader(), "grow");
sub.add(scrollpane, "grow");
panel.add(sub);
person trashgod    schedule 24.03.2010
comment
Удаление этой строки, кажется, решает проблему без каких-либо побочных эффектов. Поскольку код был таким, я предположил, что он необходим. Если я обнаружу, что удаление этой строки имеет негативный эффект, я попытаюсь добавить их в свою маленькую панель JPanel, и это тоже должно сработать... Большое спасибо! Такое простое исправление, но мы потратили часы, пытаясь исправить это, и никогда не думали об удалении этой строки. - person Joanis; 25.03.2010
comment
Я тоже изначально не замечал. Это может свидетельствовать о недосмотре оригинального автора при добавлении JTable к JScrollPane. - person trashgod; 25.03.2010