Как конденсировать BoxLayout в Java
Я использую вертикальный BoxLayout для панели, которая вложена в некоторые другие панели. Размер других панелей приводит к тому, что объекты на моей целевой панели растекаются неприглядным образом. Как сделать так, чтобы панель отображала объекты сверху донизу без особого заполнения?
Ниже приведен аналогичный код, хотя он создает вращающиеся элементы, которые заполняют всю панель, вместо обычных вращающихся элементов, расположенных очень далеко друг от друга
import java.awt.Dimension;
import javax.swing.BoxLayout;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JSpinner;
import javax.swing.SpinnerNumberModel;
public class PanelTest {
public static void main(String[] args){
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JPanel mainPanel = new JPanel();
mainPanel.setLayout(new BoxLayout(mainPanel, BoxLayout.X_AXIS));
JPanel leftPanel = new JPanel();
leftPanel.setLayout(new BoxLayout(leftPanel, BoxLayout.Y_AXIS));
JPanel spinPanel1 = new JPanel();
spinPanel1.setLayout(new BoxLayout(spinPanel1, BoxLayout.X_AXIS));
spinPanel1.add(new JLabel("top"));
SpinnerNumberModel spinMod1 = new SpinnerNumberModel(0,0,10,1);
spinPanel1.add(new JSpinner(spinMod1));
leftPanel.add(spinPanel1);
JPanel spinPanel2 = new JPanel();
spinPanel2.setLayout(new BoxLayout(spinPanel2, BoxLayout.X_AXIS));
spinPanel2.add(new JLabel("bottom"));
SpinnerNumberModel spinMod2 = new SpinnerNumberModel(0,0,10,1);
spinPanel2.add(new JSpinner(spinMod2));
leftPanel.add(spinPanel2);
JPanel rightPanel = new JPanel();
rightPanel.setPreferredSize(new Dimension(800,600));
mainPanel.add(leftPanel);
mainPanel.add(rightPanel);
frame.getContentPane().add(mainPanel);
frame.pack();
frame.setVisible(true);
}
}
1 ответ
Есть много способов сделать это, в основном, добавив панель с макетом (constraint /), который будет соответствовать предпочтительному размеру. В этом случае мы используем GridBagLayout
с ограничениями по умолчанию. Компонент (leftPanel
) добавлен к нему, центрирован в пределах доступного пространства.
Каждая панель имеет цветную рамку, чтобы сделать ее более заметной. Это удобный визуальный метод, который можно использовать при отладке проблем компоновки компоновки.
В сторону, я думаю, leftPanel
выглядит многолюдно, а неприспособленные блесны еще больше ухудшают внешний вид. Я бы, наверное, использовал GridBagLayout
для надписей и текстовых полей (все на одной панели) с некоторыми отступами и надписями по правому краю.
import java.awt.*;
import javax.swing.*;
import javax.swing.border.*;
public class PanelTest {
public static void main(String[] args) {
// any single component added to this will be centered & have
// its preferred size honored.
JPanel constrainSpinnerPanel = new JPanel(new GridBagLayout());
constrainSpinnerPanel.setBorder(new LineBorder(Color.CYAN, 4));
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JPanel mainPanel = new JPanel();
mainPanel.setBorder(new LineBorder(Color.RED,4));
mainPanel.setLayout(new BoxLayout(mainPanel, BoxLayout.X_AXIS));
JPanel leftPanel = new JPanel();
leftPanel.setBorder(new LineBorder(Color.BLUE,4));
leftPanel.setLayout(new BoxLayout(leftPanel, BoxLayout.Y_AXIS));
JPanel spinPanel1 = new JPanel();
spinPanel1.setLayout(new BoxLayout(spinPanel1, BoxLayout.X_AXIS));
spinPanel1.add(new JLabel("top"));
SpinnerNumberModel spinMod1 = new SpinnerNumberModel(0, 0, 10, 1);
spinPanel1.add(new JSpinner(spinMod1));
leftPanel.add(spinPanel1);
JPanel spinPanel2 = new JPanel();
spinPanel2.setLayout(new BoxLayout(spinPanel2, BoxLayout.X_AXIS));
spinPanel2.add(new JLabel("bottom"));
SpinnerNumberModel spinMod2 = new SpinnerNumberModel(0, 0, 10, 1);
spinPanel2.add(new JSpinner(spinMod2));
leftPanel.add(spinPanel2);
JPanel rightPanel = new JPanel();
rightPanel.setBorder(new LineBorder(Color.GREEN, 4));
rightPanel.setPreferredSize(new Dimension(400, 100));
constrainSpinnerPanel.add(leftPanel);
mainPanel.add(constrainSpinnerPanel);
//mainPanel.add(leftPanel);
mainPanel.add(rightPanel);
frame.getContentPane().add(mainPanel);
frame.pack();
frame.setVisible(true);
}
}