Выравнивание компонентов Miglayout по верхней части ячейки

#miglayout

#miglayout

Вопрос:

У меня есть группа кнопок, которые просто останутся в середине панели. Я пытаюсь разместить их в верхней части панели в ограничении flowy layout. Мы высоко ценим любую помощь в достижении этого. Я пробовал закрепить и выровнять, но ничего не сделал.

 private class ProductPanel extends JPanel {

    private JLabel lblProd;
    private JButton butAdd;
    private JButton butRemove;
    private JButton butEdit;
    private Product_Table_Model ptm;
    private JScrollPane scroll;
    private JPanel buttonPanel;
    private JTable table;

    ProductPanel() {

        setLayout(new MigLayout("debug"));

        ptm = new Product_Table_Model(
                (ArrayList<Product>) client
                        .receiveObject("Get_Product_Data"));

        initComponents();

    }

    public void initComponents() {

        lblProd = new JLabel ("Product List: ");

        buttonPanel = new JPanel (new MigLayout());
        butAdd = new JButton ("Add");
        butRemove = new JButton ("Remove");
        butEdit = new JButton ("Edit");
        buttonPanel.add(butAdd, "cell 0 0");
        buttonPanel.add(butRemove, "cell 0 1");
        buttonPanel.add(butEdit, "cell 0 2");

        butAdd.setPreferredSize(new Dimension(40, 50));

        add(lblProd, "wrap");

        table = new JTable(ptm);
        table.setFillsViewportHeight(true);
        scroll = new JScrollPane(table);

        add(scroll);
        add(buttonPanel);


    }

}
  

Комментарии:

1. Вам необходимо предоставить полный пример. Должно быть, возникла другая проблема; кнопки в потоковом режиме по умолчанию выровнены по верхнему краю.

2. обновлено с помощью кода, попытался создать изображение, но у меня нет репутации 10.

Ответ №1:

Кнопки выровнены по верху, как и ожидалось. Это сама панель, которая не была выровнена внутри своей ячейки. Итак, следующее устранит проблему:

add(buttonPanel, "top");

Вы не должны устанавливать требуемый размер с помощью setPrefferedSize() метода. Вместо этого используйте группы размеров.

MigLayout это очень мощный менеджер компоновки, вам не нужно создавать две панели с двумя менеджерами компоновки. Можно создать свой макет намного проще. Следующий пример является одним из таких решений:

 package com.zetcode;

import java.awt.EventQueue;
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 net.miginfocom.swing.MigLayout;

public class ProductPanel2 extends JPanel {

    private JLabel lblProd;
    private JButton butAdd;
    private JButton butRemove;
    private JButton butEdit;
    private JScrollPane scroll;
    private JTable table;

    public ProductPanel2() {

        initComponents();
    }

    private void initComponents() {

        setLayout(new MigLayout());

        lblProd = new JLabel("Product List: ");

        butAdd = new JButton("Add");
        butRemove = new JButton("Remove");
        butEdit = new JButton("Edit");

        table = new JTable();
        table.setFillsViewportHeight(true);
        scroll = new JScrollPane(table);        

        add(lblProd, "wrap");
        add(scroll);
        add(butAdd, "split 3, flowy, top, sgx");
        add(butRemove, "sgx");
        add(butEdit, "sgx");        
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                JFrame frame = new JFrame();
                ProductPanel2 pane = new ProductPanel2();
                frame.setContentPane(pane);
                frame.setSize(350, 250);
                frame.setLocationRelativeTo(null);
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setVisible(true);
            }
        });        

    }
}
  

Ячейка рядом с таблицей разделена на три вложенные ячейки. Три кнопки расположены
вставлено в эти вложенные ячейки. Режим вертикального потока устанавливается с помощью flowy
ограничение. top Ограничение выравнивает кнопки по верхнему краю. Наконец,
sgx ограничение делает кнопку того же размера.

Снимок примера

Комментарии:

1. Взгляните на шпаргалку MigLayout. Там вам объяснены все ограничения. В нем говорится, что «это присваивает компоненту имя группы размеров. Все компоненты, которые имеют общее название группы размеров, получат одинаковый размер границы (минимальный / предпочтительный / максимальный).» Синтаксис является одним из: sg [name], sgx [name], sgy [name]. По умолчанию кнопки имеют одинаковую высоту, поэтому в нашем случае достаточно sgx. В примере представлена только одна группа размеров, поэтому нам не нужно было давать ей имя.