Как выровнять JButtons, используя 2 объекта JPanel, чтобы сформировать базовый графический интерфейс Java - PullRequest
1 голос
/ 29 мая 2019

Я пытаюсь воссоздать следующий, чрезвычайно простой графический интерфейс, видимый здесь: basic GUI example

Мой вывод выглядит следующим образом:

flawed output

У меня проблемы с форматированием кнопок J. Во-первых, независимо от того, что я делаю, я не могу получить вторую панель, «shapePane», чтобы отображать под первой панелью «colorPane», во-вторых, я не могу правильно сделать ось Y кнопок больше, чтобы сделать их толще. внешний вид. Кроме того, верхняя панель shapePane, кажется, динамически перемещается при изменении размера окна, тогда как вторая colorPane остается в фиксированном положении независимо от изменения размера окна.

Если бы кто-то мог оказать небольшую помощь, я был бы безмерно благодарен

мой код пока выглядит следующим образом:

import java.util.*;
import javax.swing.*;
import javax.swing.border.*;
import java.awt.*;
import java.awt.event.*;

public class GUI extends JFrame implements ActionListener, WindowListener
{
private JButton circleButton;
private JButton rectangleButton;
private JButton redButton;
private JButton greenButton;
private JButton blueButton;
private JButton exitButton;
private JTextField textField1;
private JLabel label1;
private JPanel contentPane;
private JPanel colorPane;
private JPanel shapePane;
private JFrame contentFrame;
private int count;

public GUI (String title)
{
    super(title);

    //setResizable(false);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    //setBounds(100, 100, 945, 580);

    //contentFrame = new JFrame();
    //contentPane = new JPanel();
    //contentFrame.add(contentPane);
    //contentPane.setBorder(new LineBorder(new Color(50, 5, 232), 4, true));

    //setContentPane(contentPane);
    //contentPane.setLayout(null);

    colorPane = new JPanel();
    //colorPane.setBorder(new LineBorder(new Color(34, 174, 82), 1, true));
    colorPane.setBounds(10, 32, 515, 125);

    //contentPane.add(colorPane);
    //colorPane.setLayout(null);


    shapePane = new JPanel();
    shapePane.setBounds(10, 165, 515, 315);
    //shapePane.setBorder(new LineBorder(new Color(34, 174, 82), 1, true));

    //contentPane.add(shapePane);
    //shapePane.setLayout(null);


    circleButton = new JButton("Circle");
    circleButton.setHorizontalAlignment(SwingConstants.LEFT);
    rectangleButton = new JButton("Rectangle");
    rectangleButton.setHorizontalAlignment(SwingConstants.LEFT);
    greenButton = new JButton("Green");
    redButton = new JButton("Red");
    blueButton = new JButton("Blue");
    exitButton = new JButton("Exit");
    textField1 = new JTextField(20);
    label1 = new JLabel("current time here");


    colorPane.add(redButton, BorderLayout.CENTER);
    colorPane.add(greenButton, BorderLayout.CENTER);
    colorPane.add(blueButton, BorderLayout.CENTER);


    shapePane.add(rectangleButton, BorderLayout.SOUTH);
    shapePane.add(circleButton, BorderLayout.SOUTH);
    shapePane.add(exitButton, BorderLayout.SOUTH);

    getContentPane().add(textField1, BorderLayout.EAST);
    getContentPane().add(label1, BorderLayout.WEST);



    getContentPane().add(colorPane, BorderLayout.CENTER);
    //contentFrame.add(colorPane);
    getContentPane().add(shapePane, BorderLayout.CENTER);
    //contentFrame.add(shapePane);
}

@Override
public void windowOpened(WindowEvent e) {
    // TODO Auto-generated method stub

}

@Override
public void windowClosing(WindowEvent e) 
{
    System.exit(0);

}

@Override
public void windowClosed(WindowEvent e) {
    // TODO Auto-generated method stub

}

@Override
public void windowIconified(WindowEvent e) {
    // TODO Auto-generated method stub

}

@Override
public void windowDeiconified(WindowEvent e) {
    // TODO Auto-generated method stub

}

@Override
public void windowActivated(WindowEvent e) {
    // TODO Auto-generated method stub

}

@Override
public void windowDeactivated(WindowEvent e) {
    // TODO Auto-generated method stub

}

@Override
public void actionPerformed(ActionEvent e) {
    // TODO Auto-generated method stub

}

}

1 Ответ

1 голос
/ 29 мая 2019

Следующее должно помочь вам начать:

Установите вертикальное и горизонтальное положение этикетки так, чтобы оно отображалось слева внизу, и его желаемую ширину.Для большей гибкости макета рассмотрите деформацию в JPanel:

    label1 = new JLabel("current time here");
    label1.setVerticalAlignment(SwingConstants.BOTTOM);
    label1.setHorizontalAlignment(SwingConstants.LEFT);
    label1.setPreferredSize(new Dimension(200, 0)); //height is set by the layout manger
    getContentPane().add(label1, BorderLayout.WEST);

. Используйте GridLayout для панели кнопок:

    colorPane = new JPanel();
    colorPane.setLayout(new GridLayout(2, 3));

