在 Chrome 瀏覽器上面, 我們可以在輸入 URL 欄位的地方直接輸入查詢字串. 貼心的 Chrome 會自動幫我們帶出曾經被查詢的相關字串:
那這樣的效果有辦法在 Swing 的 UI 上面呈現嗎? 其實 Chrome 上面顯示的相關查詢字串是來自後端服務器紀錄使用者的瀏覽紀錄而來, 但是在 Swing 開發的應用程式除非你自己架一個 Server 將每次使用者的查詢過程記錄起來, 否則能依據的就只有當前的查詢紀錄. 下面要介紹使用 JComboBox 來模擬這樣的效果, 將曾經查詢過的字串記下來, 並可以透過點擊 JComboBox 的下拉框帶出查詢紀錄.
Sample code:
首先我們設計的 UI 長相如下, 當按下按鈕 "Add" 時, 則代表進行查詢. 當 JComboBox 中的查詢字串未曾出現時, 則加入該字串到 JComboBox 的下拉選項中:
首先為了要讓 JComboBox 可以編輯字串, 必須如下設定 JComboBox 的物件 jComboBox:
- jComboBox.setEditable(true);
- private void jButtonActionPerformed(ActionEvent evt) {
- String qs = (String)jComboBox.getSelectedItem();
- System.out.printf("\t[Info] Query '%s'...\n", jComboBox.getSelectedItem());
- if(!queue.contains(qs))
- {
- queue.add(qs);
- updateComboBox(qs); // 更新 JComboBox 的選單
- JOptionPane.showConfirmDialog(this, String.format("Add '%s' into history...", qs), "Info", JOptionPane.CLOSED_OPTION, JOptionPane.INFORMATION_MESSAGE);
- }
- }
這邊我們用類別 FSQueue 來記錄查詢字串,
- private FSQueue
queue = new FSQueue( 10); // Keep 10 records. FIFO
當有新的物件加入, 下面方法會被呼叫以更新 JComboBox 的清單:
- protected void updateComboBox(String qs)
- {
- jComboBox.removeAllItems();
- for(String eqs:queue) jComboBox.addItem(eqs);
- jComboBox.setSelectedItem(qs);
- }
- package swing.demo;
- import java.awt.BorderLayout;
- import java.awt.event.ActionEvent;
- import java.awt.event.ActionListener;
- import javax.swing.ComboBoxModel;
- import javax.swing.DefaultComboBoxModel;
- import javax.swing.JButton;
- import javax.swing.JComboBox;
- import javax.swing.JOptionPane;
- import javax.swing.JPanel;
- import javax.swing.SwingUtilities;
- import javax.swing.WindowConstants;
- import flib.util.FSQueue;
- public class JComboBoxDemo1 extends javax.swing.JFrame {
- private JPanel jPanelMain;
- private JComboBox jComboBox;
- private JButton jButton;
- private FSQueue
queue = new FSQueue( 10); // Keep 10 records. FIFO - /**
- * Auto-generated main method to display this JFrame
- */
- public static void main(String[] args) {
- SwingUtilities.invokeLater(new Runnable() {
- public void run() {
- JComboBoxDemo1 inst = new JComboBoxDemo1();
- inst.setLocationRelativeTo(null);
- inst.setVisible(true);
- }
- });
- }
- public JComboBoxDemo1() {
- super();
- initGUI();
- }
- private void initGUI() {
- try {
- setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
- this.setTitle("JComboBox \u6b77\u53f2\u7d00\u9304");
- {
- jPanelMain = new JPanel();
- getContentPane().add(jPanelMain, BorderLayout.CENTER);
- jPanelMain.setBackground(new java.awt.Color(0,255,0));
- jPanelMain.setLayout(null);
- jPanelMain.setPreferredSize(new java.awt.Dimension(484, 62));
- {
- ComboBoxModel jComboBoxModel =
- new DefaultComboBoxModel(
- new String[] {});
- jComboBox = new JComboBox();
- jPanelMain.add(jComboBox);
- jComboBox.setModel(jComboBoxModel);
- jComboBox.setBounds(12, 12, 388, 24);
- jComboBox.setEditable(true);
- }
- {
- jButton = new JButton();
- jPanelMain.add(jButton);
- jButton.setText("Add");
- jButton.setBounds(412, 13, 61, 24);
- jButton.addActionListener(new ActionListener() {
- public void actionPerformed(ActionEvent evt) {
- jButtonActionPerformed(evt);
- }
- });
- }
- }
- pack();
- this.setSize(500, 100);
- } catch (Exception e) {
- //add your error handling code here
- e.printStackTrace();
- }
- }
- protected void updateComboBox(String qs)
- {
- jComboBox.removeAllItems();
- for(String eqs:queue) jComboBox.addItem(eqs);
- jComboBox.setSelectedItem(qs);
- }
- private void jButtonActionPerformed(ActionEvent evt) {
- String qs = (String)jComboBox.getSelectedItem();
- System.out.printf("\t[Info] Query '%s'...\n", jComboBox.getSelectedItem());
- if(!queue.contains(qs))
- {
- queue.add(qs);
- updateComboBox(qs); // 更新 JComboBox 的選單
- JOptionPane.showConfirmDialog(this, String.format("Add '%s' into history...", qs), "Info", JOptionPane.CLOSED_OPTION, JOptionPane.INFORMATION_MESSAGE);
- }
- }
- }
執行代碼後再出現 UI 的 輸入區鍵入 "aaa" 並點擊按鈕 "Add". 此時因為 "aaa" 未出現在歷史查詢, 會有 popup 提示加入該字串到歷史紀錄:
執行代碼後再出現 UI 的 輸入區鍵入 "bbb" 並點擊按鈕 "Add". 同樣因為 "bbb" 未出現在歷史查詢, 會有 popup 提示加入該字串到歷史紀錄:
此時點擊 JComboBox 的下拉按鈕, 選項清單會有 "aaa" 與 "bbb":
選擇 "aaa" 並點擊按鈕 "Add". 此時因為 "aaa" 已經出現在歷史清單, 故不會有 popup!
Supplement:
* The Java Tutorial > How to Use Combo Boxes
沒有留言:
張貼留言