JTabbedPane / JavaFX TabPane 提供完整視覺元件//: CardLayout1.java
import java.awt.*;
import java.applet.Applet;
class ButtonPanel extends Panel {
ButtonPanel(String id) {
setLayout(new BorderLayout());
add("Center", new Button(id)); // 按鈕填滿整個面板
}
}
public class CardLayout1 extends Applet {
Button first = new Button("First"), second = new Button("Second"), third = new Button("Third");
Panel cards = new Panel();
CardLayout cl = new CardLayout();
public void init() {
setLayout(new BorderLayout()); // Applet 整體布局
// 頂部導航列:FlowLayout
Panel nav = new Panel();
nav.setLayout(new FlowLayout());
nav.add(first); nav.add(second); nav.add(third);
add("North", nav);
// 中央卡片容器
cards.setLayout(cl);
cards.add("First card", new ButtonPanel("The first one"));
cards.add("Second card", new ButtonPanel("The second one"));
cards.add("Third card", new ButtonPanel("The third one"));
add("Center", cards);
}
public boolean action(Event evt, Object arg) {
if (evt.target.equals(first)) cl.first(cards);
else if (evt.target.equals(second)) { cl.first(cards); cl.next(cards); }
else if (evt.target.equals(third)) cl.last(cards);
else return super.action(evt, arg);
return true;
}
} ///:~
BorderLayout (北/中/南)FlowLayout (按鈕水平排列)CardLayout (疊放切換)ButtonPanel 內部用 BorderLayout 置中單一按鈕每個 Panel 擁有獨立布局管理器,層層組合形成複雜介面。
add("卡片名稱", component):第一參數為字串識別碼,不顯示於介面first(), next(), previous(), last(), show(container, "cardName")first() 再 next() 定位到第二張卡片Java 1.0 Applet 無法使用 Dialog (會顯示不信任警告),CardLayout 是唯一實現「多畫面切換」的可行方案。
| 技術 | 核心類別 | 特色 |
|---|---|---|
| Swing | CardLayout (相容)、JTabbedPane | JTabbedPane 內建分頁標籤、圖示、工具提示、可拖曳重排 |
| JavaFX | TabPane、Accordion (TitlPane 疊放) | FXML 宣告、CSS 樣式、動畫切換、內容延遲載入 |
| Web (React/Vue) | 條件渲染、Tab 組件、Stepper/Wizard 組件 | 狀態驅動、虛擬 DOM 高效切換 |
ButtonPanel),保持主類別簡潔。show() 時才建構內容,節省啟動時間/記憶體。Timer + 透明度/位移漸變 (Swing) 或 JavaFX 內建動畫。next/previous,便於驗證與跳轉邏輯。CardLayout 是「無標籤分頁」的核心邏輯,理解其疊放容器 + 字串識別 + 導航方法架構,能輕鬆掌握 Swing JTabbedPane、JavaFX TabPane 乃至前端 Tab 組件的本質。多重布局組合 (Border+Flow+Card) 則是構建真實世界複雜介面的基礎技能。