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

Java Applet 進階實戰 (六):圖片/聲音載入、字體色彩控制、JDBC-ODBC 資料庫訪問與 ODBC 配置

     編輯:Java 相關知識

前言:Applet 多媒體與資料能力全解鎖

第六天課程聚焦 Applet 的「豐富客戶端」能力:跨網絡載入圖片/聲音、精細控制字體色彩、突破沙箱訪問本地/遠程資料庫。雖然 Applet 技術已退出歷史舞台,但其資源載入模型、繪圖管線、JDBC 抽象層的設計思想,仍深刻影響現代 Java 客戶端 (JavaFX/Swing) 與 Web 資源加載機制。

一、圖片文件載入與繪製

支援格式

  • GIF (含動畫首幀)、JPEG — 不支援 BMP (需自行轉碼或用 ImageIO 讀取)。

核心 API:getImage()

類別方法簽名適用場景
java.applet.AppletImage getImage(URL url)
Image getImage(URL base, String name)
Applet 內部,相對 codeBase/documentBase
java.awt.ToolkitImage getImage(String filename)
Image getImage(URL url)
應用程式 (Application) 或通用工具類

URL 來源靈活多樣

// 本地文件 (file 協議)
URL url1 = new URL("file:/d:/image/pic1.gif");

// 遠程 HTTP 資源
URL url2 = new URL("https://abc.cde.edu.cn/applet/pic2.jpg");

// 相對於 Applet 所在頁面 (codeBase)
Image img3 = getImage(getCodeBase(), "p1.jpg");

關鍵點:getCodeBase() 返回 Applet 類文件所在目錄 URL;getDocumentBase() 返回嵌入 Applet 的 HTML 頁面 URL。網絡資源載入無需額外網絡代碼,瀏覽器自動處理連線與緩存。

繪製與縮放

// 基本繪製
g.drawImage(image1, x, y, this);  // this = ImageObserver (Applet/Component)

// 指定寬高 (縮放/拉伸)
g.drawImage(image1, x, y, width, height, this);

// 指定背景色 (透明區域填充)
g.drawImage(image1, x, y, width, height, Color.blue, this);

ImageObserver 回調機制確保圖片異步載入完成後自動重繪,無需手動輪詢。

二、聲音文件載入與播放

僅支援格式

  • AU (Sun Audio) — 需將 WAV/MP3 轉碼為 AU (8/16-bit, mono/stereo, μ-law/PCM)。

API:java.applet.AudioClip

import java.applet.AudioClip;

AudioClip bgSound = getAudioClip(url);  // 同步載入 (輕量)
bgSound.play();      // 播放一次
bgSound.loop();      // 循環播放
bgSound.stop();      // 停止

// 一次性載入並播放 (無需保存引用)
play(getCodeBase(), "audio/welcome.au");

URL 用法與圖片完全一致。注意:Applet 沙箱限制,只能載入同源 (codeBase/documentBase) 或簽名授權的音頻資源。

三、字體與色彩精細控制

Font 物件構建

Font myFont = new Font("標楷體", Font.BOLD, 14);  // 名稱、風格、磅值
// 風格常量:Font.PLAIN (正常)、Font.BOLD (粗體)、Font.ITALIC (斜體)、可位或組合

套用至 Graphics

Font oldFont = g.getFont();  // 保存原字體
g.setFont(myFont);
g.drawString("文字", x, y);
g.setFont(oldFont);  // 恢復,良好習慣

Color 物件構建 (RGB 模式)

Color myColor = new Color(0, 0, 255);  // 紅、綠、藍 0-255
// 或十六進制
Color myColor = new Color(0x0000FF);

從 HTML 參數動態獲取樣式

// HTML
<param name=red value=255>
<param name=green value=0>
<param name=blue value=0>

// Java
String[] para = {"red","green","blue"};
int[] rgb = new int[3];
for (int i=0; i<3; i++) rgb[i] = Integer.parseInt(getParameter(para[i]));
g.setColor(new Color(rgb[0], rgb[1], rgb[2]));

完整範例:字體風格矩陣展示

public void paint(Graphics g) {
    String[] fonts = {"新細明體","標楷體","微軟正黑體"};
    String[] styles = {"PLAIN","BOLD","ITALIC"};
    int[] styleVals = {Font.PLAIN, Font.BOLD, Font.ITALIC};

    Font old = g.getFont();
    for (int i=0; i<3; i++) {
        for (int j=0; j<3; j++) {
            g.setFont(new Font(fonts[i], styleVals[j], 12));
            g.drawString("請注意變化 " + fonts[i] + " " + styles[j], 20, 20*(i*3+j+1));
        }
    }
    g.setFont(old);
    // 色彩示範同上...
}

