如何对齐不同 MigLayout 面板中的列?

How to align columns in different MigLayout panels?

我一直在开发一个 GUI,其中最基本的是有两个面板,其中一个面板充当 header,table 构成第二个面板。我使用了两个面板,因为有些情况下可能有很多行,所以第二个面板通过 Jscrollbar 传递。这会产生“粘性”顶行的效果,并且能够滚动到底行。还值得注意的是,第二个面板的组件是 JLabels、JCheckBoxs 和 JTextAreas。

所有这一切都说明我的问题是我无法找到一种方法让标签和数据对齐。我在 MigLayout 中使用组件约束和列约束尝试了许多不同的方法,但都无济于事。有人对我如何实现这一目标有任何想法吗?

这是目前的示例:

这也是我的代码:

public class help implements ActionListener {

public help(ArrayList<Integer> in){
    fighters = in;
    frame = new JFrame();
    frame.setTitle("");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setExtendedState(JFrame.MAXIMIZED_BOTH);
    MigLayout layout = new MigLayout(
            "wrap 9",
            "[175, grow] [175, grow] [175, grow] [175, grow] [175, grow] [175, grow] [175, grow] " +
                    "[175, grow] [175, grow]",
            ""
    );
    MigLayout layout2 = new MigLayout(
            "wrap 9",
            "[grow] [grow] [grow] [grow] [grow] [grow] [grow, fill] " +
                    "[grow] [grow]",
            ""
    );

    JPanel panel = new JPanel(layout2);
    JPanel top = new JPanel(layout2);
    data = new Component[in.size()][9];
    for (int i = 0; i < in.size(); i++) {
        data[i][7] = new JLabel("Label 1 Row " + i);
        panel.add(data[i][7]);
        data[i][0] = new JLabel();
        panel.add(data[i][0]);
        data[i][1] = new JLabel("Label 2 Row " + i);
        panel.add(data[i][1]);
        data[i][2] = new JLabel("Label 3 Row " + i);
        panel.add(data[i][2]);
        data[i][3] = new JLabel("Label 4 Row " + i);
        panel.add(data[i][3]);
        data[i][4] = new JLabel("Label 5 Row " + i);
        panel.add(data[i][4]);
        data[i][5] = new JCheckBox();
        JCheckBox a = (JCheckBox) data[i][5];
        a.addActionListener(this);
        panel.add(data[i][5]);
        data[i][6] = new JCheckBox();
        JCheckBox r = (JCheckBox) data[i][6];
        r.addActionListener(this);
        panel.add(data[i][6]);
        data[i][8] = new JTextArea("", 5, 20);
        panel.add(data[i][8]);

    }
    top.add((new JLabel("Label 1")));
    top.add(new JLabel("Label 2"));
    top.add(new JLabel("Label 3"));
    top.add(new JLabel("Label 4"));
    top.add(new JLabel("Label 5"));
    top.add(new JLabel("Label 6"));
    top.add(new JLabel("Label 7"));
    top.add(new JLabel("Label 8"));
    top.add(new JLabel("Label 9"));
    scrollBar = new JScrollPane(panel);
    scrollBar.setPreferredSize(new Dimension(1000, 600));
    scrollBar.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED);
    scrollBar.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED);
    frame.add(top, BorderLayout.NORTH);
    frame.add(scrollBar);
    frame.pack();
    frame.setLocationRelativeTo(null);
    frame.setVisible(true);
}

@Override
public void actionPerformed(ActionEvent e) {

}
}

主要Class:

public class Main {
public static void main(String[] args) {
    ArrayList<Integer> list = new ArrayList<>();
    for (int i = 0; i < 50; i++) {
        list.add(i);
    }
    new help(list);
}
}

尝试以下操作:

JPanel panel = new JPanel(new GridLayout(9, 9));
panel.setPreferredSize(new Dimension(800, 20*9));
JPanel top = new JPanel(new GridLayout(1, 9));
top.setPreferredSize(new Dimension(800, 20));

我不知道你到底想做什么,但也许 JTable 可以帮助你!

Does anyone have any ideas on how I can achieve this?

这对JTable来说是完美的。

忘掉所有面板和布局,创建一个 TableModel 来表示列名称和数据。将模型添加到 table 的构造函数中。根据需要为列创建适当的渲染器和编辑器(单选按钮、复选框、组合框、文本字段和区域等)。

配置 table 进行自动排序,您将为用户提供使用布局无法实现的功能。

有关上述所有内容的更多详细信息,请参阅 How to Use Tables