我正在使用 Swing 和 MVC 模式用 Java 开发 Wordle 游戏。我有一个屏幕键盘和一个文本字段(如屏幕截图所示),我想将文本字段中输入的单词逐个字符输出到 JLabels 中(也就是说,我需要识别每个 JLable)。以下是我将 JLable 添加到框架的方法:
// Controller
JLabel[] worldColumns = new JLabel[5];
for (int i = 0; i < 5; i++) {
JPanel panel = view.getEmptyLabelPannel();
for (int j = 0; j < 5; j++) {
worldColumns[j] = new JLabel();
worldColumns[j].setOpaque(true);
worldColumns[j].setBorder(BorderFactory.createMatteBorder(1, 1, 1, 1, Color.BLACK));
panel.add(worldColumns[j]);
}
view.addPanel(panel, worldColumns, i);
}
}
在视图模块中,我制作了 Jlable 的二维数组:
// view
JLabel[][] panelRowLabelsList = new JLabel[5][5];
还有一个函数可以在所选标签上设置文本:
// view
public void setLabelPanelText(String ch, int i, int j, Color color) {
panelRowLabelsList[i][j].setText(ch);
panelRowLabelsList[i][j].setForeground(color);
}
还有一个 ActionListener,如果按下 ENTER 按钮,它会执行一些操作:
// controller (count = 0 by default)
class EnterButtonListener implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
if (count == 4) {System.out.println("END");}
char[] input = view.getTextFieldText().toCharArray();
if (input.length == 5) {
for (int k = 0; k < 5; k++) {
int i = count;
String ch = Character.toString(input[k]).toUpperCase();
view.setLabelPanelText(ch, i, k, Color.BLACK);
}
count++;
view.setTextFieldText("");
}
}
}
我找到了解决方案:
for (int i = 0; i < 5; i++) {
JLabel[] worldColumns = new JLabel[5];
JPanel panel = view.getEmptyLabelPannel();
for (int j = 0; j < 5; j++) {
worldColumns[j] = new JLabel();
worldColumns[j].setOpaque(true);
worldColumns[j].setBorder(BorderFactory.createMatteBorder(1, 1, 1, 1, Color.BLACK));
panel.add(worldColumns[j]);
}
view.addPanel(panel, worldColumns, i);
}
我们需要在每次迭代中重新创建 worldColumns