java中 方向键_[Java教程]Swing中使用方向键移动图片

[Java教程]Swing中使用方向键移动图片

0 2012-05-02 12:00:09

整个JFrame采用null布局,图片放在Jlabel中,实现了使用键盘上面的方向键控制图片的移动。可以选择方向为上,下,左,右,左上,左下,右上,右下等8个方向,当图片移动到窗口边缘时就不再移动。

bc91bb04e6e9c61e24c974e4440db8f2.gif

KEY枚举:根据按键结果得到的移动方向

HORIZION枚举:键盘上按下的左右方向键(左、右)

VERTICAL枚举:键盘上按下的上下方向键(上、下)

STEP:图片响应按键时移动的单位

怎么响应两个键?

若一个键按下(发出press事件)后没有弹起(未发出release事件)时,按下了另一个键(发出press事件),此时就是两个键同时按下了。

由于按键由程序的枚举量记录,当按下相反方向键时(不是同时按住,也就是说按一个键后弹起了再按另一个),需要将前一次按下的方向记录清除(如:先按了左,然后再按右,此时将左的记录清除)。

1 package com.cnblogs.hyjiacan; 2 3 import java.awt.Color; 4 import java.awt.Point; 5 import java.awt.event.KeyAdapter; 6 import java.awt.event.K

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,这个程序需要使用 Java GUI 库来实现一个可视化界面,并且需要处理键盘事件。我们可以使用 Java Swing 库来实现这个程序。 首先,我们需要引入一些 Java 类库: ```java import java.awt.*; import java.awt.event.*; import javax.swing.*; ``` 然后,我们定义一个 Keyboard 类,继承自 JFrame 类,用于显示键盘和处理键盘事件: ```java public class Keyboard extends JFrame implements KeyListener { private static final long serialVersionUID = 1L; private static final int WIDTH = 500; private static final int HEIGHT = 250; private static final int KEY_SIZE = 50; private static final int KEY_MARGIN = 5; private static final int KEY_OFFSET_X = 30; private static final int KEY_OFFSET_Y = 50; private static final String[] LETTERS = {"Q", "W", "E", "R", "T", "Y", "U", "I", "O", "P", "A", "S", "D", "F", "G", "H", "J", "K", "L", "Z", "X", "C", "V", "B", "N", "M"}; private static final int[] LETTER_X = {KEY_OFFSET_X, KEY_OFFSET_X + KEY_SIZE + KEY_MARGIN, KEY_OFFSET_X + 2 * (KEY_SIZE + KEY_MARGIN), KEY_OFFSET_X + 3 * (KEY_SIZE + KEY_MARGIN), KEY_OFFSET_X + 4 * (KEY_SIZE + KEY_MARGIN), KEY_OFFSET_X + 5 * (KEY_SIZE + KEY_MARGIN), KEY_OFFSET_X + 6 * (KEY_SIZE + KEY_MARGIN), KEY_OFFSET_X + 7 * (KEY_SIZE + KEY_MARGIN), KEY_OFFSET_X + 8 * (KEY_SIZE + KEY_MARGIN), KEY_OFFSET_X + 9 * (KEY_SIZE + KEY_MARGIN), KEY_OFFSET_X + KEY_MARGIN + KEY_SIZE / 2, KEY_OFFSET_X + KEY_SIZE + KEY_MARGIN + KEY_SIZE / 2, KEY_OFFSET_X + 2 * (KEY_SIZE + KEY_MARGIN) + KEY_SIZE / 2, KEY_OFFSET_X + 3 * (KEY_SIZE + KEY_MARGIN) + KEY_SIZE / 2, KEY_OFFSET_X + 4 * (KEY_SIZE + KEY_MARGIN) + KEY_SIZE / 2, KEY_OFFSET_X + 5 * (KEY_SIZE + KEY_MARGIN) + KEY_SIZE / 2, KEY_OFFSET_X + 6 * (KEY_SIZE + KEY_MARGIN) + KEY_SIZE / 2, KEY_OFFSET_X + 7 * (KEY_SIZE + KEY_MARGIN) + KEY_SIZE / 2, KEY_OFFSET_X + 8 * (KEY_SIZE + KEY_MARGIN) + KEY_SIZE / 2, KEY_OFFSET_X + 2 * KEY_MARGIN + KEY_SIZE, KEY_OFFSET_X + 2 * (KEY_SIZE + KEY_MARGIN) + KEY_SIZE, KEY_OFFSET_X + 3 * (KEY_SIZE + KEY_MARGIN) + KEY_SIZE, KEY_OFFSET_X + 4 * (KEY_SIZE + KEY_MARGIN) + KEY_SIZE, KEY_OFFSET_X + 5 * (KEY_SIZE + KEY_MARGIN) + KEY_SIZE, KEY_OFFSET_X + 6 * (KEY_SIZE + KEY_MARGIN) + KEY_SIZE}; private static final int[] LETTER_Y = {KEY_OFFSET_Y, KEY_OFFSET_Y, KEY_OFFSET_Y, KEY_OFFSET_Y, KEY_OFFSET_Y, KEY_OFFSET_Y, KEY_OFFSET_Y, KEY_OFFSET_Y, KEY_OFFSET_Y, KEY_OFFSET_Y, KEY_OFFSET_Y + KEY_SIZE + KEY_MARGIN, KEY_OFFSET_Y + KEY_SIZE + KEY_MARGIN, KEY_OFFSET_Y + KEY_SIZE + KEY_MARGIN, KEY_OFFSET_Y + KEY_SIZE + KEY_MARGIN, KEY_OFFSET_Y + KEY_SIZE + KEY_MARGIN, KEY_OFFSET_Y + KEY_SIZE + KEY_MARGIN, KEY_OFFSET_Y + KEY_SIZE + KEY_MARGIN, KEY_OFFSET_Y + KEY_SIZE + KEY_MARGIN, KEY_OFFSET_Y + KEY_SIZE + KEY_MARGIN, KEY_OFFSET_Y + 2 * (KEY_SIZE + KEY_MARGIN), KEY_OFFSET_Y + 2 * (KEY_SIZE + KEY_MARGIN), KEY_OFFSET_Y + 2 * (KEY_SIZE + KEY_MARGIN), KEY_OFFSET_Y + 2 * (KEY_SIZE + KEY_MARGIN), KEY_OFFSET_Y + 2 * (KEY_SIZE + KEY_MARGIN), KEY_OFFSET_Y + 2 * (KEY_SIZE + KEY_MARGIN)}; private JLabel textLabel; private int currentLetterIndex = 0; private int currentX = LETTER_X[0]; private int currentY = LETTER_Y[0]; public Keyboard() { super("Keyboard"); setSize(WIDTH, HEIGHT); setResizable(false); setLocationRelativeTo(null); JPanel panel = new JPanel(); panel.setLayout(null); add(panel); // 添加键盘按钮 for (int i = 0; i < LETTERS.length; i++) { JButton button = new JButton(LETTERS[i]); button.setSize(KEY_SIZE, KEY_SIZE); button.setLocation(LETTER_X[i], LETTER_Y[i]); button.addKeyListener(this); panel.add(button); } // 添加文本标签 textLabel = new JLabel("", JLabel.CENTER); textLabel.setSize(WIDTH - 2 * KEY_OFFSET_X, 50); textLabel.setLocation(KEY_OFFSET_X, HEIGHT - KEY_OFFSET_Y - 50); panel.add(textLabel); setVisible(true); } @Override public void keyPressed(KeyEvent e) { int keyCode = e.getKeyCode(); switch (keyCode) { case KeyEvent.VK_LEFT: moveLeft(); break; case KeyEvent.VK_RIGHT: moveRight(); break; case KeyEvent.VK_UP: moveUp(); break; case KeyEvent.VK_DOWN: moveDown(); break; default: char c = e.getKeyChar(); setText(currentLetterIndex, c); moveRight(); break; } } @Override public void keyReleased(KeyEvent e) { } @Override public void keyTyped(KeyEvent e) { } private void setText(int index, char c) { StringBuilder sb = new StringBuilder(textLabel.getText()); sb.setCharAt(index, c); textLabel.setText(sb.toString()); } private void moveLeft() { if (currentLetterIndex > 0) { currentLetterIndex--; currentX = LETTER_X[currentLetterIndex]; currentY = LETTER_Y[currentLetterIndex]; textLabel.setForeground(Color.BLACK); } } private void moveRight() { if (currentLetterIndex < LETTERS.length - 1) { currentLetterIndex++; currentX = LETTER_X[currentLetterIndex]; currentY = LETTER_Y[currentLetterIndex]; textLabel.setForeground(Color.BLACK); } } private void moveUp() { currentY -= KEY_SIZE + KEY_MARGIN; if (currentY < KEY_OFFSET_Y) { currentY = KEY_OFFSET_Y; textLabel.setForeground(Color.RED); } } private void moveDown() { currentY += KEY_SIZE + KEY_MARGIN; if (currentY > HEIGHT - KEY_OFFSET_Y - 50) { currentY = HEIGHT - KEY_OFFSET_Y - 50; textLabel.setForeground(Color.RED); } } } ``` 在这个类,我们定义了一些常量,例如键盘按钮的大小、边距和位置,以及字母数组。我们还定义了一个 JLabel 用于显示输入的文本,以及一些变量用于跟踪当前选择的字母和文本的位置。 在构造函数,我们创建一个 JPanel 并将其添加到 JFrame 。然后,我们添加每个键盘按钮,并将其添加到 JPanel 。我们还创建一个 JLabel 并将其添加到 JPanel 。 在 keyPressed() 方法,我们处理键盘事件。如果用户按下字母键,则将该字母添加到文本标签,并将文本标签的位置向右移动一个键的距离。如果用户按下方向键,则将文本标签的位置上下左右移动一个键的距离。 在 setText() 方法,我们使用 StringBuilder 类更新文本标签的字符。 在 moveLeft() 和 moveRight() 方法,我们更新当前选择的字母的位置,并使用 currentLetterIndex 变量来跟踪当前选择的字母的索引。 在 moveUp() 和 moveDown() 方法,我们向上或向下移动文本标签的位置,并检查是否超出了边界。如果超出边界,则将文本标签的颜色设置为红色。 最后,我们可以创建一个 Keyboard 实例来启动程序: ```java public static void main(String[] args) { Keyboard keyboard = new Keyboard(); keyboard.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } ``` 这样,我们就可以使用 Java Swing 编写一个简单的键盘程序。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值