俄罗斯方块-Java frame中调用了setContentPane(new Panel());方法,但不显示Panel

问题描述

Java frame中调用了setContentPane(new Panel());方法,但不显示Panel

代码如下:
PanelGame类:

package ui;

import java.awt.Graphics;
import java.awt.Image;

import javax.swing.ImageIcon;
import javax.swing.JPanel;

public class PanelGame extends JPanel{

//创建一个对象数组,存储各个边框
private Lay[] lays=null;
//TODO 【硬编码】是非常不好的开发习惯
//TODO 尽量将数字货字符串定义为常量,或写入配置文件
public PanelGame() {
    this.setVisible(true);
    lays = new Lay[]{
    new LayDataBase(40,32,334,279),
    new LayDisk(40,343,334,279),
    new LayGame(414,32,334,590),
    new LayButton(788,32,334,124),
    new LayNext(788,188,176,148),
    new LayLevel(964,188,158,148),
    new LayPoint(788,368,334,200)
    };

}
public void pointComponent(Graphics g){
    //test
    g.fillRect(32, 32, 32, 32);
    //循环刷新游戏画面
    for(int i=0;i<lays.length;i++){
        //刷新每一个边框
        lays[i].paint(g);
    }

}

}

FrameGame类:

package ui;

import java.awt.Dimension;
import java.awt.Image;
import java.awt.Toolkit;

import javax.swing.ImageIcon;
import javax.swing.JFrame;

public class FrameGame extends JFrame{

public FrameGame() {

    //设置标题
    this.setTitle("Tetris by 柴源");

    //设置窗口关闭
    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    //设置窗口大小
    this.setSize(1200, 700);

    //设置 不允许用户改变窗口大小
    this.setResizable(false);

    //设置窗口位置
    Toolkit toolkit = Toolkit.getDefaultToolkit();
    Dimension screen = toolkit.getScreenSize();

    int x = (screen.width-this.getWidth())/2;
    int y = (screen.height-this.getHeight())/2-32; //此处用-32,因为Y轴正方向向下

    this.setLocation(x,y);  

    //设置默认Panel
    this.setContentPane(new PanelGame());

}

}
Lay类(抽象类):

package ui;

import java.awt.Graphics;
import java.awt.Image;

import javax.swing.ImageIcon;
/*

  • 抽象类LAY,用于实现各个子窗体的绘制,
  • */
    public abstract class Lay {
    //定义几个静态变量,供绘制方法createWindow使用
    private static final int SIZE=7;
    private static Image WINDOW_IMG=new ImageIcon("graphics/window/Window.png").getImage();
    private static int WINDOW_W=WINDOW_IMG.getWidth(null);
    private static int WINDOW_H=WINDOW_IMG.getHeight(null);

    //定义属性,窗口左上角坐标(x,y)以及窗口宽W高H
    private int x;
    private int y;
    private int w;
    private int h;

    //构造器,赋予窗体左上角位置(X,Y) 以及宽W高H
    public Lay(int x,int y, int w, int h) {
    // TODO Auto-generated constructor stub
    this.x=x;
    this.y=y;
    this.w=w;
    this.h=h;

    }

    //绘制窗口方法 绘制的方法必须有Graphics g参数,类似画笔
    public void createWindow(Graphics g){
    //原函数:g.drawImage(img,x1,y1,x2,y2,x3,y3,x4,y4,observer);
    //左上角
    g.drawImage(WINDOW_IMG, x, y,x+SIZE,y+SIZE, 0, 0, SIZE, SIZE, null);
    //右上角
    g.drawImage(WINDOW_IMG, x+w-SIZE, y,x+w,y+SIZE, WINDOW_W-SIZE, 0, WINDOW_W, SIZE, null);
    //左下角
    g.drawImage(WINDOW_IMG, x, y+h-SIZE,x+SIZE,y+h, 0, WINDOW_H-SIZE, SIZE, WINDOW_H, null);
    //右下角
    g.drawImage(WINDOW_IMG, x+w-SIZE, y+h-SIZE,x+w,y+h, WINDOW_W-SIZE, WINDOW_H-SIZE, WINDOW_W, WINDOW_H, null);

    //上边
    g.drawImage(WINDOW_IMG, x+SIZE, y, x+w-SIZE, y, SIZE,0, WINDOW_W-SIZE, 0, null);
    //下边
    g.drawImage(WINDOW_IMG, x+SIZE, y+h, x+w-SIZE, y+h, SIZE,WINDOW_H, WINDOW_W-SIZE, WINDOW_H, null);
    //左边
    g.drawImage(WINDOW_IMG, x, y+SIZE, x, y+h-SIZE, 0,SIZE, 0,  WINDOW_H-SIZE, null);
    //右边
    g.drawImage(WINDOW_IMG, x+w, y+SIZE, x+w, y+h-SIZE, WINDOW_W , SIZE , WINDOW_W ,WINDOW_H-SIZE, null);
    

    }
    abstract public void paint(Graphics g);
    }

