为了账号安全,请及时绑定邮箱和手机立即绑定

如何使用 2 个 JPanel 对象对齐 JButtons 以形成基本的 Java GUI

如何使用 2 个 JPanel 对象对齐 JButtons 以形成基本的 Java GUI

子衿沉夜 2022-12-21 12:43:10
我正在尝试重新创建以下非常基本的 GUI:我的输出如下:我很难格式化 JButtons。首先,无论我做什么,我都无法让第二个面板“shapePane”显示在第一个面板“colorPane”下方,其次,我无法正确地使按钮的 y 轴变大以使它们更胖外貌。此外,顶部面板“shapePane”似乎随着窗口大小的调整而动态移动,而第二个“colorPane”无论窗口大小如何调整都保持在固定位置。如果有人可以提供一些帮助,我将不胜感激
查看完整描述

1 回答

?
繁星淼淼

TA贡献1775条经验 获得超11个赞

以下应该让你开始:


设置标签的垂直和水平位置,使其显示在左下角及其所需的宽度。为了获得更大的布局灵活性,请考虑将其变形为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);

    }

}

//img1.sycdn.imooc.com//63a28f130001ebb608780237.jpg

查看完整回答
反对 回复 2022-12-21
  • 1 回答
  • 0 关注
  • 69 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信