首頁 >类库下载 >java类库 >java圖形使用者介面列錶框

java圖形使用者介面列錶框

高洛峰
高洛峰原創
2016-10-20 10:54:352380瀏覽

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時將所有元素加入進去即可。

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

java圖形使用者介面列錶框

2、動態操作

      透過檢視JList的方法,可以發現JList不負責列錶框的動態操作,所有的動態操作的細節可以在「列表模型」即DefaultListModel中完成,只需將該列表模型加入JList即可。

            DefaultListModel listmodel = new DefaultListModel();

             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);
    }
}

執行結果:

java圖形使用者介面列錶框      在上面的程序中,對JList的處理過程中用到了JListEventgetsListSelection)需要注意這兩個方法的用法。

(1)Boolean javax.swing.event.ListSelectionEvent.getValueIsAdjusting()

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

      例如,針對選擇更新以回應使用者的拖曳的事件,那麼在拖曳開始時,此屬性設定為 true;拖曳結束時設定為 false。在拖曳期間,監聽器接收 valueIsAdjusting 屬性設定為 true 的事件。在拖曳的最後,當變更終止時,監聽器接收一個值設定為 false 的事件。

     若將JList物件的註冊程式移除更新偵測的語句:

if(e.getValueIsAdjusting())    return;

輸出為:

java圖形使用者介面列錶框     可見,沒有更新偵測,選取了列錶框

 

(2)List javax.swing.JList.getSelectedValuesList()

      JList物件呼叫getSelectedValuesList()方法,產生一個字串陣列,內容為已選取的元素名稱。

3、JList滾動條

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

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

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

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn