Java Swing MVC开发Wordle:JLabel二维数组仅最后一行更新问题排查
问题根源与修复方案
问题根源
你遇到的问题核心是复用了同一个JLabel数组对象,导致View的二维标签数组所有行都指向最后一行的标签:
- Controller中
worldColumns数组在外层循环外定义,5次创建行的循环里,每次仅覆盖数组元素,数组本身的引用未改变。 - 调用
view.addPanel(panel, worldColumns, i)时,每次传入的都是同一个数组引用,最终panelRowLabelsList的5行都指向这个数组,而数组最后留存的是第五次循环创建的JLabel。 - 触发ENTER按钮时,不管
count是0到4,实际操作的都是这个数组里的元素(即最后一行的JLabel),所以只有底部行能更新。
修复方案
步骤1:修改Controller的数组创建逻辑
把JLabel[] worldColumns = new JLabel[5];移到外层循环内部,每次创建新行时生成独立数组:
// Controller 修改后代码 for (int i = 0; i < 5; i++) { JPanel panel = view.getEmptyLabelPannel(); // 每次循环新建独立的JLabel数组,避免复用引用 JLabel[] worldColumns = new JLabel[5]; 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); }
步骤2:确保View的addPanel方法正确赋值
确认View中的addPanel方法将传入的数组赋值到二维数组对应行,示例实现如下:
// View 的 addPanel 方法 public void addPanel(JPanel panel, JLabel[] labels, int rowIndex) { // 这里添加panel到界面容器的逻辑(比如this.add(panel)等) // 将当前行的标签数组存入二维数组 panelRowLabelsList[rowIndex] = labels; }
修改后,panelRowLabelsList的每一行都会对应独立的JLabel数组,触发ENTER按钮时就能正确更新对应行的标签。
内容的提问来源于stack exchange,提问作者metalmouth
相关产品推荐
相关产品推荐

