Java Swing JPanel BorderLayout работает не так, как я ожидал

Прежде всего, я должен сказать, что я начал программировать на Java всего 3 дня назад.

Поэтому, пожалуйста, наберитесь терпения и постарайтесь дать мне подробное объяснение.

Итак, я пытаюсь создать этот демонстрационный графический интерфейс с помощью Swing. Я просто хочу сначала протестировать макет различных компонентов, прежде чем кодировать полный дизайн. Поэтому я написал этот небольшой код, чтобы добавить 3 кнопки в JPanel.

import javax.swing.*;
import java.awt.*;

public class demoGUI_v1{
    JButton button1,button2,button3;
    JFrame frame;
    JPanel panel,panel2;    
    public static void main(String[] args){
        demoGUI_v1 gui = new demoGUI_v1();
        gui.framework();
    }

    public void framework(){
        frame = new JFrame();
        frame.setSize(500,500);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        panel = new JPanel();
        panel2 = new JPanel();
        button1 = new JButton("Button1");
        button2 = new JButton("Button2");
        button3 = new JButton("Button3");
        panel.add(button1);
        panel.add(button2);
        panel.add(button3);
        panel.setLayout(new BoxLayout(panel,BoxLayout.Y_AXIS));
        panel2.add(BorderLayout.CENTER,panel);
        frame.getContentPane().add(panel, BorderLayout.WEST);
        frame.setVisible(true);
    }
}

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


person Pavan Nihal    schedule 27.05.2015    source источник


Ответы (3)


Добавьте немного вертикального клея, чтобы центрировать компоненты по вертикали:

    panel.add(Box.createVerticalGlue());
    panel.add(button1);
    panel.add(button2);
    panel.add(button3);
    panel.add(Box.createVerticalGlue());
person Eric Leibenguth    schedule 27.05.2015

Не имеет прямого отношения к вашему вопросу, но:

frame.getContentPane().add(BorderLayout.WEST,panel);

Не используйте этот формат метода add(...). Как говорит API:

Этот метод устарел с версии 1.1. Вместо этого используйте метод add(Component, Object).

Кроме того, начиная с JDK4, вам не нужно получать панель содержимого. Итак, вы можете использовать:

frame.add(panel, BorderLayout.LINE_START); // preferred over "WEST"

Имена классов должны начинаться с символа верхнего регистра и не должны использовать «_» в имени класса. Опять же, просто посмотрите на API, чтобы увидеть используемые имена классов. Не придумывайте свои собственные условности.

Я бы предположил, что учебник, из которого вы получили исходный код, очень старый. Я бы посоветовал вам начать с использования руководства по Swing для получения примеров и пояснений. Учебное пособие охватывает все менеджеры компоновки и должно помочь объяснить, почему предложение Эрика работает.

person camickr    schedule 27.05.2015

Здесь у вас есть более простой способ добиться того, что вам нужно:

public void framework(){
    frame = new JFrame();
    frame.setSize(500,500);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    panel = new JPanel();
    panel2 = new JPanel();
    button1 = new JButton("Button1");
    button2 = new JButton("Button2");
    button3 = new JButton("Button3");
    panel.add(Box.createVerticalGlue());
    panel.add(button1);
    panel.add(button2);
    panel.add(button3);
    panel.add(Box.createVerticalGlue());
    panel.setLayout(new BoxLayout(panel,BoxLayout.Y_AXIS));
    frame.getContentPane().add(panel, BorderLayout.LINE_START);
    frame.setVisible(true);
}
person Emiliano Schiano    schedule 27.05.2015