在 Web 開發中,JavaScript 啟動快、編寫簡單、與文件結合緊密,但功能受限;Java Applet 功能強大、靈活度高,卻編寫複雜且無法直接在文件中修改。將兩者結合,可發揮各自優勢,達成最佳效果。
import java.awt.*;
import java.applet.*;
public class HelloWorld1 extends Applet {
public String text = "Hello World!"; // 必須宣告為 public
public void paint(Graphics g) {
g.drawString(text, 20, 20);
}
}
<html>
<head><title>範例</title></head>
<body>
<script language="JavaScript">
<!--
function SetText() {
document.app.text = "世界你好!"; // 直接修改 public 變數
document.app.repaint(); // 必須呼叫 repaint() 刷新顯示
}
//-->
</script>
<applet code="HelloWorld1.class" width="100" height="28" name="app">
</applet>
<form>
<input type="button" value="請點擊這裡" onclick="SetText()">
</form>
</body>
</html>
原理解析:Java 預設屬性為 private,需宣告 public 讓 JavaScript 存取。repaint() 是繼承自 Applet 父類別的方法,負責觸發重繪。
直接修改內部變數屬於破壞封裝,較佳做法是提供公開方法。
public class HelloWorld2 extends Applet {
String text = "Hello World!"; // 移除 public,恢復封裝
public void paint(Graphics g) {
g.drawString(text, 20, 20);
}
// 提供公開方法供外部呼叫
public void SetString(String newString) {
text = newString;
repaint(); // 內部自動刷新,外部無需呼叫
}
}
<script language="JavaScript">
<!--
function SetText() {
document.app.SetString("世界你好!"); // 呼叫公開方法
// 不再需要手動呼叫 repaint()
}
//-->
</script>
<applet code="HelloWorld2.class" width="100" height="28" name="app"></applet>
| 方案 | 優點 | 缺點 | 建議 |
|---|---|---|---|
| 直接存取變數 | 簡單直接 | 破壞封裝、需手動 repaint、易造成狀態不一致 | 僅供教學測試 |
| 公開方法封裝 | 符合 OOP 封裝原則、內部自動管理狀態、安全可靠 | 略增加程式碼量 | 生產環境首選 |
瀏覽器對同名 Applet 常使用快取,開發測試時建議更換類別名稱(如 HelloWorld1 → HelloWorld2)避免載入舊版本。