Как создать кнопки произвольного размера по оси Y

import java.awt.Color;
import java.awt.Dimension;

import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class Ships {

    public static JPanel init(JPanel radioPanel){
        radioPanel.add(addShips(2));
        radioPanel.add(addShips(3));
        radioPanel.add(addShips(4));
        radioPanel.add(addShips(5));

        return radioPanel;
    }

    public static JButton addShips(int size){
        JButton but = new JButton();
        but.setPreferredSize(new Dimension((40*size),40));
        but.setBackground(Color.BLACK);
        return but;
    }

    public static void main(String[] args){
        JFrame frame = new JFrame();
        frame.setVisible(true);
        JPanel radioPanel = new JPanel();
        radioPanel.setLayout(new BoxLayout(radioPanel, BoxLayout.Y_AXIS)); \\line 4
        init(radioPanel);
        frame.getContentPane().add(radioPanel);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.pack();
    }

}

Я вижу, что кнопки расположены в одну строку. Нужно расположить кнопки одну за другой согласно BoxLayout.Y_AXIS, Когда я удаляю // строку 4, она создается правильно в соответствии с FlowLayout.

2 ответа

Решение

Попробуй это:

import java.awt.Color;
import java.awt.Dimension;

import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class Ships {

    public static JPanel init(JPanel radioPanel){
        radioPanel.add(addShips(2));
        radioPanel.add(addShips(3));
        radioPanel.add(addShips(4));
        radioPanel.add(addShips(5));

        return radioPanel;
    }

    public static JButton addShips(int size){
        JButton but = new JButton();
        Dimension d = new Dimension((40*size),40);
        but.setPreferredSize(d);
        but.setMinimumSize(d);
        but.setMaximumSize(d);
        but.setBackground(Color.BLACK);
        return but;
    }

    public static void main(String[] args){
        JFrame frame = new JFrame();
        JPanel radioPanel = new JPanel();
        radioPanel.setLayout(new BoxLayout(radioPanel, BoxLayout.Y_AXIS)); //line 4
        init(radioPanel);
        frame.getContentPane().add(radioPanel);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.pack();
        frame.setVisible(true);
    }
}

Когда вы упаковываете компоненты в JFrameВаш менеджер компоновки может не соответствовать предпочтительному размеру компонентов, попробуйте также установить минимальный и максимальный размеры.

В вертикальной компоновке (ось Y) BoxLayout пытается сделать все компоненты более широкими в качестве самого широкого компонента. Поскольку во всех кнопках нет текста или значка, кнопка будет уменьшена до размера по умолчанию, и все будут иметь одинаковую ширину. Так что указывайте расположение ящиков для определенных размеров, используя максимальные и минимальные размеры.

Я изменил ваш LayoutManager на GridBagLayout, и он работает нормально. Это подходит для вас?:

public class Ships {

public static JPanel init(JPanel radioPanel){
    GridBagConstraints c = new GridBagConstraints();
    c.anchor = GridBagConstraints.WEST;
    radioPanel.add(addShips(2),c);
    c.gridy = 1;
    radioPanel.add(addShips(6),c);
    c.gridy = 2;
    radioPanel.add(addShips(4),c);
    c.gridy = 3;
    radioPanel.add(addShips(5),c);

    return radioPanel;
}

public static JButton addShips(int size){
    JButton but = new JButton();
    but.setPreferredSize(new Dimension((40*size),40));
    but.setBackground(Color.BLACK);
    return but;
}

public static void main(String[] args){
    JFrame frame = new JFrame();
    frame.setVisible(true);
    JPanel radioPanel = new JPanel();
    radioPanel.setLayout(new GridBagLayout()); 
    init(radioPanel);
    frame.getContentPane().add(radioPanel);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.pack();
}

}

РЕДАКТИРОВАТЬ: изменить горизонтальное на вертикальное выравнивание. Результат:

введите описание изображения здесь

Другие вопросы по тегам