实现Lay类的子类代码我就不贴了...
问题主要在于:
已经在FrameGame类里头用了this.setContentPane(new PanelGame());
希望通过PanelGame里输出了一些图片(通过创建Lay对象输出图片)
但是Run以后,貌似连Panel都不显示...图片路径检查了应该没问题。
求指点,谢了!

解决方案

你在frame中调用一下frame.setVisible(true);试一下,我遇到过类似问题

时间: 2024-09-19 09:12:36

俄罗斯方块-Java frame中调用了setContentPane(new Panel());方法,但不显示Panel的相关文章

如何在非action的普通java类中调用service和dao来操作数据库

问题描述 如何在非action的普通java类中调用service和dao来操作数据库 web程序用的框架是SSH的,在spring.xml中通过方式自动扫描service和dao,现有一个后台消息处理类,要在该类调用其他service和dao进行一些业务和数据库的操作,使用@Autowired private BaseDaoI baseDao;引用dao,在调用时报空指针错误,请教大神们该怎么解决. 解决方案 你所谓的"后台消息处理类"也的用注解标注它是一个Bean才行啊 解决方案二

jcom-利用Jcom在用java程序中调用windows Com组件,Jcom.dll是不是支持64位操作系统?

问题描述 利用Jcom在用java程序中调用windows Com组件,Jcom.dll是不是支持64位操作系统? 利用Jcom在用java程序中调用windows Com组件,Jcom.dll是不是支持64位操作系统?我发现在32位机器上是可以调用成功的,为什么切换到64为机器上就调用不成功,有谁了解这个Jcom的,谢谢给个解答.

封装dll-如何把一个能够实现完整功能的C语言写的项目封装为DLL,然后在java项目中调用

问题描述 如何把一个能够实现完整功能的C语言写的项目封装为DLL,然后在java项目中调用 前段时间调试了一个C程序的源码,现在要在一个java web的项目中调用它来完成一个功能,求指点! 解决方案 考虑下jni,编译成so后,在java程序中引入即可 static{ System.loadLibrary("AirPos"); } 解决方案二: 但要注意路径问题,载入路径要指定正确,放置调用失败.

从JSP页面调用查询语句就报空指针,但是从java文件中调用缺显示正常

问题描述 <%}elseif("edit".equals(action)){Integerid=Integer.parseInt(request.getParameter("id"));CalendarDaocalendarDao=newCalendarDaoImpl();Calendarcalendar=newCalendarDaoImpl().findById(id); 这个是JSP文件里调用的findById方法,Calendarcalendar=cal

怎样在java代码中调用执行shell脚本呀

问题描述 遇到个问题   在本地压缩服务器上的xml文件 我就想编写shell教本 脚本内容是链接服务器 找到待压缩文件 压缩文件  说实话 我不知道这样是否可行  试试  但我不知道怎样在java代码中 调用执行shell脚本  谁能指点指点  求教...  问题补充:首先谢谢各位朋友的回答  在补充个小问题 <br />能在调用shell脚本时 同时给shell脚本传参数吗  不止一个 能这样写吗     <br />Runtime.getRuntime().exec(&quo

Java 8中日期和时间的处理方法_java

Java 8新增了LocalDate和LocalTime接口,为什么要搞一套全新的处理日期和时间的API?因为旧的java.util.Date实在是太难用了. java.util.Date月份从0开始,一月是0,十二月是11,变态吧!java.time.LocalDate月份和星期都改成了enum,就不可能再用错了. java.util.Date和SimpleDateFormatter都不是线程安全的,而LocalDate和LocalTime和最基本的String一样,是不变类型,不但线程安全,

在java List中进行模糊查询的实现方法_java

比如我有下面这样一个List,里面存放的是多个Employee对象.然后我想对这个List进行按照Employee对象的名字进行模糊查询.有什么好的解决方案么? 比如我输入的查询条件为"wang",那么应该返回只包含employee1的List列表. List list = new ArrayList(); Employee employee1 = new Employee(); employee1.setName("wangqiang"); employee1.s

c++ 构造函数中调用虚函数的实现方法_C 语言

我们知道:C++中的多态使得可以根据对象的真实类型(动态类型)调用不同的虚函数.这种调用都是对象已经构建完成的情况.那如果在构造函数中调用虚函数,会怎么样呢? 有这么一段代码: class A { public: A ():m_iVal(0){test();} virtual void func() { std::cout<<m_iVal<<' ';} void test(){func();} public: int m_iVal; }; class B : public A {

javaee-打jar包后__在调用 jar包里面的方法时,参数显示全部是arg0,arg1,arg2

问题描述 打jar包后__在调用 jar包里面的方法时,参数显示全部是arg0,arg1,arg2 打jar包后__在调用 jar包里面的方法时,参数显示全部是arg0,arg1,arg2 解决方案 因为你的使用的jar包中没有源码,如果你有源码就会有显示和别人一样的名称. 解决方案二: 关联jar包中的源码就行