java - 创建 JButton 的行和列

标签 java swing button layout-manager

我的任务是创建 3 组座位,每组有 3 行 10 列的座位。首先,我为三组分别创建了一个座位,现在我尝试使用布局管理器以 3x10 样式显示座位(JButtons)。这是我的代码:

public class ConcertPanel extends JPanel
{
    private JPanel Panel1;
    private JButton goldSeat;
    private JButton silverSeat;
    private JButton bronzeSeat;


   ConcertPanel()
   {   
        Panel1 = new JPanel();
        Panel1.setSize(500,500);

                setLayout(new GridLayout(rows, cols));
                for(int i = 0; i < rows; i++)
                for(int j = 0; j < cols; j++)
            {
                goldSeat = new JButton();
                silverSeat = new JButton();
                bronzeSeat = new JButton();
                add(new JButton());
            }
                this.add(Panel1);

       }
}

此刻我在 jpanel 中只有 30 个按钮,它们不在行或列中?帮助:(

最佳答案

请再看一下 GridLayout tutorial :

  • 您想为容器设置一次 GridLayout。
  • 在使用 GridLayout 添加时,您添加的组件 (JButton) 没有第二个参数。
  • 如果布局应为 3 x 10,您需要向该容器中添加 30 个组件。
  • 您正在向使用 GridLayout 的 JPanel 添加另一个 JPanel,panel1,它将成为网格的一部分。看起来你不想这样做。

例如:

Example GUI

import java.awt.GridLayout;

import javax.swing.*;

public class GridLayoutEg extends JPanel {
    private static final int ROWS = 3;
    private static final int COLS = 10;

    public GridLayoutEg() {
        setLayout(new GridLayout(ROWS, COLS)); // set JPanel's layout
        for (int i = 0; i < ROWS; i++) {
            for (int j = 0; j < COLS; j++) {
                String text = String.format("[%d, %d]", j + 1, i + 1);
                add(new JButton(text)); // add component w/o 2nd parameter
            }
        }
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> createAndShowGui());
    }

    private static void createAndShowGui() {
        GridLayoutEg mainPanel = new GridLayoutEg();
        JFrame frame = new JFrame("GridLayoutEg");
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        frame.add(mainPanel);
        frame.pack();
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
    }
}

编辑

请参阅有关此代码问题的评论:

    for (int i = 0; i < rows; i++)
        for (int j = 0; j < cols; j++) {
            goldSeat = new JButton();   // button created but never added
            silverSeat = new JButton(); // button created but never added
            bronzeSeat = new JButton(); // button created but never added
            add(new JButton()); // only button added
        }
    this.add(Panel1); // this throws off the whole GridLayout since it's added to the grid

因此,在我们嵌套的 for 循环中,您创建了 3 个 JButton,但由于它们从未添加到 GUI,因此它们没有任何用处,实际上将被垃圾收集,除了最后创建的 3 个。然后您创建一个按钮并添加它。最后,您创建了一个 JPanel,但将其添加到 GridLayout-using JPanel,这将关闭网格。


从这段代码中获得更多乐趣:

import java.awt.Color;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;

import javax.swing.*;
import javax.swing.border.BevelBorder;
import javax.swing.border.Border;

public class GridLayoutEg extends JPanel {
    private static final long serialVersionUID = 1L;
    private static final int ROWS = 3;
    private static final int COLS = 10;

    public GridLayoutEg() {
        int gap = 1;
        int gap2 = 2;
        setBorder(BorderFactory.createEmptyBorder(gap2, gap2, gap2, gap2));
        setLayout(new GridLayout(ROWS, COLS, gap, gap)); // set JPanel's layout
        for (int row = 0; row < ROWS; row++) {
            for (int col = 0; col < COLS; col++) {
                JButton button = createSeat(row, col);
                add(button); // add component w/o a 2nd parameter
            }
        }
    }

    private JButton createSeat(int row, int col) {
        SeatColor seatColor = SeatColor.values()[row];
        SeatAction seatAction = new SeatAction(seatColor, col);
        JButton button = new JButton(seatAction);
        button.setBackground(seatColor.getColor());
        int topGap = 8;
        int sideGap = 25;
        Border innerBorder = BorderFactory.createEmptyBorder(topGap, sideGap, topGap, sideGap);
        Border outerBorder = BorderFactory.createBevelBorder(BevelBorder.RAISED, seatColor.getColor().brighter(),
                seatColor.getColor().darker());
        Border border = BorderFactory.createCompoundBorder(outerBorder, innerBorder);
        button.setBorder(border);
        return button;
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> createAndShowGui());
    }

    private static void createAndShowGui() {
        GridLayoutEg mainPanel = new GridLayoutEg();
        JFrame frame = new JFrame("GridLayoutEg");
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        frame.add(mainPanel);
        frame.pack();
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
    }
}

class SeatAction extends AbstractAction {
    private static final long serialVersionUID = 1L;
    private SeatColor seatColor;
    private int column;

    public SeatAction(SeatColor seatColor, int column) {
        super(String.format("[%d]", column));
        this.seatColor = seatColor;
        this.column = column;
        // putValue(LARGE_ICON_KEY, createIcon(seatColor, column));
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        AbstractButton btn = (AbstractButton) e.getSource();
        btn.setBackground(seatColor.getColor().brighter());
        setEnabled(false);

        String text = String.format("Selected Seat Color: %s; Column: %d", seatColor, column);
        System.out.println(text );
    }
}

enum SeatColor {
    GOLD("Gold", new Color(255, 215, 0)), 
    SILVER("Silver", new Color(192, 192, 192)), 
    BRONZE("Bronze", new Color(205, 127, 50));

    private String text;
    private Color color;

    private SeatColor(String text, Color color) {
        this.text = text;
        this.color = color;
    }

    public String getText() {
        return text;
    }

    public Color getColor() {
        return color;
    }

    @Override
    public String toString() {
        return getText();
    }

}

关于java - 创建 JButton 的行和列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40812655/

相关文章:

java - 如何向 GWT 的 SERVER 端添加异常处理程序?

java - 如何在jDisktopPane中显示JinternalFrame,但该DisktopPane包含GridLayout?

java - 如何通过按钮改变TextView的字体大小?

button - 如何左对齐 Angular Material 拉伸(stretch) md 按钮中的文本?

Java JSTL 拆分函数正则表达式

java - 需要一个具有自定义标签和过滤功能的良好日志库

java - 使用 maven-dependency-plugin 运行具有 eclipse swt 依赖项的 java jar

java - 突出显示 JTextField 中的文本,但仅在按 Tab 键时突出显示

Java Swing 应用程序重复 session

java - Android 调试器无法连接