Инициализируйте кнопки и добавьте их одну за другой в сетку.панель:

    redButton = makeButton("Red");
    colorPane.add(redButton);

Где makeButton - метод, реализованный во избежание дублирования кода:

private JButton makeButton(String text) {
    JButton b = new JButton(text);
    b.setHorizontalAlignment(SwingConstants.LEFT);
    b.addActionListener(this);
    b.setPreferredSize(new Dimension(125, 55)); //set preferred and let Layout manager do its work
    return b;
}

Укажите количество столбцов в текстовой области.Его высота задается менеджером макета:

textArea = new JTextArea(0,20);
getContentPane().add(textArea, BorderLayout.EAST);

Собираем все вместе:

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextArea;
import javax.swing.SwingConstants;

public class GUI extends JFrame implements ActionListener
{
    private final JButton circleButton, rectangleButton, redButton;
    private final JButton greenButton, blueButton, exitButton;
    private final JTextArea textArea;
    private final JLabel label1;
    private final JPanel colorPane;

    private static final int ROWS = 2, COLS = 3;

    public GUI (String title)
    {
        super(title);

        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        //set label's vertical and horizontal position so it appears in the bottom left
        //and and its desired width
        //for more layout flexibility consider warping it in a JFrame
        label1 = new JLabel("current time here");
        label1.setVerticalAlignment(SwingConstants.BOTTOM);
        label1.setHorizontalAlignment(SwingConstants.LEFT);
        label1.setPreferredSize(new Dimension(200, 0)); //height is set by the layout manger
        getContentPane().add(label1, BorderLayout.WEST);

        //use a GridLayout for the buttons pane
        colorPane = new JPanel();
        colorPane.setLayout(new GridLayout(ROWS, COLS));
        getContentPane().add(colorPane, BorderLayout.CENTER);//each BorderLayout position can hold ONE component

        redButton = makeButton("Red");
        colorPane.add(redButton);
        greenButton = makeButton("Green");
        colorPane.add(greenButton);
        blueButton = makeButton("Blue");
        colorPane.add(blueButton);
        rectangleButton = makeButton("Rectangle");
        colorPane.add(rectangleButton);
        circleButton = makeButton("Circle");
        colorPane.add(circleButton);
        exitButton = makeButton("Exit");
        colorPane.add(exitButton);

        //set the text area number of columns. Its height is set by the layout manger
        textArea = new JTextArea(0,20);
        getContentPane().add(textArea, BorderLayout.EAST);

        pack();
    }

    private JButton makeButton(String text) {
        JButton b = new JButton(text);
        b.setHorizontalAlignment(SwingConstants.LEFT);
        b.addActionListener(this);
        b.setPreferredSize(new Dimension(125, 55)); //set preferred and let Layout manager do its work
        return b;
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        System.out.println(((JButton)e.getSource()).getText()+ " button pressed");
    }

    public static void main(String[] args) {
        new GUI("My Gui").setVisible(true);
    }
}


Простым усовершенствованием может быть сохранение всех ссылок на кнопки в Map:
public class GUI extends JFrame implements ActionListener
{
    private Map <String, JButton> buttons; // a map to hold references to all buttons 
    private final JTextArea textArea;
    private final JLabel label1;
    private final JPanel colorPane;

    private static final int ROWS = 2, COLS = 3;
    private static final String[] BUTTON_LABELS = {"Red","Green", "Blue", "Rectangle", "Circle", "Exit"};

    public GUI (String title)
    {
        super(title);
        buttons = new HashMap<>();
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        //set label's vertical and horizontal position so it appears in the bottom left
        //and and its desired width
        //for more layout flexibility consider warping it in a JFrame
        label1 = new JLabel("current time here");
        label1.setVerticalAlignment(SwingConstants.BOTTOM);
        label1.setHorizontalAlignment(SwingConstants.LEFT);
        label1.setPreferredSize(new Dimension(200, 0)); //height is set by the layout manger
        getContentPane().add(label1, BorderLayout.WEST);

        //use a GridLayout for the buttons pane
        colorPane = new JPanel();
        colorPane.setLayout(new GridLayout(ROWS, COLS));
        getContentPane().add(colorPane, BorderLayout.CENTER);//each BorderLayout position can hold ONE component

        for(String text : BUTTON_LABELS){
            JButton button = makeButton(text);
            colorPane.add(button);
            buttons.put(text, button);
        }

        //set the text area number of columns. Its height is set by the layout manger
        textArea = new JTextArea(0,20);
        getContentPane().add(textArea, BorderLayout.EAST);

        pack();
    }

    private JButton makeButton(String text) {
        JButton b = new JButton(text);
        b.setHorizontalAlignment(SwingConstants.LEFT);
        b.addActionListener(this);
        b.setPreferredSize(new Dimension(125, 55)); //set preferred and let Layout manager do its work
        return b;
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        System.out.println(((JButton)e.getSource()).getText()+ " button pressed");
    }

    public static void main(String[] args) {
        new GUI("My Gui").setVisible(true);
    }
}

enter image description here

...