案例:

package cn.dzz;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener; public class Main { static String shape = ""; public static void main(String[] args) {
// 创建窗体
Frame frame = new Frame(); // 创建所需的组件 // 绘制矩形和椭圆的两个事件按钮
Button rectangleButton = new Button("draw-rectangle");
Button ellipsoidButton = new Button("draw-ellipsoid"); // 逻辑判断 // 判断图形的逻辑
final String RECT = "RECT";
final String OVAL = "OVAL"; // 自定义的Canvas类
class DemoCanvas extends Canvas { // paint方法在repaint()调用之后触发
@Override
public void paint(Graphics g) {
// super.paint(g);
if (shape.equals(RECT)) {
g.setColor(Color.BLACK);
g.drawRect(100,100,150,100);
} else if (shape.equals(OVAL)){
g.setColor(Color.RED);
g.drawOval(100,100,150,100);
}
}
} // 初始化画布容器对象
Canvas canvas = new DemoCanvas(); // 按钮的事件监听
rectangleButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
shape = RECT;
canvas.repaint();
}
}); ellipsoidButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
shape = OVAL;
canvas.repaint();
}
}); // 组件组装
Panel panel = new Panel();
panel.add(rectangleButton);
panel.add(ellipsoidButton); canvas.setPreferredSize(new Dimension(300, 300));
frame.add(panel, BorderLayout.SOUTH);
frame.add(canvas); // 自适应和可见
frame.pack();
frame.setVisible(true);
} }

预览效果

矩形和椭圆

弹球游戏的实现:

借助repaint方法,只要方法执行的频率超过肉眼的速度,

静态的画面就可以实现动画的效果

package cn.dzz;

import javax.swing.*;
import java.awt.*;
import java.awt.event.*; public class SamplePinball { private Frame frame = new Frame("Pinball-Game"); // 弹跳的活动空间
private final int TABLE_WIDTH = 300;
private final int TABLE_HEIGHT = 400; // 球拍尺寸
private final int RACKET_WIDTH = 60;
private final int RACKET_HEIGHT = 10; // 弹球大小
private final int BALL_SIZE = 15; // 弹球初始出现的坐标位置
private int ball_location_x = 150;
private int ball_location_y = 200; // 弹球的移动速度
private int speedX = 5;
private int speedY = 10; // 球拍的坐标
private int racket_location_x = 120;
private final int RACKET_INIT_LOCATION_Y = 340; private boolean isGameOver = false; // 计时器?
private Timer flasher; private Canvas table = new PinballTable(); class PinballTable extends Canvas {
@Override
public void paint(Graphics g) {
// super.paint(g); // 游戏结束
if(isGameOver) {
g.setColor(Color.BLACK);
g.setFont(new Font("times", Font.BOLD, 30));
g.drawString("游戏结束", 75, 200);
} else {
// 游戏没有结束 // 绘制球拍
g.setColor(Color.LIGHT_GRAY);
g.fillRect(
racket_location_x,
RACKET_INIT_LOCATION_Y,
RACKET_WIDTH,
RACKET_HEIGHT
); // 绘制弹球
g.setColor(Color.RED);
g.fillOval(
ball_location_x,
ball_location_y,
BALL_SIZE,
BALL_SIZE
);
}
}
} public void init() {
// 视图组装与逻辑控制 // 实现球拍变化的控制
KeyListener keyListener = new KeyAdapter(){
@Override
public void keyPressed(KeyEvent e) {
// super.keyPressed(e); // 每一个按键都对应了一个按键代码数值
int keyCode = e.getKeyCode();
System.out.println("当前按下的按键是:" + keyCode); switch (keyCode) {
case KeyEvent.VK_LEFT :
if (racket_location_x > 0) {
racket_location_x -= 15;
}
break;
case KeyEvent.VK_RIGHT :
if (racket_location_x < (TABLE_WIDTH - RACKET_WIDTH)) {
racket_location_x += 15;
}
break;
}
}
}; // 每次刷新需要干的事情:
ActionListener actionListener = new ActionListener() { @Override
public void actionPerformed(ActionEvent e) { // 弹球碰到墙壁的反弹逻辑
if (ball_location_x <= 0 || ball_location_x >= (TABLE_WIDTH - BALL_SIZE) ) {
speedX = -speedX;
}
if (ball_location_y <= 0 ||
(
ball_location_y > RACKET_INIT_LOCATION_Y - BALL_SIZE &&
ball_location_x > racket_location_x &&
ball_location_x < racket_location_x + RACKET_WIDTH
)
) {
speedY = -speedY;
} // 弹球越过了球拍的高度,游戏结束了
if (ball_location_y > RACKET_INIT_LOCATION_Y - BALL_SIZE && (ball_location_x < racket_location_x || ball_location_x > racket_location_x + RACKET_WIDTH)
) {
flasher.stop();
isGameOver = true;
}
// 如果没有碰到墙壁则继续移动
ball_location_x += speedX;
ball_location_y += speedY; // 画布刷新
table.repaint();
}
}; // 弹球的控制 100毫秒(0.1秒)
flasher = new Timer(100, actionListener);
flasher.start(); // 由顶级窗体监听这个事件
frame.addKeyListener(keyListener);
table.addKeyListener(keyListener); // 设置大小和装填组件
table.setPreferredSize(new Dimension(TABLE_WIDTH, TABLE_HEIGHT));
frame.add(table, BorderLayout.CENTER); frame.pack();
frame.setVisible(true);
}
}

差点忘了启动类:

package cn.dzz;

public class GUI {
public static void main(String[] args) {
new SamplePinball().init();
}
}

  

