今天看了事件驅動程序,敲了兩個示例,想着能不能把按鍵事件和鼠標事件使用在同一個對象上。於是在示例代碼上增加了一點改動。
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class Test extends JFrame {
private KeyboardPanel keyboardPanel = new KeyboardPanel();//創建KeyboardPanel的對象
public Test() {
add(keyboardPanel);
keyboardPanel.setFocusable(true);
}
public static void main(String[] args) {
Test frame = new Test();
frame.setTitle("TEST");
frame.setSize(300, 300);
frame.setLocationRelativeTo(null);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
static class KeyboardPanel extends JPanel {
private int x = 100;
private int y = 100;
private char keyChar = 'A';
//KeyboardPanel的無參構造方法
public KeyboardPanel() {
//註冊按鍵事件的匿名類監聽器
addKeyListener(new KeyAdapter() {
public void keyPressed(KeyEvent e) {
switch (e.getKeyCode()) {
case KeyEvent.VK_DOWN:
y += 10;
break;
case KeyEvent.VK_UP:
y -= 10;
break;
case KeyEvent.VK_LEFT:
x -= 10;
break;
case KeyEvent.VK_RIGHT:
x += 10;
break;
default:
keyChar = e.getKeyChar();
}
repaint();
}
});
//註冊鼠標事件的匿名類監聽器
addMouseMotionListener(new MouseMotionAdapter() {
public void mouseDragged(MouseEvent e) {
x = e.getX();
y = e.getY();
repaint();//調用該方法會導致paintComponent方法被調用,這樣就會在該位置顯示新信息;因爲component中己有的圖形發生變化後不會立刻顯示,須使用repaint方法。
}
});
}
protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.setFont(new Font("TimesRoman", Font.PLAIN, 24));
g.drawString(String.valueOf(keyChar), x, y);
}
}
}
好了,現在的效果就是可以用鼠標或者方向鍵來移動所輸入的字符串位置。
參考:JAVA語言程序設計(基礎篇)原書第八版