小小七qi 2022-02-13 18:22 采纳率: 0%
浏览 34

java按钮位置相关

我正在改网络上的一个开源2048,我新建了一个”开始游戏按钮“按钮,绑定了监听,现在我点击按钮后按钮没有消失.

img

img

如果我想让按钮随着鼠标点击后消失只需要在内部类里面设置一下

        game_stame.setBounds(350,440,200,50);//原始位置
        game_stame.addMouseListener(new MouseAdapter() {//鼠标点击
            @Override
            public void mousePressed(MouseEvent e) {
                GetFocus();
                startGame();//开始游戏,数组初始化,页面数据初始化
                repaint();//绘制页面
                game_stame.setBounds(1000,440,200,50);//点击后位置改变
            }
        });

这样即可以得到短暂的解决,但是当我的游戏死亡后回到初始页面这个开始游戏的按钮也不会回来了,如下图,按钮还在x=1000的位置

img


大家有没有什么办法让按钮能够除了不在游戏中显示,起始-输-赢这些位置都出现呢?我的思考是能不能改变Graphics2D对象的图层关系,让它在不同的状态有不同的图层位置,但是网络上好像没有这种知识,如有赐教,不胜感激。
补充一点,这个开源不是靠多布局切换页面的,而是一个Graphics2D对象行天下,代码如下:

    public void drawGrid(Graphics2D g) {//页面绘制
        g.setColor(gridColor);
        g.fillRoundRect(200, 100, 499, 499, 15, 15);//阴影绘制
        if (gamestate == State.running) {//当点击开始了
            for (int r = 0; r < side; r++) {
                for (int c = 0; c < side; c++) {
                    if (tiles[r][c] == null) {//空方块绘制
                        g.setColor(emptyColor);
                        g.fillRoundRect(215 + c * 121, 115 + r * 121, 106, 106, 7, 7);//绘制小矩形
                    } else {
                        drawTile(g, r, c);//数字方块绘制
                    }
                }
            }
        } else {//输赢的情况绘制
            g.setColor(startColor);
            g.fillRoundRect(215, 115, 469, 469, 7, 7);//内圈图层
            g.setColor(gridColor.darker());
            g.setFont(new Font("SansSerif", Font.BOLD, 128));
            g.drawString("2048", 310, 270);
            g.setFont(new Font("SansSerif", Font.BOLD, 20));
            if (gamestate == State.won) {//赢了就弹出
                g.drawString("you made it!", 390, 350);
                //game_stame.setBounds(350,440,200,50);
            } else if (gamestate == State.over) {//输了弹出
                g.drawString("game over", 400, 350);
               // game_stame.setBounds(350,440,200,50);
                //JOptionPane.showMessageDialog(this,"GG");
            }
            g.setColor(gridColor);
            g.drawString("click to start a new game", 330, 470);
            g.drawString("(use arrow keys to move tiles)", 310, 530);
        }
    }

  • 写回答

2条回答 默认 最新

  • 小小七qi 2022-02-14 00:19
    关注

    我再来说一下我的解决方法,方便若干年后有个和我一样无聊的搞2048的人。

    • 建立一个函数专门控制这一个按键,设置好参数后,按键监听是如下代码片段:
            game_stame.addMouseListener(new MouseAdapter() {//鼠标点击
                @Override
                public void mousePressed(MouseEvent e) {
                    GetFocus();
                    startGame();//开始游戏,数组初始化,页面数据初始化
                    repaint();//绘制页面
                    removeAll();//
                    updateUI();//
                }
            });
    
    

    最后两个函数组合起来,一定要是removeAll(),不能是remove();

    • 第二步,我们已经点击了按钮进入了游戏并且该按钮消失了,游戏输或者赢的时候程序会自己回到首页,这时我们想要按钮再次出现(之前已经删除),代码如下:
             if (gamestate == State.won) {//赢了就弹出
                    g.drawString("you made it!", 390, 350);
                    setGamestate();//这是我的按钮函数
                } else if (gamestate == State.over) {//输了弹出
                    g.drawString("game over", 400, 350);
                    setGamestate();//这是我的按钮函数
                }
    
    

    -输赢页面重新绘图时再把按钮画回去,类似于递归??就是这么无聊的方法实现了按钮的出现与否,但切记一定要第一步尾的那两个函数一起,不然第二次点击按钮不会消失。

    评论

报告相同问题?

问题事件

  • 创建了问题 2月13日

悬赏问题

  • ¥15 单纯型python实现编译报错
  • ¥15 c++2013读写oracle
  • ¥15 c++ gmssl sm2验签demo
  • ¥15 关于模的完全剩余系(关键词-数学方法)
  • ¥15 有没有人懂这个博图程序怎么写,还要跟SFB连接,真的不会,求帮助
  • ¥15 PVE8.2.7无法成功使用a5000的vGPU,什么原因
  • ¥15 is not in the mmseg::model registry。报错,模型注册表找不到自定义模块。
  • ¥15 安装quartus II18.1时弹出此error,怎么解决?
  • ¥15 keil官网下载psn序列号在哪
  • ¥15 想用adb命令做一个通话软件,播放录音