【Java-GUI】05 绘图 Part1的更多相关文章

  1. java GUI Graphics2D 绘图

    Graphics类提供基本绘图方法,Graphics2D类提供更强大的绘图能力.本节讲解Graphics类,下节讲解Graphics2D. Graphics类提供基本的几何图形绘制方法,主要有:画线段 ...

  2. JAVA GUI 工具

    Java GUI图形界面开发工具   上大学那会儿比较主流的Java图形开发插件是:Visual Editor 和 SWT Designer, 不久又出了个Jigloo, 但去官网看了下发现这个东西也 ...

  3. Java GUI编程4---标签组件JLabel

    Java GUI编程4---标签组件JLabel 2018年06月11日 22:06:58 蓝蓝223 阅读数 12103更多 个人分类: Java书籍摘抄 所属专栏: Java Swing图形界面 ...

  4. Java GUI 图书管理系统

    01 概述 一款功能强大的图书馆管理系统,功能齐全,小白/大学生项目实训,学习的不二之选. 02 技术 此系统使用 java awt 实现.java.awt是一个软件包,包含用于创建用户界面和绘制图形 ...

  5. JAVA GUI编程学习笔记目录

    2014年暑假JAVA GUI编程学习笔记目录 1.JAVA之GUI编程概述 2.JAVA之GUI编程布局 3.JAVA之GUI编程Frame窗口 4.JAVA之GUI编程事件监听机制 5.JAVA之 ...

  6. JAVA GUI

    JAVA GUI中的事件处理:   委托事件模型:事件源对象和监听器对象具有绑定关系   一个监听器可以绑定多个事件源 一个事件源也可以绑定多个监听器 监听器有各自监听的事件类型   设置容器的布局管 ...

  7. paip.java gui swt/jface 最佳实践

    paip.java gui swt/jface 最佳实践 1. 工具:Eclipse +jigloo4 1 2. 安装插件: 1 1. IMPORT swt lib 2 2. 新建立窗体 2 3. 运 ...

  8. 写在学习Java GUI之前

    Java GUI就是用Java语言开发桌面应用,而Java又有三个Java GUI库,分别为AWT,Swing和SWT/JFace. 现在要学的是Swing库. 后记:开发桌面应用,不止一种技术,现在 ...

  9. [置顶] java Gui 键盘监听事件

    简单写一个java Gui键盘监听事件,实现的效果就是按下键盘控制台输出你按下的键.比如:按下A控制台就输出A 效果如图: 以下把实现的效果分为几个步骤: 1.新建一个窗体类继承窗体: 2.给这个窗体 ...

  10. java GUI (课堂笔记)

    关于java GUI Swing组件: JFrame 窗口组件 JLabel 标签 JButton 按钮组件 JTextField 单行文本框 系统控件(JDK自带) 自定义控件(模仿系统控件): 继 ...

随机推荐

  1. kettle从入门到精通 第二十三课 kettle carte 错误(java.lang.OutOfMemoryError: GC overhead limit exceeded,Could not emit buffer due to lack of requests,java heap space)分析

    1.Could not emit buffer due to lack of requests(无法发出缓冲区,因为请求不足.) 原因有两点:1)消费者处理数据能力较弱,如表输出步骤.2)消费者没有处 ...

  2. String Record

    T1. P5840 算法:ACAM+BIT+树链剖分 自然地,我们会对 \(s_i\) 建 ACAM,然后建出一颗 fail 树. 此时我们考虑集合内加入一个新的字符串.每一个匹配到的点我们都会给从这 ...

  3. C#.NET 4.8 WEBP 转 GIF

    C#.NET 4.8 WEBP 转 GIF 项目是.NET 4.8. nuget 引用 Magick.NET-Q16-AnyCPU ,版本:7.14.5.高版本,如:12.2 已经不支持.NET FR ...

  4. C# .NET 生成国密私钥公钥对

    使用的工具类: using Org.BouncyCastle.Asn1; using Org.BouncyCastle.Asn1.GM; using Org.BouncyCastle.Asn1.X9; ...

  5. “Newtonsoft.Json”已拥有为“Microsoft.CSharp”定义的依赖项。

    安装较低版本的Newtonsoft.Json: Newtonsoft.Json官网:https://www.nuget.org/packages/Newtonsoft.Json/ Install-Pa ...

  6. 使用Kimi+Markmap总结网页内容生成思维导图

    AI可以帮助我们更高效地阅读文章进行提炼总结,像上图这张思维导图,就是使用Kimi进行内容提炼,再使用markmap生成思维导图,下面讲解下详细实现步骤: 一.工具准备 Kimi,将文章或一篇网页投给 ...

  7. 微信支付普通商户与AppID账号关联管理-授权

    微信支付普通商户与AppID账号关联管理 二.名词解释 名词 释义 微信支付普通商户 公司企业.政府机关.事业单位.社会组织.个体工商户.个人卖家.小微商户.(微信支付商户接入指引) AppID 已通 ...

  8. 如何更改.NET中的默认时区?

    除了"在操作系统中修改时区信息,然后重启.NET应用程序,使其生效"之外.如何在不修改操作系统时区的前提下,修改.NET中的默认时区呢? 这是一位 同学兼同事 于5月21日在技术群 ...

  9. 第三方App与Termux命令建立IO通道

    目录 前言 一.Android 进程间通信(IPC) 二.Netcat 网络瑞士军刀 三.第三方 App 与 Termux 建立 TCP/Socket 通信 四.应用:调用 LSP 语言服务器 参见 ...

  10. gerrit权限控制

    gerrit权限控制 背景 在公司中使用到了Gerrit作为技术管理,在配置的时候发现一些问题:转载了这篇文章作为学习. 正文开始 原文链接:https://blog.csdn.net/chenjh2 ...