JFrame 承載 JPanel 繪圖面板KeyListener 監聽鍵盤事件Point2D last 記錄上一點,ArrayList lines 存儲所有線段paintComponent(Graphics g) 遍歷繪製所有線段repaint() 觸發重繪
package test;
import java.awt.*;
import java.awt.geom.*;
import java.util.*;
import java.awt.event.*;
import javax.swing.*;
public class test06 {
public static void main(String[] args) {
SketchFrame frame = new SketchFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
}
class SketchFrame extends JFrame {
public SketchFrame() {
setTitle("Java 鍵盤繪圖");
setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT);
SketchPanel panel = new SketchPanel();
getContentPane().add(panel);
}
public static final int DEFAULT_WIDTH = 300;
public static final int DEFAULT_HEIGHT = 200;
}
class SketchPanel extends JPanel {
public SketchPanel() {
last = new Point2D.Double(100, 100);
lines = new ArrayList<>();
addKeyListener(new KeyHandler());
setFocusable(true); // 關鍵:面板可獲取焦點接收鍵盤事件
}
public void add(int dx, int dy) {
Point2D end = new Point2D.Double(last.getX() + dx, last.getY() + dy);
Line2D line = new Line2D.Double(last, end);
lines.add(line);
repaint();
last = end;
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2 = (Graphics2D) g;
for (Line2D line : lines) {
g2.draw(line);
}
}
private Point2D last;
private ArrayList lines;
private static final int SMALL_INCREMENT = 1;
private static final int LARGE_INCREMENT = 5;
private class KeyHandler implements KeyListener {
@Override
public void keyPressed(KeyEvent e) {
int keyCode = e.getKeyCode();
int d = e.isShiftDown() ? LARGE_INCREMENT : SMALL_INCREMENT;
switch (keyCode) {
case KeyEvent.VK_LEFT: add(-d, 0); break;
case KeyEvent.VK_RIGHT: add(d, 0); break;
case KeyEvent.VK_UP: add(0, -d); break;
case KeyEvent.VK_DOWN: add(0, d); break;
}
}
@Override public void keyReleased(KeyEvent e) {}
@Override
public void keyTyped(KeyEvent e) {
char keyChar = e.getKeyChar();
int d = Character.isUpperCase(keyChar) ? LARGE_INCREMENT : SMALL_INCREMENT;
keyChar = Character.toLowerCase(keyChar);
// 可擴展 WASD 等字母鍵控制
}
}
}
JPanel 默認開啟雙重緩衝,繪圖無閃爍setFocusable(true) + 請求焦點,否則鍵盤事件無法接收Line2D、Point2D)repaint(),AWT 線程合併重繪請求
MouseMotionListener)lines 列表)Swing 事件驅動模型 + Graphics2D 幾何 API,輕鬆實現交互式繪圖。掌握焦點、監聽器、重繪機制、幾何對象,即可構建豐富圖形編輯器原型。