BenChuat 2023-05-17 14:01 采纳率: 73.1%
浏览 41
已结题

jframe跳转另一个jframe后paint绘画问题

在jframe跳转另一个jframe时,弹出的窗口没有显示,也无法操作,关闭都关不了

img

查了很多资料,觉得可能是paint,repaint的问题,setvisible是会系统调用一次paint吧,那为什么setvisible语句位置不一样都会不能显示呢?调用时间啥的到底是怎么样的

img

我想实现的就是在这一个jframe里点击一个按钮事件,就创建那个游戏窗口,但是弹出之后没画面,搞了很久,觉得应该是绘制的问题,就打印了缓存区的图片,果然在点击事件的时候缓冲区图片为空,但这是为什么呢,要怎么解决呀,我搞了好几天都搞不定

img

img

怕图片看不清,就放一下游戏类的构造方法和重写的paint方法

this.setSize(800,600);//窗口大小
this .setLocationRelativeTo(null);//窗口居中
this.setVisible(true);//窗口可见(此时会调用一次paint方法)
this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);//关闭窗口
this.setResizable(false);//窗口大小不可变
this.addKeyListener(this);//添加键盘监听
this.setTitle("Super-Mary-P2");//设置窗口名字
System.out.println("Super-Mary-P2 is staring...");
//初始化图片
StaticValue.init();
//初始化马里奥
mario = new Mario(10,355);
mario2 = new Mario2(15,355);
//创建场景(创建好三个场景放到集合里)
for (int i = 1; i <=3 ; i++) {
    allBg.add(new BackGround(i,i == 3 ? true :false));
}
//当前场景为
nowBg = allBg.get(0);//取场景集合里的第一个初始化为第一关)
mario.setBackGround(nowBg);
mario2.setBackGround(nowBg);
repaint();//再次调用paint方法
//System.out.println(11111);
System.out.println(offScreenImage);
thread.start();
sendthread.start();
recthread.start();
try {
    new Music();
} catch (FileNotFoundException e) {
    e.printStackTrace();
} catch (JavaLayerException e) {
    e.printStackTrace();
}

@Override
public void paint(Graphics g) {
    //System.out.println(22222);
    if(offScreenImage == null){
        offScreenImage = createImage(800,600);
    }
    //用Graphics graphics对象绘制在缓冲区
    Graphics graphics = offScreenImage.getGraphics();
    graphics.fillRect(0,0,800,600);
    graphics.drawImage(nowBg.getBgImage(),0,0,this);//绘制在缓冲区
    //paint enemy
    for (Enemy e:nowBg.getEnemyList()) {
        graphics.drawImage(e.getShow(),e.getX(),e.getY(),this);
    }
    //paint obstacle
    for (Obstacle ob: nowBg.getObstacleList()) {
        graphics.drawImage(ob.getShow(),ob.getX(),ob.getY(),this);
    }
    //
    graphics.drawImage(nowBg.getTower(),620,270,this);
    //
    graphics.drawImage(nowBg.getGan(),500,220,this);
    //
    graphics.drawImage(mario.getShow(),mario.getX(),mario.getY(),this);
    graphics.drawImage(mario2.getShow(),mario2.getX(),mario2.getY(),this);
    //add score
    Color c = graphics.getColor();
    graphics.setColor(Color.BLACK);
    graphics.setFont(new Font("黑体",Font.BOLD,25));
    graphics.drawString("P2当前的分数为:"+ mario.getScore(),300,100);
    graphics.drawString("P1当前的分数为:"+ mario2.getScore(),300,150);


    graphics.setColor(c);
    //用paint方法的形参Graphics g通过offScreenImage绘制到窗口
    //System.out.println(333333);
    g.drawImage(offScreenImage,0,0,this);

  • 写回答

2条回答 默认 最新

  • 技术宅program 2023-05-17 14:17
    关注

    根据您在CSDN提出的jframe跳转另一个jframe问题链接,我的理解和建议如下:

    1. 您想要在一个JFrame(Frame1)中创建一个按钮,点击该按钮后跳转到另一个JFrame(Frame2)。这属于Swing GUI组件之间的事件响应和跳转。
    2. 实现思路:
      (1) 创建两个JFrame(Frame1和Frame2)
    java
    JFrame frame1 = new JFrame("Frame1");
    JFrame frame2 = new JFrame("Frame2");
    
    

    (2) 在Frame1中添加一个按钮,并为该按钮添加ActionListener监听器,在actionPerformed方法中显示Frame2,并隐藏Frame1。

    java
    JButton button = new JButton("Jump to Frame2");
    button.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            frame2.setVisible(true);
            frame1.setVisible(false);
        } 
    });
    frame1.add(button);
    
    

    (3) 设置Frame1和Frame2的默认关闭操作,以防用户直接关闭Frame2导致程序退出。

    java
    frame1.setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE);
    frame2.setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE);
    
    

    (4) 显示Frame1。

    java 
    frame1.setVisible(true);
    
    
    1. 完整代码如下:
    java
    public class FrameJumpDemo {
        public static void main(String[] args) {
            JFrame frame1 = new JFrame("Frame1");
            frame1.setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE);
            
            JButton button = new JButton("Jump to Frame2");
            button.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    frame2.setVisible(true);
                    frame1.setVisible(false);
                } 
            });
            frame1.add(button);
            frame1.pack();
            
            JFrame frame2 = new JFrame("Frame2");
            frame2.setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE);
            frame2.pack();
            
            frame1.setVisible(true);
        } 
    }
    
    
    

    如果觉得对你有用,帮忙采纳一下哦,谢谢

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 5月26日
  • 已采纳回答 5月18日
  • 修改了问题 5月17日
  • 创建了问题 5月17日

悬赏问题

  • ¥15 无法输出helloworld
  • ¥15 高通uboot 打印ubi init err 22
  • ¥20 PDF元数据中的XMP媒体管理属性
  • ¥15 R语言中lasso回归报错
  • ¥15 网站突然不能访问了,上午还好好的
  • ¥15 有没有dl可以帮弄”我去图书馆”秒选道具和积分
  • ¥15 semrush,SEO,内嵌网站,api
  • ¥15 Stata:为什么reghdfe后的因变量没有被发现识别啊
  • ¥15 振荡电路,ADS仿真
  • ¥15 关于#c语言#的问题,请各位专家解答!