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

Java Swing平台游戏中JButton调用setVisible(true)仍消失问题求助

问题原因

你遇到的问题根源出在actionPerformed方法的循环逻辑中:你把点击平台的移动操作放在了遍历所有平台的循环体内,导致每遍历一个平台,被点击的目标平台就会被额外下移150像素。
Swing的坐标系以窗口左上角为原点,y轴向下递增,假设你当前已经生成了N个平台,目标平台最终会被下移150*N像素,直接超出了500高度的窗口可视范围,所以即使调用setVisible(true)也看不到它。

修复方案

按以下步骤调整代码即可解决:

  1. 删除遍历平台循环内额外移动点击平台的代码,点击平台本身已经满足parameters[i][1] == y的条件,会在else分支完成下移,不需要重复操作
  2. 遍历平台数组时只遍历已经生成的平台,不需要遍历整个10万长度的空数组,减少无效性能损耗
  3. 删除重复添加监听器的冗余代码,平台创建时已经添加过点击监听器,不需要每次点击重复添加

修复后的核心代码片段

@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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.10 21:54:03