Java中的AWT进阶
围棋
package ch11;
/**
* Created by Jiqing on 2016/12/4.
*/
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
import java.awt.image.*;
import javax.imageio.*;
import java.io.*;
public class Gobang
{
// 下面三个位图分别代表棋盘、黑子、白子
BufferedImage table;
BufferedImage black;
BufferedImage white;
// 当鼠标移动时候的选择框
BufferedImage selected;
// 定义棋盘的大小
private static int BOARD_SIZE = 15;
// 定义棋盘宽、高多少个像素
private final int TABLE_WIDTH = 535;
private final int TABLE_HETGHT = 536;
// 定义棋盘坐标的像素值和棋盘数组之间的比率。
private final int RATE = TABLE_WIDTH / BOARD_SIZE;
// 定义棋盘坐标的像素值和棋盘数组之间的偏移距。
private final int X_OFFSET = 5;
private final int Y_OFFSET = 6;
// 定义一个二维数组来充当棋盘
private String[][] board = new String[BOARD_SIZE][BOARD_SIZE];
// 五子棋游戏的窗口
JFrame f = new JFrame("五子棋游戏");
// 五子棋游戏棋盘对应的Canvas组件
ChessBoard chessBoard = new ChessBoard();
// 当前选中点的坐标
private int selectedX = -1;
private int selectedY = -1;
public void init()throws Exception
{
table = ImageIO.read(new File("image/board.jpg"));
black = ImageIO.read(new File("image/black.gif"));
white = ImageIO.read(new File("image/white.gif"));
selected = ImageIO.read(new File("image/selected.gif"));
// 把每个元素赋为"╋","╋"代表没有棋子
for (int i = 0 ; i < BOARD_SIZE ; i++)
{
for ( int j = 0 ; j < BOARD_SIZE ; j++)
{
board[i][j] = "╋";
}
}
chessBoard.setPreferredSize(new Dimension(
TABLE_WIDTH , TABLE_HETGHT));
chessBoard.addMouseListener(new MouseAdapter()
{
public void mouseClicked(MouseEvent e)
{
// 将用户鼠标事件的坐标转换成棋子数组的坐标。
int xPos = (int)((e.getX() - X_OFFSET) / RATE);
int yPos = (int)((e.getY() - Y_OFFSET ) / RATE);
board[xPos][yPos] = "●";
/*
电脑随机生成两个整数,作为电脑下棋的坐标,赋给board数组。
还涉及:
1.如果下棋的点已经有棋子,不能重复下棋。
2.每次下棋后,需要扫描谁赢了
*/
chessBoard.repaint();
}
// 当鼠标退出棋盘区后,复位选中点坐标
public void mouseExited(MouseEvent e)
{
selectedX = -1;
selectedY = -1;
chessBoard.repaint();
}
});
chessBoard.addMouseMotionListener(new MouseMotionAdapter()
{
// 当鼠标移动时,改变选中点的坐标
public void mouseMoved(MouseEvent e)
{
selectedX = (e.getX() - X_OFFSET) / RATE;
selectedY = (e.getY() - Y_OFFSET) / RATE;
chessBoard.repaint();
}
});
f.add(chessBoard);
f.pack();
f.setVisible(true);
}
public static void main(String[] args)throws Exception
{
Gobang gb = new Gobang();
gb.init();
}
class ChessBoard extends JPanel
{
// 重写JPanel的paint方法,实现绘画
public void paint(Graphics g)
{
// 将绘制五子棋棋盘
g.drawImage(table , 0 , 0 , null);
// 绘制选中点的红框
if (selectedX >= 0 && selectedY >= 0)
g.drawImage(selected , selectedX * RATE + X_OFFSET ,
selectedY * RATE + Y_OFFSET, null);
// 遍历数组,绘制棋子。
for (int i = 0 ; i < BOARD_SIZE ; i++)
{
for ( int j = 0 ; j < BOARD_SIZE ; j++)
{
// 绘制黑棋
if (board[i][j].equals("●"))
{
g.drawImage(black , i * RATE + X_OFFSET
, j * RATE + Y_OFFSET, null);
}
// 绘制白棋
if (board[i][j].equals("○"))
{
g.drawImage(white, i * RATE + X_OFFSET
, j * RATE + Y_OFFSET, null);
}
}
}
}
}
}
手绘
package ch11;
import java.awt.*;
import java.awt.event.*;
import java.awt.image.*;
public class HandDraw
{
// 画图区的宽度
private final int AREA_WIDTH = 500;
// 画图区的高度
private final int AREA_HEIGHT = 400;
// 下面的preX、preY保存了上一次鼠标拖动事件的鼠标坐标
private int preX = -1;
private int preY = -1;
// 定义一个右键菜单用于设置画笔颜色
PopupMenu pop = new PopupMenu();
MenuItem redItem = new MenuItem("红色");
MenuItem greenItem = new MenuItem("绿色");
MenuItem blueItem = new MenuItem("蓝色");
// 定义一个BufferedImage对象
BufferedImage image = new BufferedImage(AREA_WIDTH
, AREA_HEIGHT , BufferedImage.TYPE_INT_RGB);
// 获取image对象的Graphics
Graphics g = image.getGraphics();
private Frame f = new Frame("简单手绘程序");
private DrawCanvas drawArea = new DrawCanvas();
// 用于保存画笔颜色
private Color foreColor = new Color(255, 0 ,0);
public void init()
{
// 定义右键菜单的事件监听器。
ActionListener menuListener = e ->
{
if (e.getActionCommand().equals("绿色"))
{
foreColor = new Color(0 , 255 , 0);
}
if (e.getActionCommand().equals("红色"))
{
foreColor = new Color(255 , 0 , 0);
}
if (e.getActionCommand().equals("蓝色"))
{
foreColor = new Color(0 , 0 , 255);
}
};
// 为三个菜单添加事件监听器
redItem.addActionListener(menuListener);
greenItem.addActionListener(menuListener);
blueItem.addActionListener(menuListener);
// 将菜单项组合成右键菜单
pop.add(redItem);
pop.add(greenItem);
pop.add(blueItem);
// 将右键菜单添加到drawArea对象中
drawArea.add(pop);
// 将image对象的背景色填充成白色
g.fillRect(0 , 0 ,AREA_WIDTH , AREA_HEIGHT);
drawArea.setPreferredSize(new Dimension(AREA_WIDTH , AREA_HEIGHT));
// 监听鼠标移动动作
drawArea.addMouseMotionListener(new MouseMotionAdapter()
{
// 实现按下鼠标键并拖动的事件处理器
public void mouseDragged(MouseEvent e)
{
// 如果preX和preY大于0
if (preX > 0 && preY > 0)
{
// 设置当前颜色
g.setColor(foreColor);
// 绘制从上一次鼠标拖动事件点到本次鼠标拖动事件点的线段
g.drawLine(preX , preY , e.getX() , e.getY());
}
// 将当前鼠标事件点的X、Y坐标保存起来
preX = e.getX();
preY = e.getY();
// 重绘drawArea对象
drawArea.repaint();
}
});
// 监听鼠标事件
drawArea.addMouseListener(new MouseAdapter()
{
// 实现鼠标松开的事件处理器
public void mouseReleased(MouseEvent e)
{
// 弹出右键菜单
if (e.isPopupTrigger())
{
pop.show(drawArea , e.getX() , e.getY());
}
// 松开鼠标键时,把上一次鼠标拖动事件的X、Y坐标设为-1。
preX = -1;
preY = -1;
}
});
f.add(drawArea);
f.pack();
f.setVisible(true);
}
public static void main(String[] args)
{
new HandDraw().init();
}
class DrawCanvas extends Canvas
{
// 重写Canvas的paint方法,实现绘画
public void paint(Graphics g)
{
// 将image绘制到该组件上
g.drawImage(image , 0 , 0 , null);
}
}
}
弹球游戏
package ch11;
/**
* Created by Jiqing on 2016/12/4.
*/
import java.util.Random;
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
public class PinBall
{
// 桌面的宽度
private final int TABLE_WIDTH = 300;
// 桌面的高度
private final int TABLE_HEIGHT = 400;
// 球拍的垂直位置
private final int RACKET_Y = 340;
// 下面定义球拍的高度和宽度
private final int RACKET_HEIGHT = 20;
private final int RACKET_WIDTH = 60;
// 小球的大小
private final int BALL_SIZE = 16;
private Frame f = new Frame("弹球游戏");
Random rand = new Random();
// 小球纵向的运行速度
private int ySpeed = 10;
// 返回一个-0.5~0.5的比率,用于控制小球的运行方向。
private double xyRate = rand.nextDouble() - 0.5;
// 小球横向的运行速度
private int xSpeed = (int)(ySpeed * xyRate * 2);
// ballX和ballY代表小球的坐标
private int ballX = rand.nextInt(200) + 20;
private int ballY = rand.nextInt(10) + 20;
// racketX代表球拍的水平位置
private int racketX = rand.nextInt(200);
private MyCanvas tableArea = new MyCanvas();
Timer timer;
// 游戏是否结束的旗标
private boolean isLose = false;
public void init()
{
// 设置桌面区域的最佳大小
tableArea.setPreferredSize(
new Dimension(TABLE_WIDTH , TABLE_HEIGHT));
f.add(tableArea);
// 定义键盘监听器
KeyAdapter keyProcessor = new KeyAdapter()
{
public void keyPressed(KeyEvent ke)
{
// 按下向左、向右键时,球拍水平坐标分别减少、增加
if (ke.getKeyCode() == KeyEvent.VK_LEFT)
{
if (racketX > 0)
racketX -= 10;
}
if (ke.getKeyCode() == KeyEvent.VK_RIGHT)
{
if (racketX < TABLE_WIDTH - RACKET_WIDTH)
racketX += 10;
}
}
};
// 为窗口和tableArea对象分别添加键盘监听器
f.addKeyListener(keyProcessor);
tableArea.addKeyListener(keyProcessor);
// 定义每0.1秒执行一次的事件监听器。
ActionListener taskPerformer = evt ->
{
// 如果小球碰到左边边框
if (ballX <= 0 || ballX >= TABLE_WIDTH - BALL_SIZE)
{
xSpeed = -xSpeed;
}
// 如果小球高度超出了球拍位置,且横向不在球拍范围之内,游戏结束。
if (ballY >= RACKET_Y - BALL_SIZE &&
(ballX < racketX || ballX > racketX + RACKET_WIDTH))
{
timer.stop();
// 设置游戏是否结束的旗标为true。
isLose = true;
tableArea.repaint();
}
// 如果小球位于球拍之内,且到达球拍位置,小球反弹
else if (ballY <= 0 ||
(ballY >= RACKET_Y - BALL_SIZE
&& ballX > racketX && ballX <= racketX + RACKET_WIDTH))
{
ySpeed = -ySpeed;
}
// 小球坐标增加
ballY += ySpeed;
ballX += xSpeed;
tableArea.repaint();
};
timer = new Timer(100, taskPerformer);
timer.start();
f.pack();
f.setVisible(true);
}
public static void main(String[] args)
{
new PinBall().init();
}
class MyCanvas extends Canvas
{
// 重写Canvas的paint方法,实现绘画
public void paint(Graphics g)
{
// 如果游戏已经结束
if (isLose)
{
g.setColor(new Color(255, 0, 0));
g.setFont(new Font("Times" , Font.BOLD, 30));
g.drawString("游戏已结束!" , 50 ,200);
}
// 如果游戏还未结束
else
{
// 设置颜色,并绘制小球
g.setColor(new Color(240, 240, 80));
g.fillOval(ballX , ballY , BALL_SIZE, BALL_SIZE);
// 设置颜色,并绘制球拍
g.setColor(new Color(80, 80, 200));
g.fillRect(racketX , RACKET_Y
, RACKET_WIDTH , RACKET_HEIGHT);
}
}
}
}
剪贴板
package ch11;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.awt.datatransfer.*;
/**
* Created by Jiqing on 2016/12/4.
*/
public class SimpleClipboard {
// 剪贴板
private Frame f = new Frame("简单的剪贴板程序");
private Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
// 定义用于复制的文本框
private TextArea jtaCopyTo = new TextArea(5,20);
private TextArea jtaPaste = new TextArea(5,20);
private Button btCopy = new Button("复制");
private Button btPaste = new Button("粘贴");
public void init() {
Panel p = new Panel();
p.add(btCopy);
p.add(btPaste);
btCopy.addActionListener(event ->{
StringSelection contents = new StringSelection(jtaCopyTo.getText());
clipboard.setContents(contents,null);
});
btPaste.addActionListener(event ->{
if (clipboard.isDataFlavorAvailable(DataFlavor.stringFlavor)) {
try {
String content = (String)clipboard.getData(DataFlavor.stringFlavor);
jtaPaste.append(content);
} catch (Exception e) {
e.printStackTrace();
}
}
});
Box box = new Box(BoxLayout.X_AXIS);
box.add(jtaCopyTo);
box.add(jtaPaste);
f.add(p,BorderLayout.SOUTH);
f.add(box,BorderLayout.CENTER);
f.pack();
f.setVisible(true);
}
public static void main(String[] args) {
new SimpleClipboard().init();
}
}
监听
package ch11;
import java.awt.*;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
/**
* Created by Jiqing on 2016/12/3.
*/
public class WindowListenerTest {
private Frame f = new Frame("测试");
private TextArea ta = new TextArea(6,40);
public void init() {
// 为窗口添加窗口事件监听器
f.addWindowListener(new MyListener());
f.add(ta);
f.pack();
f.setVisible(true);
}
// 实现一个窗口监听器类
class MyListener implements WindowListener {
public void windowActivated(WindowEvent e) {
ta.append("窗口被激活!\n");
}
public void windowClosed(WindowEvent e) {
ta.append("窗口被成功关闭!\n");
}
public void windowClosing(WindowEvent e) {
ta.append("用户关闭窗口!\n");
System.exit(0);
}
public void windowDeactivated(WindowEvent e) {
ta.append("窗口失去焦点!\n");
}
public void windowDeiconified(WindowEvent e) {
ta.append("窗口被恢复!\n");
}
public void windowIconified(WindowEvent e) {
ta.append("窗口被最小化!\n");
}
public void windowOpened(WindowEvent e) {
ta.append("窗口初次被打开!\n");
}
}
public static void main(String[] args) {
new WindowListenerTest().init();
}
}
适配器
package ch11;
import java.awt.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
/**
* Created by Jiqing on 2016/12/4.
*/
public class WindowAdapterTest {
private Frame f = new Frame("测试");
private TextArea ta = new TextArea(6,40);
public void init() {
f.addWindowListener(new MyListener());
f.add(ta);
f.pack();
f.setVisible(true);
}
class MyListener extends WindowAdapter{
public void windowClosing(WindowEvent e) {
System.out.println("用户关闭窗口!\n");
System.exit(0);
}
}
public static void main(String[] args) {
new WindowAdapterTest().init();
}
}
Java中的AWT进阶的更多相关文章
- Java中的NIO进阶
目录 前言 NIO与多线程 Readable和Writeable的空触发 请求与返回的处理 事件的处理机制 NIO多线程使用的一个例子 前言 之前一篇文章简单介绍了NIO,并附了一个简单的例子,但是自 ...
- Java进阶(四十二)Java中多线程使用匿名内部类的方式进行创建3种方式
Java中多线程使用匿名内部类的方式进行创建3种方式 package cn.edu.ujn.demo; // 匿名内部类的格式: public class ThreadDemo { public st ...
- JAVA中AWT编程
JAVA使用AWT和Swing 类完成图形用户界面编程,AWT全称是抽象窗口工具集(Abstract Window Toolkit),它是最早的sun提供的GUI库(Graphics User Int ...
- Java中的Swing及AWT又称GUI编程
Java中的Swing及AWT又称GUI编程. 关于学习Java要不要学Swing及AWT,这个完全取决于个人的开发及发展方向. 如果从事web方向的开发,则可以不用学习Swing及AWT. 如果从事 ...
- java中 awt Graphics2D
Graphics2D ,Graphics 类,提供了对几何形状.坐标转换.颜色管理和文本布局更为复杂的控制.它是用于在 Java(tm) 平台上呈现二维形状.文本和图像的基础类.验证码生成可以用到此类 ...
- Java中AWT、Swing与SWT三大GUI技术的原理与效率差异
Java中AWT.Swing与SWT三大GUI技术的原理与效率差异 转 https://blog.csdn.net/weixin_37703598/article/details/81843810 ...
- [Java 进阶]Java中的国际化
背景知识 现代软件开发,往往做出的应用程序不止给一个国家的人去使用.不同国家的人往往存在语言文字不通的问题.由此产生了国际化(internationalization).多语言(multi-langu ...
- JAVA中一些需要记录的知识点(进阶部分)···持续更新
1.JAVA中的相对路径 file = new file("")与file = new file("./")方式相同,该路径为整个project的根目录(实际上 ...
- Java进阶(二十三)java中long类型转换为int类型
java中long类型转换为int类型 由int类型转换为long类型是向上转换,可以直接进行隐式转换,但由long类型转换为int类型是向下转换,可能会出现数据溢出情况: 主要以下几种转换方法,供参 ...
随机推荐
- 20145227 《Java程序设计》第7周学习总结
20145227 <Java程序设计>第7周学习总结 教材学习内容总结 第十二章 Lambda 如果使用JDK8的话,可以使用Lambda特性去除重复的信息. 在只有Lambda表达式的情 ...
- hbase 停止regionserver
每个regionserver节点可以自由启动或停止,可以不随hbase整体一起. 停止后regionserver上的数据会被移到其他regionserver上,不影响hbase的使用. 停止reg ...
- android Activity的启动模式
Android中Activity启动模式详解 在Android中每个界面都是一个Activity,切换界面操作其实是多个不同Activity之间的实例化操作.在Android中Activity的启 ...
- Matlab的libsvm的安装
最关键的是compilers的选择(对于把Microsoft visual stdio 2005或者其他的编译器安装在自定义目录下的这一步非常关键) 以下是步骤:>> mex -setu ...
- c#之财务系统数据库
财务收费系统补充数据库表 1. 学生表(F_Student) 名称 代码 数据类型 强制性的 ID s_ID int TRUE 学生姓名 Stu_name varchar (50) TRUE 身份证 ...
- Poj(2679),SPFA,二级比较
题目链接:http://poj.org/problem?id=2679 嗯,思路清晰,先DFS看是不是通路,接着就是SPFA找最短路(路是费用,费用相同就比较路的长度). 超哥的代码还有一点问题,初始 ...
- js的 image 属性 和一个预加载模块
创建一个Image对象:var a=new Image(); 定义Image对象的src: a.src=”xxx.gif”; 这样做就相当于给浏览器缓存了一张图片. 图像对象: 建立图像对 ...
- 窗体移动API
//窗体移动API [DllImport("user32.dll")] public static extern bool ReleaseCapture(); [DllImport ...
- JavaScript编写简单的抽奖程序
1.需求说明 某公司年终抽奖,需要有如下功能 1)可以根据实际情况设置到场人数的最大值 2) 点击“开始”,大屏幕滚动,点击“停止”,获奖者的编号出现在大屏幕上 3)在界面里显示全部奖项获奖人编号 4 ...
- .Net用户控件
用户控件用户控件是个什么东西?自定义的反复重用的控件集合 好处?1.代码重用2.结构良好3.分工开发4.局部缓存 难点:一.交换信息: 注意信息的交换只在相邻层之间进行交换,如果是嵌套交换信息除Ses ...