باستخدام Miglayout ، لماذا Jbutton يتبع jtable غير مستجيبة وكيفية إصلاح هذا؟

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

سؤال

أواجه مشكلة محيرة في العقل فيما يتعلق باستخدام jbutton بعد jtable مع miglayout. إنه أمر لا يستجيب تمامًا ما لم أدفعه بعيدًا بما فيه الكفاية عبر Jtable (ثم يمكن أن يتصرف بشكل صحيح).

لقد حاولت تشغيل الكود مع كل من جرة Miglayout من الإصدار الذي نستخدمه لمنتجات المستخدمين النهائيين ومع الإصدار الأحدث ؛ نفس النتيجة.

فيما يلي نموذج رمز يعيد إنتاج المشكلة (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 ، فسوف يعمل مرة أخرى. إذا قمت بإسقاطه على الصف التالي ، فهذا لا يعمل ، يجب أن أحركه لأسفل صف آخر.

المكتبة الوحيدة التي تحتاجها في مساحة العمل الخاصة بك لتشغيل الرمز هي ميجليوت.

شكرا لكم جميعا لمساعدتكم ، موضع تقدير كبير!

M. Joanis

هل كانت مفيدة؟

المحلول

لا أعتقد أنها مشكلة miglayout ، في حد ذاته. الزر يعمل بشكل صحيح بدون الخط

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

قد تحاول تغليف مجموعة الرأس/الجدول في لوحة فرعية:

JPanel sub = new JPanel();
sub.add(table.getTableHeader(), "grow");
sub.add(scrollpane, "grow");
panel.add(sub);
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top