当前位置: 首页 > 知识库问答 >
问题:

带有自定义按钮的Java摇摆虫

汲丰茂
2023-03-14

在创建自定义JButton(即图像)时遇到问题。我使用普通的JButton(就像第2行的注释中那样)进行所有操作,这样我就不必获得输入流,并且启动按钮时有一个图标。我遇到的麻烦是,当我按下“重放”按钮(再次播放)时,窗口关闭,只有一个窗口应该弹出(就像“普通”JButton发生的那样),但在这种情况下,有4-5个窗口重新打开,我不知道为什么。

我开始认为这是因为获得InputStream并执行ImageIO.read()的时间,游戏将启动,并看到变量运行为false,然后开始重新打开窗口,直到它为true,但我不知道如何验证。

注意:我的函数在ActionPerformed时验证snake是否发生冲突,如果发生冲突,将调用running=falsegameover()

public class GamePanel extends JPanel implements ActionListener { 
    JButton replay; //= new JButton("Play Again"); 
    GamePanel() {
        ...
        try {
            InputStream is_replay = this.getClass().getResourceAsStream("/Snake/lib/img/playagain.png");
            ImageIcon icon = new ImageIcon(ImageIO.read(is_replay));
            replay = new JButton(icon);
            replay.setBorder(BorderFactory.createEmptyBorder());
            replay.setContentAreaFilled(false);
            ...
        } catch (IOException|FontFormatException e) {
            e.printStackTrace();
        }

        this.add(replay);
        replay.setVisible(false);
        replay.setBounds(SCREEN_WIDTH/2 - 100, SCREEN_HEIGHT - 200, 200, 100);
        ...
        startGame();
    }

    public void startGame() {
        spawnApple();
        running = true;
        timer = new Timer(DELAY, this);
        timer.start();
    }

    public void gameOver(Graphics g) {
        ...

        replay.setVisible(true);
        replay.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                if(e.getSource() == replay) {
                    JComponent comp = (JComponent)e.getSource();
                    Window win = SwingUtilities.getWindowAncestor(comp);
                    win.dispose();  //It will close the current window
                    new GameFrame();  //It will create a new game
                }
            }
        });
    }
}

public class GameFrame extends JFrame {
    GameFrame() {
        JPanel panel = new GamePanel();
        this.add(panel);
        panel.setLayout(null);  //Needed to add components
        this.setTitle("Snake Game");
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setResizable(false);
        this.pack();  //Fit JFrame to the components
        this.setVisible(true);
        this.setLocationRelativeTo(null);
    }
}

public class SnakeGame {
    public static void main(String[] args) throws Exception {
        new GameFrame();
    }
}

共有1个答案

孔建柏
2023-03-14

“在这种情况下,重新打开4-5个窗口”

这表明您可能正在向replay JButton添加多个ActionListeners。每次调用game over方法时都会添加一个新的侦听器,这是不正确的。我不会将ActionListener添加到game over方法中的按钮,而是在创建replay按钮的地方添加一次。

 类似资料:
  • 问题内容: 我可以在自定义按钮上使用showInputDialog,还是可以在showInputDialog上重命名“ OK”和“ Cancel”按钮。 问题答案: 每种方法都有很多变体。选择一个通常可以使您访问所需的功能级别。就您而言,您正在寻找 在此处查看其javadoc :。请注意,您不会在这里更改按钮的颜色(因为它们取决于外观),而是更改其文本(通常来说已经足够,因为您也可以在此处设置显示

  • 我不知道以前有没有人问过这个问题。我要给我爸爸建一个计算器。他问我有没有办法用按钮定制。 我还没有完成任何代码。我打算尝试一些东西。我的研究结果一无所获。 这就是我想要实现的,我感觉它打破了android studio的编码法则。这就是概念: 想象一下计算器。数字上方有8个空白按钮。这些按钮通常具有百分比和sqrt等功能。,。。等 有人问我,他是否可以按住按钮,随意改变这些功能。 所以现在的问题是

  • 此代码在启动时执行一次。然后JButton位于中间。加载下一个图像时再次执行,此时JButton已处于正确位置。 我已经尝试了很多方法,比如将JButton添加到JFrame中,将JPanels布局设置为null(使button不可见),重新绘制、打包、无效,但我尝试的一切似乎都不奏效。有人能指示Swing把那个JButton放在我的JFrame的右上角吗?非常感谢!

  • Swagger注释可以与发音和maven一起使用吗?我正在尝试添加swagger注释,但它不起作用,而是拾取默认的java doc注释。 尝试将scan或resourcePackage等参数添加到存在于swagger BaseConfig类中的expertion . XML的Swagger标记,但它似乎不支持这些参数。 pom中定义的依赖关系: Expuncate:groupId:com.webc

  • 目标:我正在设计一个REST API,允许用户在HTTP GET请求的查询字符串上传递参数 http://fake.api.com/search?param1=123 实现:在服务器端,我有一个自定义模型绑定器,可以从请求querystring获取参数,并将其转换为C#对象,这样我的控制器操作方法就不必解析查询字符串。控制器动作方法签名看起来像 当我从Fiddler测试api并传递querystr

  • > 标高,同时具有自定义可绘制。 在用户触摸的地方启动涟漪效果。