Swing-JComboBox用法-入門


JComboBox是Swing中的下拉菜單控件。它永遠只能選中一個項目,然而比單選按鈕節省空間。如果使用setEditable設置為true則內部選項的文本可以編輯,因此這種組件被稱為組合框。注意,對選項的編輯只會影響當前項,而不會改變列表內容。可以使用addItem方法來添加選項列表,或者使用insertItemAt在任何位置插入選項;然而如果有大量選項需要添加,這種方法是非常笨重的,可以先構造一個DefaultComboBoxModel,使用addElement加載選項,最后在調用JComboBox的setModel方法。

常用方法如下:

示例代碼:

JComboBoxBasicUseDemo.java

 

package JComboBoxBasicUse;
import java.awt.BorderLayout;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.event.PopupMenuEvent;
import javax.swing.event.PopupMenuListener;

/*
 * 演示JComboBox的基本用法,以及事件響應
 */
public class JComboBoxBasicUseDemo extends JFrame{
    private static final long serialVersionUID = -8161981948004677531L;
    int DEFAULT_WIDTH = 600;
    int DEFAULT_HEIGHT = 400;
    private JLabel label;
    private JComboBox<String> faceCombo;
    private static final int FONTSIZE = 12;    
    
    public JComboBoxBasicUseDemo(){
        setTitle("JComboBoxDemo");
        setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT);
        
        //添加label
        label = new JLabel("The quick brown fox jumps over the lazy dog.");
        label.setFont(new Font("Serif",Font.PLAIN, FONTSIZE));
        add(label, BorderLayout.CENTER);
        
        //actionListener
        ActionListener actionListener = new ActionListener(){
            public void actionPerformed(ActionEvent e) {
                if(e.getSource() instanceof JComboBox){
                    JComboBox<String> comboBox = (JComboBox)e.getSource();
                    String fontName = comboBox.getSelectedItem().toString();
                    label.setFont(new Font(fontName, Font.PLAIN, FONTSIZE));
                    System.out.printf("%s%n", "actionPerformed called");
                }
            }
        };
        
        //popupMenuListener
        PopupMenuListener popupMenuListener = new PopupMenuListener() {
            @Override
            public void popupMenuCanceled(PopupMenuEvent e) {
                System.out.println("下拉菜單取消");
            }

            @Override
            public void popupMenuWillBecomeInvisible(PopupMenuEvent e) {
                System.out.println("下拉菜單合上");
                JComboBox<String> source = (JComboBox<String>)e.getSource();
            }

            @Override
            public void popupMenuWillBecomeVisible(PopupMenuEvent e) {
                System.out.println("下拉菜單彈出");
            }
        };
        
        //itemListener
        ItemListener itemListener = new ItemListener() {
            @Override
            public void itemStateChanged(ItemEvent arg0) {
                // TODO Auto-generated method stub
                if(ItemEvent.SELECTED == arg0.getStateChange()){
                    String selectedItem = arg0.getItem().toString();
                    label.setFont(new Font(selectedItem, Font.PLAIN, FONTSIZE));
                    System.out.printf("new selected item : %s%n",selectedItem);
                }
                if(ItemEvent.DESELECTED == arg0.getStateChange()){
                    String selectedItem = arg0.getItem().toString();
                    System.out.printf("deselected item : %s%n",selectedItem);
                }
            }
            };
            
        //添加一個JComboBox
        faceCombo = new JComboBox<String>();
        faceCombo.setEditable(true);
        //faceCombo.addActionListener(actionListener);
        //faceCombo.addPopupMenuListener(popupMenuListener);
        faceCombo.addItemListener(itemListener);
        faceCombo.setEnabled(true);
        faceCombo.addItem("Serif");
        faceCombo.addItem("SansSerif");
        faceCombo.addItem("Monospaced");
        faceCombo.addItem("Dialog");
        faceCombo.addItem("DialogInput");
        
        add(faceCombo, BorderLayout.SOUTH);
    }
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        //創建窗體並指定標題
        JComboBoxBasicUseDemo frame = new JComboBoxBasicUseDemo();
        //關閉窗體后退出程序
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        //自動適配所有控件大小
        //frame.pack();
        //設置窗體位置在屏幕中央
        frame.setLocationRelativeTo(null);
        //顯示窗體
        frame.setVisible(true);
    }
}

 

本程序的基本功能是,通過選擇不同的item而相應地改變界面中的字體。運行效果如下:

下面分析JComboBox的事件響應。程序中使用了3個不同的事件響應函數,他們具有不同的特性。

ActionListener:它在eclipse和netBeans兩個不同的IDE中表現出了不同的效果- -。在eclipse中,每當選中新節點時被激活;而在netBeans中,選擇新節點時它總會被激活兩次。

PopupMenuListener:它將選擇節點的過程細分為3種類型:下拉菜單彈出;下拉菜單合上;下拉菜單取消。當點開下拉菜單,然后放棄選擇時,則下拉菜單取消、下拉菜單合上兩個事件先后被激活。

ItemListener:將節點的事件分為2種類型:SELECTED和DESELECTED。對於每種事件,均可以調用getItem()方法來獲取相應節點。

因此,如果業務邏輯只關心最新被選中的節點,那么使用ItemListener是比較合適的。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM