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
相关产品推荐
相关产品推荐

