首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java Swing 鍵盤繪圖實戰:鍵盤事件驅動面板繪製圖形

     編輯:Java 相關知識

核心思路

  • JFrame 承載 JPanel 繪圖面板
  • 面板實現 KeyListener 監聽鍵盤事件
  • 維護 Point2D last 記錄上一點,ArrayList lines 存儲所有線段
  • paintComponent(Graphics g) 遍歷繪製所有線段
  • 方向鍵控制移動增量(Shift 加速),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 等字母鍵控制
        }
    }
}

關鍵技術點

  1. 雙重緩衝:JPanel 默認開啟雙重緩衝,繪圖無閃爍
  2. 焦點管理:setFocusable(true) + 請求焦點,否則鍵盤事件無法接收
  3. Graphics2D:提供精確幾何繪製(Line2D、Point2D)
  4. 增量重繪:僅調用 repaint(),AWT 線程合併重繪請求

效果演示

鍵盤繪圖效果

擴展方向

  • 滑鼠拖拽繪製(MouseMotionListener)
  • 顏色/線寬/形狀選擇工具欄
  • 撤銷/重做(命令模式管理 lines 列表)
  • 圖形序列化保存/加載

總結

Swing 事件驅動模型 + Graphics2D 幾何 API,輕鬆實現交互式繪圖。掌握焦點、監聽器、重繪機制、幾何對象,即可構建豐富圖形編輯器原型。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved