编写java程序,如图所示。按字母键显示不同字母,按方向键,字母移动
时间: 2023-10-23 19:09:39 浏览: 61
移动设备上通过按键首字母获取汉字源代码(已验证)
好的,这个程序需要使用 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 编写一个简单的键盘程序。
阅读全文