Я пытаюсь создать панель настроек и хочу видеть, какие настройки принадлежат какому тексту. Поэтому я помещаю каждый jlabel с jcheckbox или jspinner в jpanel, а затем добавляю их в jpanels столбца. У меня есть 4 колонки jpanels, которые находятся рядом друг с другом. На прикрепленных изображениях вы можете увидеть 2 разных размера ширины. Я хочу, чтобы красные области были статичными, а синие области изменялись в размерах, потому что таким образом вы можете видеть, к какому jlabel относится какой параметр.
Здесь у меня есть SSCCE
import javax.swing.*;
import java.awt.*;
public class SSCCE {
public static void main(String[] args) {
SwingUtilities.invokeLater(() -> {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException e) {
e.printStackTrace();
}
JFrame jFrame = new JFrame();
jFrame.setMinimumSize(new Dimension(580, 113));
jFrame.add(new SettingsPanel());
jFrame.pack();
jFrame.setLocationRelativeTo(null);
jFrame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
jFrame.setVisible(true);
});
}
public static class Setting extends JPanel {
public String name;
public JComponent component;
public Setting(String name, JComponent component) {
this.name = name;
this.component = component;
setLayout(new BorderLayout());
add(new JLabel(name), BorderLayout.LINE_START);
add(component, BorderLayout.LINE_END);
}
}
private static class SettingsPanel extends JPanel {
public SettingsPanel() {
setLayout(new BoxLayout(this, BoxLayout.LINE_AXIS));
JPanel subPanel = new JPanel(new GridLayout(0, 1));
subPanel.add(new Setting("Amount of faces", new JSpinner()));
subPanel.add(new Setting("Amount of vertices", new JSpinner()));
subPanel.add(new Setting("Amount of textured faces", new JSpinner()));
add(subPanel);
add(Box.createHorizontalGlue());
subPanel = new JPanel(new GridLayout(0, 1));
subPanel.add(new Setting("Textures", new JCheckBox()));
subPanel.add(new Setting("Priorities", new JCheckBox()));
subPanel.add(new Setting("Alpha", new JCheckBox()));
add(subPanel);
add(Box.createHorizontalGlue());
subPanel = new JPanel(new GridLayout(0, 1));
subPanel.add(new Setting("TSkins", new JCheckBox()));
subPanel.add(new Setting("VSkins", new JCheckBox()));
subPanel.add(new Setting("X data", new JSpinner()));
add(subPanel);
add(Box.createHorizontalGlue());
subPanel = new JPanel(new GridLayout(0, 1));
subPanel.add(new Setting("Y data", new JSpinner()));
subPanel.add(new Setting("Z data", new JSpinner()));
subPanel.add(new Setting("Triangle data", new JSpinner()));
add(subPanel);
setBorder(BorderFactory.createMatteBorder(0, 0, 1, 0, Color.BLACK));
}
}
}
EDIT
Я применил ответ Камикра, и это был результат
Как вы можете видеть, jspinners и jcheckboxes больше не находятся в очереди и выглядят немного грязно, но способ, которым он изменяет размеры, - это функциональность, которую я хочу. Вот обновленный SSCCE с ответом Camickr
import javax.swing.*;
import java.awt.*;
public class SSCCE {
public static void main(String[] args) {
SwingUtilities.invokeLater(() -> {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException e) {
e.printStackTrace();
}
JFrame jFrame = new JFrame();
jFrame.setMinimumSize(new Dimension(580, 113));
jFrame.add(new SettingsPanel());
jFrame.pack();
jFrame.setLocationRelativeTo(null);
jFrame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
jFrame.setVisible(true);
});
}
public static class Setting extends JPanel {
public String name;
public JComponent component;
public Setting(String name, JComponent component) {
this.name = name;
this.component = component;
setLayout(new BoxLayout(this, BoxLayout.LINE_AXIS));
add(new JLabel(name), BorderLayout.LINE_START);
add(Box.createRigidArea(new Dimension(50, 0)));
add(component, BorderLayout.LINE_END);
}
}
private static class SettingsPanel extends JPanel {
public SettingsPanel() {
setLayout(new BoxLayout(this, BoxLayout.LINE_AXIS));
JPanel subPanel = new JPanel(new GridLayout(0, 1));
subPanel.add(new Setting("Amount of faces", new JSpinner()));
subPanel.add(new Setting("Amount of vertices", new JSpinner()));
subPanel.add(new Setting("Amount of textured faces", new JSpinner()));
add(subPanel);
add(Box.createHorizontalGlue());
subPanel = new JPanel(new GridLayout(0, 1));
subPanel.add(new Setting("Textures", new JCheckBox()));
subPanel.add(new Setting("Priorities", new JCheckBox()));
subPanel.add(new Setting("Alpha", new JCheckBox()));
add(subPanel);
add(Box.createHorizontalGlue());
subPanel = new JPanel(new GridLayout(0, 1));
subPanel.add(new Setting("TSkins", new JCheckBox()));
subPanel.add(new Setting("VSkins", new JCheckBox()));
subPanel.add(new Setting("X data", new JSpinner()));
add(subPanel);
add(Box.createHorizontalGlue());
subPanel = new JPanel(new GridLayout(0, 1));
subPanel.add(new Setting("Y data", new JSpinner()));
subPanel.add(new Setting("Z data", new JSpinner()));
subPanel.add(new Setting("Triangle data", new JSpinner()));
add(subPanel);
setBorder(BorderFactory.createMatteBorder(0, 0, 1, 0, Color.BLACK));
}
}
}