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

Java AWT Choice 下拉列表框完全指南:動態增項、選擇事件與已知寬度計算缺陷

     編輯:Java 相關知識

Choice 核心特性

  • 下拉式單選元件,平時僅顯示當前選項,點擊展開選單
  • 強制單選:同一時間僅能選擇一個項目
  • 項目由 addItem(String) 動態新增
  • 選擇改變觸發 ItemEvent (Java 1.1+) / action() (Java 1.0)
  • 不支援使用者自由輸入 (異於 ComboBox),僅能從列表選擇

完整範例:Choice1

//: Choice1.java
import java.awt.*;
import java.applet.*;

public class Choice1 extends Applet {
    String[] description = {"Ebullient","Obtuse","Recalcitrant","Brilliant",
                            "Somnescent","Timorous","Florid","Putrescent"};
    TextField t = new TextField(30);
    Choice c = new Choice();
    Button b = new Button("Add items");
    int count = 0;

    public void init() {
        t.setEditable(false);
        for (int i=0; i<4; i++) c.addItem(description[count++]);
        add(t); add(c); add(b);
    }

    public boolean action(Event evt, Object arg) {
        if (evt.target.equals(c)) { // 選擇改變
            t.setText("index: " + c.getSelectedIndex() + " " + (String)arg);
        } else if (evt.target.equals(b)) { // 動態新增
            if (count < description.length) c.addItem(description[count++]);
        } else return super.action(evt, arg);
        return true;
    }
} ///:~

關鍵觀察

1. 事件參數雙重資訊

  • c.getSelectedIndex():取得選中索引 (0-based)
  • arg (Java 1.0 action 第二參數):直接提供選中項目字串,等價於 c.getSelectedItem()

2. 已知缺陷:下拉寬度首次展開時鎖定

  • 下拉選單寬度在首次展開時根據當前項目最長寬度計算並固定
  • 若首次展開前項目較少,後續動態新增較長項目 → 下拉寬度不變,長文字被截斷 (可捲動查看但視覺不佳)
  • 解決:初始化時一次性加入所有項目,或預先加入一個足夠長的佔位項目
  • 註:此行為在後續版本修正,但 AWT Choice 歷史包袱依存

3. 取得選中項目

String selected = c.getSelectedItem();     // 字串
int index = c.getSelectedIndex();          // 索引 (-1 表示無選擇)
int count = c.getItemCount();              // 項目總數
String item = c.getItem(index);            // 取得指定索引項目

現代化對應

技術核心類別關鍵增強
SwingJComboBox支援可編輯模式 (ComboBox)、自訂渲染器 (ListCellRenderer)、動態寬度自動調整、鍵盤搜尋、資料模型分離 (ComboBoxModel)
JavaFXComboBox<T>泛型型別安全、CellFactory 自訂 UI、可編輯、CSS 樣式、converter 字串/物件轉換、虛擬化大數據
Web<select> / Select2 / React Select原生單選、豐富組件庫支援搜尋、分組、遠端載入、多選、標籤化

最佳實踐

  1. 初始化時一次性載入所有選項,避免寬度計算缺陷。
  2. 項目數量超過 20 建議改用可搜尋下拉 (Swing JComboBox + AutoComplete / JavaFX ComboBox + 過濾器)。
  3. 需使用者自由輸入時,Swing 設定 setEditable(true),JavaFX 設定 editableProperty()。
  4. 動態增減項目時,操作資料模型 (DefaultComboBoxModel / ObservableList) 而非直接呼叫 addItem(),保持 MVC 分離。

總結

Choice 是「唯讀單選下拉」的極簡實現:記憶體佔用小、API 極少。但其首次展開鎖定寬度缺陷與無可編輯/搜尋/自訂渲染限制,使其僅適合極簡單、固定選項場景。現代開發請直接使用 JComboBox 或 ComboBox,獲得完整下拉選單體驗與擴充性。

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