Java Swing BoxLayout: настройка пространства между панелями в многопанельной настройке?

Я пишу это свинг-приложение и использую несколько панелей в формате BoxLayout, но кажется, что пустое пространство между панелями делится между ними, и это выглядит очень некрасиво. Как настроить и настроить расстояние между панелями? Извините, если это репост; Я не смог найти более старый пост.

    import java.awt.*;
import java.awt.datatransfer.Clipboard;
import java.awt.datatransfer.StringSelection;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.*;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;

class gui extends JFrame implements ActionListener{
    JFrame frame = new JFrame("Ark Admin Spawn Commands");
    JPanel panel = new JPanel();
    JComboBox dinos;
    JComboBox corruptedDinos;
    public JSlider dinoLevel;
    JLabel input;
    JLabel dino;
    JLabel title;
    
    
    
    
    
    gui(){
        
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

          JPanel mainPanel = new JPanel();
          mainPanel.setLayout(new BoxLayout(mainPanel, BoxLayout.Y_AXIS));

          JPanel panelOne = new JPanel();
          JPanel panelTwo = new JPanel();
          JPanel panelThree = new JPanel();

          mainPanel.add(panelOne);
          mainPanel.add(panelTwo);
          mainPanel.add(panelThree);
         
        
        
        
        title = new JLabel("Spawning Dinos");
        
        String[] dinoNames= {"The Island:"};
        String[] corruptedDinoNames = {"Extinction:"};
        dinos = new JComboBox(dinoNames);
        corruptedDinos = new JComboBox(corruptedDinoNames);
        dinoLevel = new JSlider(JSlider.HORIZONTAL, 1, 600, 400);
        dinoLevel.setMajorTickSpacing(20);
        dinoLevel.setPaintTicks(true);
        input = new JLabel("Select Level: ");
        event e = new event();
        dinoLevel.addChangeListener(e);
        
        
        dinos.addActionListener(this);
        corruptedDinos.addActionListener(this);
        panelOne.add(title);
        
        panelTwo.add(input);
        panelTwo.add(dinoLevel);
        
        panelThree.add(dinos);
        panelThree.add(corruptedDinos);
        this.getContentPane().add(mainPanel);
        this.setTitle("Ark Admin Spawn Commands");
        this.setSize(600, 600);
        this.setVisible(true);
        
    }
    public static void main (String args[]) {

        new gui();
        
        
    
    
    }
    
    public class event implements ChangeListener{
        
        @Override
        public void stateChanged(ChangeEvent e) {
            int value = dinoLevel.getValue();
            input.setText("Level: " + value);
            
        }
    }
    
    @Override
    public void actionPerformed(ActionEvent arg0) {
        
        
    }
}

person Allen Rhodes    schedule 02.02.2021    source источник
comment
Имена классов ДОЛЖНЫ начинаться с символа верхнего регистра. Все классы в JDK следуют этому соглашению. Учитесь на примере.   -  person camickr    schedule 03.02.2021


Ответы (1)


но кажется, что пустое пространство между панелями делится между ними

Правильный. BoxLayout попытается выделить дополнительное пространство для всех компонентов.

Однако при этом будет соблюдаться максимальный размер каждой панели.

Таким образом, чтобы предотвратить рост высоты панелей, вы можете использовать такой код:

JPanel panelOne = new JPanel()
{
    @Override
    public dimension getMaximumSize()
    {
        Dimension d = getPreferredSize()
        d.width = Integer.MAX_VALUE;

        return d;
    }
};

Или, поскольку менеджер компоновки фрейма по умолчанию — это BorderLayout, вы можете просто использовать:

//this.getContentPane().add(mainPanel);
add(mainPanel, BorderLayout.PAGE_START); // getContentPane() is not needed

PAGE_START в BorderLayout учитывает предпочтительную высоту компонента.

person camickr    schedule 02.02.2021
comment
Вау, вы отлично ответили на мой вопрос! Большое спасибо! - person Allen Rhodes; 03.02.2021