You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java Swing开发Wordle:如何逐字符向JLabel填充文本内容

Java Swing Wordle:文本框内容填充到JLabel实现方案

问题背景

我正在用Java Swing开发Wordle游戏,已实现屏幕键盘和文本框,需要将文本框输入内容逐字符、每行5个填充到指定位置的JLabel中。现有添加JLabel的代码如下:

final int FIELD_HEIGHT = 30;
final int FIELD_WIDTH = 30;

int letterR = 0;
for (int i = 0; i < 6; i++) {
    int letterC = 0;
    for (int j = 0; j < 5; j++) {
        JLabel letter = new JLabel();
        letter.setBounds((int) ((frame.getWidth()/2 - 2.5 * (FIELD_WIDTH + 5)) + letterC),
                panel.getHeight() + letterR + 30, FIELD_WIDTH, FIELD_HEIGHT);
        letter.setBorder(BorderFactory.createMatteBorder(1,1,1,1,Color.BLACK));
        panel.add(letter);
        letterC += FIELD_WIDTH + 5;
    }
    letterR += FIELD_HEIGHT + 20;
}

实现步骤

1. 存储JLabel引用以便定位

当前代码创建JLabel后未保存引用,无法后续定位修改。需将JLabel存入二维数组,对应6行5列的Wordle格子:

// 类级别声明二维数组,用于存储所有字母格子JLabel
private JLabel[][] letterLabels = new JLabel[6][5];

// 修改原JLabel创建代码,将实例存入数组
final int FIELD_HEIGHT = 30;
final int FIELD_WIDTH = 30;

int letterR = 0;
for (int i = 0; i < 6; i++) {
    int letterC = 0;
    for (int j = 0; j < 5; j++) {
        JLabel letter = new JLabel();
        letter.setBounds((int) ((frame.getWidth()/2 - 2.5 * (FIELD_WIDTH + 5)) + letterC),
                panel.getHeight() + letterR + 30, FIELD_WIDTH, FIELD_HEIGHT);
        letter.setBorder(BorderFactory.createMatteBorder(1,1,1,1,Color.BLACK));
        // 设置字符居中,提升视觉效果
        letter.setHorizontalAlignment(SwingConstants.CENTER);
        panel.add(letter);
        // 将JLabel存入数组,对应行i列j的位置
        letterLabels[i][j] = letter;
        letterC += FIELD_WIDTH + 5;
    }
    letterR += FIELD_HEIGHT + 20;
}

2. 监听文本框输入,同步填充字符

使用DocumentListener监听文本框内容变化,实时将输入字符填充到对应JLabel中:

// 假设你的文本框实例为inputField
inputField.getDocument().addDocumentListener(new DocumentListener() {
    @Override
    public void insertUpdate(DocumentEvent e) {
        updateLetterDisplay();
    }

    @Override
    public void removeUpdate(DocumentEvent e) {
        updateLetterDisplay();
    }

    @Override
    public void changedUpdate(DocumentEvent e) {
        updateLetterDisplay();
    }

    // 核心更新逻辑
    private void updateLetterDisplay() {
        String inputContent = inputField.getText().toUpperCase(); // 统一转为大写,符合Wordle风格
        int charIndex = 0;
        // 遍历所有格子,逐字符填充
        for (int row = 0; row < 6; row++) {
            for (int col = 0; col < 5; col++) {
                if (charIndex < inputContent.length()) {
                    letterLabels[row][col].setText(String.valueOf(inputContent.charAt(charIndex)));
                } else {
                    letterLabels[row][col].setText(""); // 超出输入长度的格子清空
                }
                charIndex++;
            }
        }
    }
});

3. 可选:限制输入长度(符合Wordle规则)

为避免输入超过6行×5个字符的上限,给文本框添加输入长度限制:

import javax.swing.text.PlainDocument;
import javax.swing.text.AttributeSet;
import javax.swing.text.BadLocationException;

// 设置文本框最多输入30个字符(6×5),且输入自动转大写
inputField.setDocument(new PlainDocument() {
    @Override
    public void insertString(int offs, String str, AttributeSet a) throws BadLocationException {
        if ((getLength() + str.length()) <= 30) {
            super.insertString(offs, str.toUpperCase(), a);
        }
    }
});

内容的提问来源于stack exchange,提问作者metalmouth

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 20:20:55