java - 显示 JLabel 矩阵

标签 java swing jlabel

有人可以告诉我为什么在调用方法 getContentPane().add(grid[i][j]) 后我无法显示 JLabels 矩阵。仅显示一个“e”标签。

公共(public)类 SudokuFrame 扩展 JFrame 实现 ActionListener {

JButton generateButton;
JLabel[][] grid;

public SudokuFrame(){
    setSize(300, 300);
    setTitle("Sudoku");
    setLayout(null);
    generateButton = new JButton("Generate");
    generateButton.setBounds(90, 220, 100, 30);
    add(generateButton);
    generateButton.addActionListener(this);

    grid = new JLabel[9][9];
    for (int i = 0; i < 9; i++) {
        for (int j = 0; j < 9; j++) {
            grid[i][j] = new JLabel("e");
            grid[i][j].setBounds(100, 100, 30, 30);
            getContentPane().add(grid[i][j]);
        }
    }
}

public static void main(String[] args){
    SudokuFrame frame = new SudokuFrame();
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setVisible(true);
}

最佳答案

您为每个 JLabel 指定了完全相同的边界——相同的大小和相同的位置,因此每个新标签都恰好放置在之前添加的标签之上。

解决方案:不要使用空布局。当问题完全适合 GridLayout 时为什么要使用它?一般来说,您希望避免使用 null 布局和 setBounds,因为布局管理器将使您的编码和 GUI 更易于管理。让布局为您完成繁重的工作。

例如,

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Font;
import java.awt.GridLayout;
import javax.swing.*;

public class SimpleSudoku extends JPanel {
    private static final int GAP = 1;
    private static final Font LABEL_FONT = new Font(Font.DIALOG, Font.PLAIN, 24);
    private JLabel[][] grid = new JLabel[9][9];

    public SimpleSudoku() {
        JPanel sudokuPanel = new JPanel(new GridLayout(9, 9, GAP, GAP));
        sudokuPanel.setBorder(BorderFactory.createEmptyBorder(GAP, GAP, GAP, GAP));
        sudokuPanel.setBackground(Color.BLACK);
        for (int row = 0; row < grid.length; row++) {
            for (int col = 0; col < grid[row].length; col++) {
                grid[row][col] = new JLabel("     ", SwingConstants.CENTER);
                grid[row][col].setFont(LABEL_FONT); // make it big
                grid[row][col].setOpaque(true);
                grid[row][col].setBackground(Color.WHITE);
                sudokuPanel.add(grid[row][col]);
            }
        }

        JPanel bottomPanel = new JPanel();
        bottomPanel.add(new JButton("Regenerate"));

        setLayout(new BorderLayout());
        add(sudokuPanel, BorderLayout.CENTER);
        add(bottomPanel, BorderLayout.PAGE_END);
    }

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

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

关于java - 显示 JLabel 矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36681289/

相关文章:

java - JFrame 在滚动面板中显示标签

java - 如何以编程方式获取 JBoss 中所有注册 DS 名称(对象)的列表?

java - WebSockets 请求中请求的资源上不存在 'Access-Control-Allow-Origin' header

java - PowerMock - 禁止构造函数但设置私有(private)最终字段

java - 如何在JTree中以相同的长度显示所有String elementName?

java - 我的 jComboBox 不对我的 keyListener 使用react,并且 actionPerform 执行奇怪的操作

java - 使用 for 循环更改 JLabel 文本

java - 修改 JFrame 中的 JLabel 元素组

java - 使用Tomcat登录localhost后无法登录MySQL服务器

java - 为什么按钮在流布局上会离开屏幕?