Java Swing平台游戏中JButton调用setVisible(true)仍消失问题求助
问题原因
你遇到的问题根源出在actionPerformed方法的循环逻辑中:你把点击平台的移动操作放在了遍历所有平台的循环体内,导致每遍历一个平台,被点击的目标平台就会被额外下移150像素。
Swing的坐标系以窗口左上角为原点,y轴向下递增,假设你当前已经生成了N个平台,目标平台最终会被下移150*N像素,直接超出了500高度的窗口可视范围,所以即使调用setVisible(true)也看不到它。
修复方案
按以下步骤调整代码即可解决:
- 删除遍历平台循环内额外移动点击平台的代码,点击平台本身已经满足
parameters[i][1] == y的条件,会在else分支完成下移,不需要重复操作 - 遍历平台数组时只遍历已经生成的平台,不需要遍历整个10万长度的空数组,减少无效性能损耗
- 删除重复添加监听器的冗余代码,平台创建时已经添加过点击监听器,不需要每次点击重复添加
修复后的核心代码片段
@Override public void actionPerformed(ActionEvent event) { preClicked = clicked; for(int i = 0; i < platforms.length; i++) { if(event.getSource() == platforms[i]) { clicked = i; break; } } int y = parameters[clicked][1]; // 只遍历已经创建的平台 for(int i = 0; i < platformsMade; i++) { if(platforms[i] == null) { continue; } if(parameters[i][1] > y) { platforms[i].setVisible(false); } else { this.movePlatforms(150, i); } } for(int i = 0; i <= random.nextInt(2); i++) { this.drawPlatform(random.nextInt(500), random.nextInt(500), 50, 50, random.nextInt(4)); } platforms[clicked].setVisible(true); standing = clicked; for(int i = 0; i < platformsMade; i++) { if(platforms[i] == null) { continue; } platforms[i].setText(clicked == i ? "|" : ""); } }
内容的提问来源于stack exchange,提问作者Hera Sutton
相关产品推荐
相关产品推荐

