Java - Swing

创建基本窗口

也可写为:
(1)建立一个Panel
(2)向Panel中添加组件
(3)建立窗口,将刚创建的Panel添加进去

// 1. 创建一个顶层容器(窗口)
JFrame jf = new JFrame("测试窗口"); // 创建窗口
jf.setSize(400, 400); // 设置窗口大小
jf.setLocationRelativeTo(null); // 把窗口位置设置到屏幕中心
jf.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); // 当点击窗口的关闭按钮时退出程序(没有这一句,程序不会退出)
// 2. 创建中间容器(面板容器)
JPanel panel = new JPanel(); // 创建面板容器,使用默认的布局管理器
// 3. 创建一个基本组件(按钮),并添加到 面板容器 中
JButton btn = new JButton("测试按钮");
panel.add(btn);
// 4. 把 面板容器 作为窗口的内容面板 设置到 窗口
jf.setContentPane(panel);
// 5. 显示窗口,前面创建的信息都在内存中,通过 jf.setVisible(true) 把内存中的窗口显示在屏幕上。
jf.setVisible(true);

JFrame常用:

setContentPane(panel);//设置面板容器
setSize(400, 400);
setLocationRelativeTo(null);//定位在屏幕中间
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);//关闭事件
setVisible(true);//可见
panel.requestFocus();// 和上一句不能反,使JPanel获得焦点,这样JPanel就能响应键盘事件

JPanel:

panel = new JPanel();
panel.setLayout(null);//不写这个无法使用setBound

图片裁剪

通过将裁剪后的图片存入新文件实现

// 1,将原图片读入BufferedImage
BufferedImage image = ImageIO.read(new FileInputStream("images//woman.png"));
int w = image.getWidth(), h = image.getHeight();
// 2,使用getSubimage裁剪,四个参数构成一个矩形(x,y,w,h)
image = image.getSubimage(0, 0, w / 3, h / 4);
// 3,将BufferedImage写入新文件,运行程序后可发现文件变为裁剪后的图片
// 第一个参数为BufferedImage实例,第二个参数为文件后缀,第三个参数为新文件路径
ImageIO.write(image, "png", new File("images//woman0.png"));

// 将裁剪后的图片放在label上显示
JLabel label = new JLabel(new ImageIcon("images//woman0.png"));
label.setBounds(10, 10, w / 3, h / 4);
panel.add(label);

图片放缩

依然是产生新的图片文件的方式

// 1,将原图片读入srcImage,并建一个newImage用于存储缩小后的文件
BufferedImage srcImage = ImageIO.read(new FileInputStream("images//tmp.png"));
BufferedImage newImage = new BufferedImage(50, 50, BufferedImage.TYPE_INT_RGB);
// 2,使用bufferedImage.getGraphics创建实例
Graphics graphics = newImage.getGraphics();
// 3,绘制放大后的图//这里绘制的过程中newImage被改变
graphics.drawImage(srcImage, 0, 0, 50, 50, null);
// 4,将产生的新newImage存入文件
ImageIO.write(newImage, "jpg", new File("images//tmp.png"));

添加键盘事件

注:JPanel类只有获得焦点才能相应键盘事件,焦点默认在JFrame

jf.addKeyListener(new KeyListener() {
	@Override
	public void keyTyped(KeyEvent e) {
		// 键被击中触发
	}
	@Override
	public void keyReleased(KeyEvent e) {
		// 键被释放触发
	}
	@Override
	public void keyPressed(KeyEvent e) {
		// 键被按下触发
		if (e.getKeyCode() == KeyEvent.VK_DOWN);
	}
});

多个键盘事件响应

比如玩家一方向键为键盘方向键,玩家二方向键为WASD

@Override
public void keyReleased(KeyEvent e) {
	int i = e.getKeyCode();
	switch (i) {
	case KeyEvent.VK_LEFT:
		left = false;
		break;
	case KeyEvent.VK_UP:
		up = false;
		break;
	case KeyEvent.VK_DOWN:
		down = false;
		break;
	case KeyEvent.VK_RIGHT:
		right = false;
		break;
	case KeyEvent.VK_W:
		up2 = false;
		break;
	case KeyEvent.VK_S:
		down2 = false;
		break;
	case KeyEvent.VK_A:
		left2 = false;
		break;
	case KeyEvent.VK_D:
		right2 = false;
		break;
	}
}

@Override
public void keyPressed(KeyEvent e) {
	int i = e.getKeyCode();
	switch (i) {
	case KeyEvent.VK_LEFT:
		left = true;
		break;
	case KeyEvent.VK_UP:
		up = true;
		break;
	case KeyEvent.VK_DOWN:
		down = true;
		break;
	case KeyEvent.VK_RIGHT:
		right = true;
		break;
	case KeyEvent.VK_W:
		up2 = true;
		break;
	case KeyEvent.VK_S:
		down2 = true;
		break;
	case KeyEvent.VK_A:
		left2 = true;
		break;
	case KeyEvent.VK_D:
		right2 = true;
		break;
	}
	if (up == true)
		player1.update(0, -1);
	if (up2 == true)
		player2.update(0, -1);
	if (down == true)
		player1.update(0, 1);
	if (down2 == true)
		player2.update(0, 1);
	if (left == true)
		player1.update(-1, 0);
	if (left2 == true)
		player2.update(-1, 0);
	if (right == true)
		player1.update(1, 0);
	if (right2 == true)
		player2.update(1, 0);
	repaint();
}

固定位置播放一系列图片

package test;

import java.awt.Graphics;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.WindowConstants;

public class Main extends JPanel implements Runnable {
	/**
	 * 在固定位置循环播放图片
	 */
	private static final long serialVersionUID = 1L;
	int id = 0;
	static int x = 10, y = 10;

	@Override
	public void paint(Graphics g) {
		super.paint(g);
		String filePath = "images//boom//boom" + id + ".png";
		try {
			g.drawImage(ImageIO.read(new File(filePath)), x, y, 50, 50, null);
			g.drawImage(ImageIO.read(new File(filePath)), x + 50, y, 50, 50, null);
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	public static void main(String[] args) {
		JFrame jf = new JFrame("测试");
		Main panel = new Main();
		new Thread(panel).start();
		x += 50;
		y += 50;
		jf.setContentPane(panel);// 设置面板容器
		jf.setSize(400, 400);
		jf.setLocationRelativeTo(null);// 定位在屏幕中间
		jf.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);// 关闭事件
		jf.setVisible(true);// 可见

	}

	@Override
	public void run() {
		for (id = 0; id < 7; ++id) {
			repaint();
			try {
				if (id == 0)
					Thread.sleep(200);
				else
					Thread.sleep(100);
			} catch (Exception e) {
				e.printStackTrace();
			}
		}

	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值