最近学习java图形的时候,准备写个打砖块的游戏练手,但是遇到很多问题。
请帮忙看看以下代码,RedBrick是一个红色的砖块,它需要被添加到一个游戏窗体BrickFrame中。BrickFrame添加了鼠标监听事件,测试代码时,我在事件中进行以下处理:删除通过鼠标点中的RedBrick。
import java.awt.*; import javax.swing.*; import javax.swing.border.*; public class RedBrick extends JPanel { // 砖块的长和宽,常量 public static final int WIDTH = 50; public static final int HEIGHT = 20; //常量名以颜色命名,值为颜色对应被销毁需要的次数 public static final int RED = 1; public static final int ORANGE = 2; public static final int YELLOW = 3; public static final int GREEN = 4; public static final int CYAN = 5; public static final int BLUE = 6; public static final int MAGENTA = 7; //砖块在整个砖块方阵中所处的排数 private int row; //砖块在整个砖块方阵中所处的列数 private int column; //砖块的坐标 private int x; private int y; private int color; //填充色,与变量color对应,通过方法getColor(color)来得到fillColor private Color fillColor; //边的颜色 private Color edgeColor; public RedBrick(int row, int column){ this(RED, row, column); } public RedBrick(int color, int row, int column){ this.color = color; setFillColor(this.color); setBorder(new LineBorder(Color.BLUE)); this.row = row; this.column = column; x = BrickFrame.START_X + WIDTH * column; y = BrickFrame.START_Y + HEIGHT * row; } /** * 设置砖块颜色 * @param color */ private void setFillColor(int color) { fillColor = getColor(color); } /** * 通过该类中的颜色常量RED,ORANGE,YELLOW,GREEN,CYAN,BLUE,MAGENTA对应的Color类中的颜色,如果不为以上7种颜色,则返回Color.BLACK */ private Color getColor(int color) { switch(color) { case RED: return Color.RED; case ORANGE: return Color.ORANGE; case YELLOW: return Color.YELLOW; case GREEN: return Color.GREEN; case CYAN: return Color.CYAN; case BLUE: return Color.BLUE; case MAGENTA: return Color.MAGENTA; default: return Color.BLACK; } } public void paintComponent(Graphics g){ super.paintComponent(g); g.setColor(fillColor); g.fillRect(0, 0, WIDTH, HEIGHT); this.setLocation(x, y); this.setSize(WIDTH, HEIGHT); //如果不设置size,一个Brick就会把整个Frame占满 } }
import java.awt.*; import java.awt.event.*; import java.util.*; import javax.swing.*; public class BrickFrame extends JPanel { private ArrayList<Brick> bricks = new ArrayList<Brick>(); // // 窗体的宽和高 public final static int FRAME_WIDTH = 800; public final static int FRAME_HEIGHT = 600; // 砖块的起始坐标 public final static int START_X = 0; public final static int START_Y = 60; private MouseAdapter mouseListener = new MouseAdapter() { public void mouseClicked(final MouseEvent e) { remove(getComponentAt(e.getPoint())); repaint(); //如果不调用repaint()方法,组件删除后不能马上看到效果,为什么? } }; /** * 重写add方法,如果c是Brick类的一个实例,则将其转换为Brick类型然后添加到bricks中 */ public Component add(Component c) { super.add(c); if (c instanceof Brick) { bricks.add((Brick) c); } return c; } /** * 重写add方法,如果c是Brick类的一个实例,则将其从bricks中删除 */ public void remove(Component c) { super.remove(c); if (c instanceof Brick) { bricks.remove((Brick) c); } } public BrickFrame() { this.addMouseListener(mouseListener); this.addMouseMotionListener(mouseMotionListener); } }
下面是初始化代码
public class Test { public static void main(String[] args) { final JFrame jf = new JFrame(); BrickFrame bf = new BrickFrame(); //在窗体中添加Brick, for (int i = 0; i < 400 / Brick.HEIGHT; i++) { for (int j = 0; j <(BrickFrame.FRAME_WIDTH - BrickFrame.START_X) / Brick.WIDTH; j++) { bf.add(new RedBrick(i, j)); } } //下面代码放在for循环后,为什么?是不是for循环也要加入到EDT中? jf.add(bf); SwingUtilities.invokeLater(new Runnable() { public void run() { jf.setTitle("打砖块"); jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); jf.setSize(816, 638); jf.setVisible(true); } }); } }
在鼠标监听事件中通过remove来删除鼠标点中的组件RedBrick
remove(getComponentAt(e.getPoint()));
但是如果不调用repaint()则不会马上看到砖块删除,需要改变窗体大小后才能看到。
我知道swing有个事件派发线程,但是还是不太明白为什么。
相关推荐
此面板继承自JPanel,放置其上的组件能够根据面板大小的变化,重新计算新的组件位置,从而实现自适应布局,详细使用方法请见源码注释
对于初学者来说,这还是不错的资源,这个源程序实现在面板中加载一些图片,还是不错的啊!!!
基于Java 的画图程序,解压后直接打开工程,可以画出直线,园,线,点。需要其它图形可以自己设计,需要继承shape类;IDE环境为JCreator 4.5和JDK 1.5;
Java绘图和JPanel容器
swing多个布局切换实例,就是一个小demo
基于JAVA+SQL电子通讯录带系统托盘的...系统提供用户界面,使用JFrame和JPanel等组件设计界面,包含联系人信息列表、添加联系人、删除联系人、修改联系人、查询联系人等功能按钮。用户可以通过界面操作联系人信息,实现
Java GUI 编程中,无法像C#一样向一个Panel中插入背景图片,这里在网上搜索了一个可以插入背景的Jpanel。 跟大家共享一下,也许你已经下载过,但主要还是方便那些还没有找到的人。
主要介绍了JFrame中添加和设置JPanel的方法实例解析,具有一定借鉴价值
java Swing多Jpanel仿安卓苹果桌面动态切换滑动效果
通过Java实现JPanel版俄罗斯方块,包括图片资源。
PageNumDemo.java
NULL 博文链接:https://javapub.iteye.com/blog/764681
这是刚刚上传的,也是找了好久,其他人的都死要钱,死要分数,动辄就是五六十积分,好几十分,有需要的赶紧下载,对你有帮助最好,没帮助也别强求,太难找了。
JPanel是Swing库中的一个容器组件,用于在图形用户界面(GUI)中容纳和管理其他组件。
如何卸载JPanel面板
对java Swing窗体的一个例子应用
java使用swing技术实现迷宫制造,包括追赶着,移动着以及倒计时,无墙模式设置等等。可设置追赶者数目、追赶者时间等,以及拆墙次数
java Swing多Jpanel仿安卓苹果桌面动态切换滑动效果
整个大鱼吃小鱼的完整代码,打包成压缩文件,上传可供下载
这个程序使用 Java 的 Swing 组件库,通过继承 JFrame 和 JPanel 类实现游戏界面和基本功能。主要的类是 DuiDuiPeng,包括了开始游戏按钮的事件处理、棋盘的初始化和更新、方块点击事件的处理等。程序中使用了 Timer...