將示範元件標準化為 JPanel 子類別,透過統一啟動器嵌入 JFrame 顯示,簡化測試與展示流程。
package c13.swing;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class Show {
public static void inFrame(JPanel panel, int width, int height) {
// 從類別名稱產生視窗標題
String title = panel.getClass().toString();
if (title.indexOf("class") != -1) title = title.substring(6);
JFrame frame = new JFrame(title);
frame.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) { System.exit(0); }
});
frame.getContentPane().add(panel, BorderLayout.CENTER);
frame.setSize(width, height);
frame.setVisible(true);
}
}
package c13.swing;
import javax.swing.*;
import java.awt.*;
public class MyDemo extends JPanel {
public MyDemo() {
// 初始化 UI 元件、佈局、事件
setLayout(new BorderLayout());
add(new JLabel("Hello Swing!"), BorderLayout.CENTER);
}
public static void main(String[] args) {
// 寬 500、高 300
Show.inFrame(new MyDemo(), 500, 300);
}
}
| 特性 | 說明 |
|---|---|
| 元件復用 | JPanel 可嵌入其他容器 (Applet、Dialog、另一 JPanel) |
| 關注點分離 | Demo 邏輯與視窗管理分離 |
| 標準化啟動 | 所有 Demo 共用同一進入點模式 |
| RTTI 動態標題 | 自動從類別名稱產生視窗標題 |
| 關閉處理 | 統一 windowClosing → System.exit(0) |
public class Show {
public static void inFrame(JPanel panel, int w, int h) { inFrame(panel, w, h, null); }
public static void inFrame(JPanel panel, int w, int h, String[] appletArgs) {
String title = panel.getClass().getSimpleName(); // 更簡潔
JFrame frame = new JFrame(title);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // JDK 1.3+
frame.getContentPane().add(panel, BorderLayout.CENTER);
frame.setSize(w, h);
frame.setLocationRelativeTo(null); // 置中
frame.setVisible(true);
}
// Applet 模式啟動
public static void inApplet(JPanel panel, int w, int h) {
// 嵌入 JApplet 並 init/start
}
}