四、JDBC-ODBC 橋接訪問 Access 資料庫

場景:Applet 讀取本機/局域網 Access (.mdb) 資料庫顯示於 TextArea。前提:已配置系統 ODBC 資料源名 (DSN)。

核心類別與職責

類別職責
Connection資料庫連線物件,DriverManager.getConnection() 獲取
Statement執行靜態 SQL 語句
ResultSet查詢結果集游標
ResultSetMetaData結果集結構資訊 (列數、列名、類型)

連線字串格式

jdbc:odbc:<DSN名稱>  // ODBC 資料源
// 範例
String dsn = "jdbc:odbc:MyAccess";

完整操作流程

// 1. 變量宣告
TextArea dataArea = new TextArea(6, 80);
TextField statusBar = new TextField("", 80);
Connection conn;
Statement stmt;
ResultSet rs;
ResultSetMetaData meta;

public void init() {
    add(dataArea); add(statusBar);
    dataArea.setEditable(false); statusBar.setEditable(false);
    openConnection();
    execSqlCommand("SELECT * FROM MyTable");
    closeConnection();
}

public void openConnection() {
    String dsn = "jdbc:odbc:MyAccess";
    String user = "", pwd = "";
    try {
        Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");  // 載入驅動
        conn = DriverManager.getConnection(dsn, user, pwd);
        statusBar.setText("Status: OK");
    } catch (Exception e) { handleException(e); }
}

public void execSqlCommand(String sql) {
    try {
        stmt = conn.createStatement();
        rs = stmt.executeQuery(sql);
        meta = rs.getMetaData();
        int cols = meta.getColumnCount();
        dataArea.setText("");
        while (rs.next()) {
            for (int i=1; i<=cols; i++) {
                String val = rs.getString(i);
                dataArea.append((val==null?"":val) + ";");
            }
            dataArea.append("\n");
        }
    } catch (Exception e) { handleException(e); }
}

public void closeConnection() {
    try { if (conn!=null) conn.close(); }
    catch (Exception e) { handleException(e); }
}

public void handleException(Exception e) {
    statusBar.setText("Error: " + e.getMessage());
    e.printStackTrace();
    if (e instanceof SQLException) {
        while ((e = ((SQLException)e).getNextException()) != null)
            System.out.println(e);
    }
}

五、Windows ODBC 資料源配置 (DSN) 步驟

  1. 控制台 → ODBC 資料來源 (32/64 位對應 JVM 位數) → 系統 DSN 標籤 → 新增。
  2. 選擇 Microsoft Access Driver (*.mdb, *.accdb) → 完成。
  3. 資料源名稱:MyAccess (與程式 jdbc:odbc:MyAccess 一致)。
  4. 描述:任意。
  5. 選擇 → 瀏覽選中 .mdb / .accdb 檔案 → 確定。
  6. (可選) 進階 → 設定登入名/密碼 (若資料庫有密碼)。
  7. 確定完成,系統 DSN 列表出現 MyAccess。

關鍵提醒:

  • JVM 位數 (32/64-bit) 必須與 ODBC 驅動位數一致,否則 ClassNotFoundException 或 Data source name not found。
  • JDK 8 起移除 JdbcOdbcDriver,現代專案請用 UCanAccess (純 Java) 或 Jackcess 直讀 Access,無需 ODBC。
  • Applet 沙箱限制:未簽名 Applet 無法載入本地驅動/訪問本地文件/開啟 Socket,需 簽名 JAR + 安全策略授權 或改用 JNLP/Web Start (同已淘汰)。

六、現代化遷移指南

Applet 技術現代替代方案
getImage/getAudioClipJavaFX Image/AudioClip、Swing ImageIcon/javax.sound.sampled、Web fetch()/<img>/<audio>
Font/Color/GraphicsJavaFX Font/Paint/GraphicsContext、Swing 同包、CSS/Canvas 2D
JDBC-ODBC BridgeUCanAccess (Access)、JDBC 原生驅動 (MySQL/PostgreSQL/SQL Server)、連接池 (HikariCP)
Applet 沙箱/簽名無沙箱 (桌面應用)、Web 安全模型 (CORS/CSP/HTTPS)、簽名 JAR → 憑證信任
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved