围棋

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进阶的更多相关文章

  1. Java中的NIO进阶

    目录 前言 NIO与多线程 Readable和Writeable的空触发 请求与返回的处理 事件的处理机制 NIO多线程使用的一个例子 前言 之前一篇文章简单介绍了NIO,并附了一个简单的例子,但是自 ...

  2. Java进阶(四十二)Java中多线程使用匿名内部类的方式进行创建3种方式

    Java中多线程使用匿名内部类的方式进行创建3种方式 package cn.edu.ujn.demo; // 匿名内部类的格式: public class ThreadDemo { public st ...

  3. JAVA中AWT编程

    JAVA使用AWT和Swing 类完成图形用户界面编程,AWT全称是抽象窗口工具集(Abstract Window Toolkit),它是最早的sun提供的GUI库(Graphics User Int ...

  4. Java中的Swing及AWT又称GUI编程

    Java中的Swing及AWT又称GUI编程. 关于学习Java要不要学Swing及AWT,这个完全取决于个人的开发及发展方向. 如果从事web方向的开发,则可以不用学习Swing及AWT. 如果从事 ...

  5. java中 awt Graphics2D

    Graphics2D ,Graphics 类,提供了对几何形状.坐标转换.颜色管理和文本布局更为复杂的控制.它是用于在 Java(tm) 平台上呈现二维形状.文本和图像的基础类.验证码生成可以用到此类 ...

  6. Java中AWT、Swing与SWT三大GUI技术的原理与效率差异

    Java中AWT.Swing与SWT三大GUI技术的原理与效率差异 转 https://blog.csdn.net/weixin_37703598/article/details/81843810   ...

  7. [Java 进阶]Java中的国际化

    背景知识 现代软件开发,往往做出的应用程序不止给一个国家的人去使用.不同国家的人往往存在语言文字不通的问题.由此产生了国际化(internationalization).多语言(multi-langu ...

  8. JAVA中一些需要记录的知识点(进阶部分)···持续更新

    1.JAVA中的相对路径 file = new file("")与file = new file("./")方式相同,该路径为整个project的根目录(实际上 ...

  9. Java进阶(二十三)java中long类型转换为int类型

    java中long类型转换为int类型 由int类型转换为long类型是向上转换,可以直接进行隐式转换,但由long类型转换为int类型是向下转换,可能会出现数据溢出情况: 主要以下几种转换方法,供参 ...

随机推荐

  1. source insight项目文件列表固定嵌入右侧

    项目文件列表悬浮出来,不是嵌入紧靠右边,先将该窗口最小化,然后往右拖放,就成功固定嵌入到右边了.

  2. 错误描述: 抱歉,该商品的交易金额与原先的不一致,请重新创建交易付款。 错误代码: TRADE_TOTALFEE_NOT_MATCH

    由于在支付宝最后支付,出现了问题导致未能支付成功,而支付宝已经记录了当前的网站订单号(out_trade_no),所以下次再以同一张订单进行支付时,就必须与之前的金额一致,否则就报上面的错. 解决方法 ...

  3. Children of the Candy Corn 分类: POJ 2015-07-14 08:19 7人阅读 评论(0) 收藏

    Children of the Candy Corn Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 10933   Acce ...

  4. livereload的简单使用

    一/直接使用:npm install -g livereload 全局安装 http-server  起到服务 livereload启动 在html中引入<script src="ht ...

  5. Mysql-学习笔记(==》触发器 十一)

    -------触发器-------- USE db;SELECT FROM sss; CREATE TABLE sssbak LIKE sss;SHOW CREATE TABLE sss;SHOW C ...

  6. 2016年12月12日 星期一 --出埃及记 Exodus 21:7

    2016年12月12日 星期一 --出埃及记 Exodus 21:7 "If a man sells his daughter as a servant, she is not to go ...

  7. 【Java】JDBC连接MySQL

    JDBC连接MySQL 虽然在项目中通常用ORM的框架实现持久化.但经常因测试某些技术的需要,要写一个完整的JDBC查询数据库.写一个在这儿备份. 首先引入驱动包: <dependencies& ...

  8. Duilib将UI资源文件打包到exe教程

    转载:http://www.voidcn.com/blog/w839687571/article/p-6001921.html 转载:http://www.voidcn.com/blog/x35698 ...

  9. 分别向Set集合以及List集合中添加"A"、"a"、"c"、"C"、"a",观察重复值"a"能否添加成功

    package lianxi; import java.util.*; public class JhSet { public static void main(String[] args) { Se ...

  10. HDU 4441 Queue Sequence(splay)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4441 题意:一个数列,三种操作:(1)插入:找到没在当前数列中的最小的正整数i,将其插在位置p之后,并 ...