Как создать кнопки произвольного размера по оси 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();
}
}
РЕДАКТИРОВАТЬ: изменить горизонтальное на вертикальное выравнивание. Результат: