java圖形用戶界面之列表框

KelGravatt 8年前發布 | 8K 次閱讀 Java Java開發

列表框通過Swing組件JList產生,其總是在屏幕上占據固定行數的空間。如果要得到列表框中被選中的元素, 只需調用getSelectedValuesList(),它可以產生一個字符串數組 ,內容為被選中的元素名稱。 JList組件允許多重選擇 ;如果按住Ctrl鍵,可以選中所有點擊的元素;如果選中一個元素,按住Shift鍵并單擊另一個元素,那么這兩個元素之間的所有元素都被選中;要從選中的元素中去掉一個,按住Ctrl鍵單擊該元素即可。

初始化列表框后,接著便是向列表框添加和修改內容。分為靜態操作和動態操作。

1、靜態操作

靜態操作便是將所有元素同時添加到JList中, 添加后不能修改,不能刪除 ,即在程序執行過程中不能操作列表框。

E.g.

package test;

import javax.swing.*;
import java.awt.*;
import static net.mindview.util.SwingConsole.*;

public class ListTest1 extends JFrame{
    private String[] str = {"Monday","Tuesday","Wednesday","Thursday","Friday","Staturday","Sunday"};
    private JList list;public ListTest1()
    {
        list = new JList(str);
        setLayout(new FlowLayout());
        add(list);
    }

    public static void main(String[] args)
    {
        run(new ListTest1(),200,100);
    }
}


如上例,只要在初始化JList時將所有元素添加進去即可。

執行結果:列表框不可以被操作。

2、動態操作

通過查看JList的方法,可以發現JList不負責列表框的動態操作,所有的動態操作的細節可以在“列表模型”即DefaultListModel中完成,只需將該列表模型加入JList即可。

DefaultListModel listmodel = new DefaultListModel();

listmodel.addElement(element1);//添加元素

listmodel.clear();//清除全部元素

listmodel.remove(int index);//清除指定位置的元素

E.g.

package test;

import java.awt.*;import java.awt.event.*;import static net.mindview.util.SwingConsole.*;
import javax.swing.*;
import javax.swing.border.Border;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;

public class ListTest extends JFrame{
    private String[] str = {"Monday","Tuesday","Wednesday","Thursday","Friday","Staturday","Sunday"};
    private JButton button1 = new JButton("Add Item"),
                    button2 = new JButton("Clear Item");
    private JTextArea text = new JTextArea(str.length,20);
    private DefaultListModel listmodel = new DefaultListModel();
    private JList list = new JList(listmodel);
    //將列表模型加入JList,列表模型負責完成動態操作,JList負責創建列表以及許多其它工作(如多重選擇)。
    private int count = 0;
    private boolean flag = false;

    public ListTest()
    {
        text.setEditable(false);//只是用來顯示,不能編輯
        for(int i = 0;i<4;i++)
        {
            listmodel.addElement(str[count++]);
        }

        button1.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent e)
            {
               if(count<str.length)
               {
                   listmodel.addElement(str[count++]);
               }else
               {
                   button1.setEnabled(flag);
                   flag = true;
               }
            }
        });

        button2.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent e)
            {
                if(count<str.length)
                {
                    count = 0;//列表重新開始添加元素
                    listmodel.clear();//列表元素清除
                    text.setText(null);
                }else
                {
                    count = 0;
                    listmodel.clear();
                    text.setText(null);
                    button1.setEnabled(flag);//啟動按鈕
                }
            }
        });

        list.addListSelectionListener(new ListSelectionListener(){
            @SuppressWarnings("deprecation")
            public void valueChanged(ListSelectionEvent e)
            {
               if(e.getValueIsAdjusting())
                    return;
                //如果檢測到事件在更改,則返回true,后面語句不執行;當更改結束后,則返回false,執行后面語句。                for(Object item : list.getSelectedValuesList())
                {
                    text.append(item + "\n");//List型對象轉換為Object
                }
                //list調用getSelectedValuesList()方法,產生一個字符串數組,內容為被選中的元素名稱
            }
        });

        setLayout(new FlowLayout());
        Border border = BorderFactory.createMatteBorder(1, 1, 2, 2, Color.RED);//添加邊框
        list.setBorder(border);//設置邊框
        text.setBorder(border);
        add(button1);
        add(button2);
        add(new JScrollPane(text));
        add(list);
    }

    public static void main(String[] args) 
    {
        run(new ListTest(),250,375);
    }
}

執行結果:

在上面的程序中,對JList的處理過程中用到了JList所支持的事件ListSelectionEvent的getValueIsAdjusting()方法以及JList的getSelectedValuesList()方法,需要注意這兩個方法的用法。

(1)Boolean....getValueIsAdjusting()

返回此事件是否是仍然在更改的多個不同事件之一,如果此事件是仍然在更改的多個不同事件之一,則返回 true。

例如,對于選擇被更新以響應一個用戶的拖動的事件,那么在拖動開始時,此屬性被設置為 true;在拖動結束時被設置為 false。在拖動期間,監聽器接收 valueIsAdjusting 屬性設置為 true 的事件。在拖動的最后,當更改終止時,監聽器接收一個值設置為 false 的事件。

如果將JList對象的注冊程序去掉更新檢測的語句:

if(e.getValueIsAdjusting())
    return;

輸出為:

可見,沒有了更新檢測,選中列表框元素后,有重復輸出。

(2)...getSelectedValuesList()

JList對象調用getSelectedValuesList()方法,產生一個 字符串數組 ,內容為被選中的元素名稱。

3、JList滾動條

JList本沒有對滾動提供直接的支持,我們只要將JList包裝進JScrollPane,它將自動幫助處理所有細節。

總結:JList想添加元素,可以執行將所有元素在JList初始化時加入的靜態操作,也可以利用“列表模型”DefaultListModel處理所有列表修改細節的動態操作。

注意:在JList元素選擇的過程中可能會用到更新檢測,從而確保程序的穩定性。

 

來自:http://www.cnblogs.com/shiyiaccn/p/5978789.html

 

 本文由用戶 KelGravatt 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!