创建基本窗口
也可写为:
(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();
}
}
}
}