保全头发 2023-05-02 14:08 采纳率: 42.9%
浏览 24

idea java 窗口显示问题


package Practice;

public class GameMain {
    public static void main(String [] args){
        new GameFrame ();
    }
}
package Practice;

public class Constant {

    /*******************游戏窗口*********************/
    public static final String  Game_tanke="坦克大战";

    public static final int   Frame_width=900;
    public static final int   Frame_heigh=700;

    public static final int   Frame_x=1920-900>>1;
    public static final int   Frame_y=1080-900>>1;

    /*******************游戏菜单*********************/
    public static final int STATE_MENU=0;
    public static final int STATE_HELP=1;
    public static final int STATE_ABOUT=2;
    public static final int STATE_RUN =3;
    public static final int STATE_OVER=4;

    public static final String[] MENUS={
            "开始游戏",
            "游戏帮助",
            "游戏关于",
            "退出游戏",
    };

}
package Practice;

import java.awt.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

import static Practice.Constant.*;

public class GameFrame extends Frame {

    //游戏状态
    public static int gameState;

    //对窗口进行初始化
    public GameFrame() {
        initFrame ();
        initEventListen ();

    }

    //对游戏进行初始化
    private void initGame(){
        gameState=STATE_MENU;
    }
    //属性进行初始化
    public void initFrame(){

        setTitle (Game_tanke);//标题
        setVisible (true);//显示窗口
        setSize (Frame_width,Frame_width);//设置宽高
        setLocation (Frame_x,Frame_y);//窗口位置
        setResizable (false);//窗口大小不可改变
        repaint ();
    }

    //窗口事件监听
    private void initEventListen(){

        //注册监听事件
        addWindowListener (new WindowAdapter () {
            //关闭窗口
            @Override
            public void windowClosing(WindowEvent e) {
                System.exit (0);
            }
        });
    }

    //是FRAME类的方法,所有需要在屏幕中现实的内容都要通过该方法调用,不能主动调用,需要通过repaint()去调用该方法
    public void update(Graphics g) {
        switch (gameState){
            case STATE_MENU:
                drawMenu (g);
                break;
            case STATE_HELP:
                drawHelp (g);
                break;
            case STATE_ABOUT:
                drawAbout (g);
                break;
            case STATE_RUN:
                drawRun (g);
                break;
            case STATE_OVER:
                drawOver (g);
                break;
        }
    }

    private void drawRun(Graphics g) {
    }

    private void drawOver(Graphics g) {
    }

    private void drawAbout(Graphics g) {
    }

    private void drawHelp(Graphics g) {
    }

    //绘制菜单状态下内容
    private void drawMenu(Graphics g){
        g.setColor (Color.BLACK);
        g.fillRect (0,0,Frame_width,Frame_heigh);

        final int STR_width=50;
        int x=Frame_width-STR_width>>1;
        int y=Frame_heigh/3;
        final int DIS=30;

        g.setColor (Color.white);
        for (int i=0;i<MENUS.length;i++){
            g.drawString (MENUS[i],x,y+DIS*i );
        }
    }
}

这个代码为什么我的运行出来的窗口闪一下就白屏了,求解

img

  • 写回答

2条回答 默认 最新

  • Bony- 2023-05-04 14:02
    关注

    以下回答参考GPT并且由Bony-整理:
    根据你提供的代码,我看到你的窗口是有显示出来的,但是很快就消失了,这是因为你的窗口没有得到持续的绘制。

    在你的代码中,你重写了update()方法,但是没有调用super.update(g)方法,所以窗口在绘制完当前状态后就没有继续绘制,导致窗口闪烁。

    你可以在update()方法的每个case分支结尾处添加super.update(g)方法,使得窗口可以得到持续的绘制。

    另外,你在GameFrame构造方法中调用了initEventListen()方法,但是没有调用initGame()方法进行游戏状态的初始化,这也可能导致窗口无法正常显示游戏状态。

    最后,建议你将initFrame()方法和initEventListen()方法放在GameFrame构造方法中一起调用,这样可以使代码更加清晰。

    评论

报告相同问题?

问题事件

  • 创建了问题 5月2日

悬赏问题

  • ¥30 STM32 INMP441无法读取数据
  • ¥100 求汇川机器人IRCB300控制器和示教器同版本升级固件文件升级包
  • ¥15 用visualstudio2022创建vue项目后无法启动
  • ¥15 x趋于0时tanx-sinx极限可以拆开算吗
  • ¥500 把面具戴到人脸上,请大家贡献智慧
  • ¥15 任意一个散点图自己下载其js脚本文件并做成独立的案例页面,不要作在线的,要离线状态。
  • ¥15 各位 帮我看看如何写代码,打出来的图形要和如下图呈现的一样,急
  • ¥30 c#打开word开启修订并实时显示批注
  • ¥15 如何解决ldsc的这条报错/index error
  • ¥15 VS2022+WDK驱动开发环境