列錶框通過Swing組件JList產生,其總是在屏幕上佔據固定行數的空間。如果要得到列錶框中被選中的元素,只需調用getSelectedValuesList(),它可以產生一個字符串數組,內容為被選中的元素名稱。 JList組件允許多重選擇;如果按住Ctrl鍵,可以選中所有點擊的元素;如果選中一個元素,按住Shift鍵並單擊另一個元素,那麼這兩個元素之間的所有元素都被選中;要從選中的元素中去掉一個,按住Ctrl鍵單擊該元素即可。
初始化列錶框後,接著便是向列錶框添加和修改內容。分為靜態操作和動態操作。
1、靜態操作
靜態操作便是將所有元素同時添加到JList中,添加後不能修改,不能刪除,即在程序執行過程中不能操作列錶框。
Eg
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);//清除指定位置的元素
Eg
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 javax.swing.event.ListSelectionEvent.getValueIsAdjusting()
返回此事件是否是仍然在更改的多個不同事件之一,如果此事件是仍然在更改的多個不同事件之一,則返回true。
例如,對於選擇被更新以響應一個用戶的拖動的事件,那麼在拖動開始時,此屬性被設置為true;在拖動結束時被設置為false。在拖動期間,監聽器接收valueIsAdjusting 屬性設置為true 的事件。在拖動的最後,當更改終止時,監聽器接收一個值設置為false 的事件。
如果將JList對象的註冊程序去掉更新檢測的語句:
if(e.getValueIsAdjusting())return;
輸出為:
可見,沒有了更新檢測,選中列錶框元素後,有重複輸出。
(2)List javax.swing.JList.getSelectedValuesList()
JList對象調用getSelectedValuesList()方法,產生一個字符串數組,內容為被選中的元素名稱。
3、JList滾動條
JList本沒有對滾動提供直接的支持,我們只要將JList包裝進JScrollPane,它將自動幫助處理所有細節。
總結:JList想添加元素,可以執行將所有元素在JList初始化時加入的靜態操作,也可以利用“列表模型”DefaultListModel處理所有列表修改細節的動態操作。
注意:在JList元素選擇的過程中可能會用到更新檢測,從而確保程序的穩定性。
以上所述是小編給大家介紹的java圖形用戶界面之列錶框,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對武林網網站的支持!