配色: 字号:
java图形用户界面之列表框
2016-10-20 | 阅:  转:  |  分享 
  
java图形用户界面之列表框



列表框通过Swing组件JList产生,其总是在屏幕上占据固定行数的空间。如果要得到列表框中被选中的元素,只需调用getSelectedValuesList(),它可以产生一个字符串数组,内容为被选中的元素名称。JList组件允许多重选择;如果按住Ctrl键,可以选中所有点击的元素;如果选中一个元素,按住Shift键并单击另一个元素,那么这两个元素之间的所有元素都被选中;要从选中的元素中去掉一个,按住Ctrl键单击该元素即可。



初始化列表框后,接着便是向列表框添加和修改内容。分为静态操作和动态操作。



1、静态操作



静态操作便是将所有元素同时添加到JList中,添加后不能修改,不能删除,即在程序执行过程中不能操作列表框。



E.g.



复制代码

packagetest;



importjavax.swing.;

importjava.awt.;

importstaticnet.mindview.util.SwingConsole.;



publicclassListTest1extendsJFrame{

privateString[]str={"Monday","Tuesday","Wednesday","Thursday","Friday","Staturday","Sunday"};

privateJListlist;publicListTest1()

{

list=newJList(str);

setLayout(newFlowLayout());

add(list);

}



publicstaticvoidmain(String[]args)

{

run(newListTest1(),200,100);

}

}



复制代码

如上例,只要在初始化JList时将所有元素添加进去即可。



执行结果:列表框不可以被操作。







2、动态操作



通过查看JList的方法,可以发现JList不负责列表框的动态操作,所有的动态操作的细节可以在“列表模型”即DefaultListModel中完成,只需将该列表模型加入JList即可。



DefaultListModellistmodel=newDefaultListModel();



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



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



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



E.g.



复制代码

packagetest;



importjava.awt.;importjava.awt.event.;importstaticnet.mindview.util.SwingConsole.;

importjavax.swing.;

importjavax.swing.border.Border;

importjavax.swing.event.ListSelectionEvent;

importjavax.swing.event.ListSelectionListener;



publicclassListTestextendsJFrame{

privateString[]str={"Monday","Tuesday","Wednesday","Thursday","Friday","Staturday","Sunday"};

privateJButtonbutton1=newJButton("AddItem"),

button2=newJButton("ClearItem");

privateJTextAreatext=newJTextArea(str.length,20);

privateDefaultListModellistmodel=newDefaultListModel();

privateJListlist=newJList(listmodel);

//将列表模型加入JList,列表模型负责完成动态操作,JList负责创建列表以及许多其它工作(如多重选择)。

privateintcount=0;

privatebooleanflag=false;



publicListTest()

{

text.setEditable(false);//只是用来显示,不能编辑

for(inti=0;i<4;i++)

{

listmodel.addElement(str[count++]);

}



button1.addActionListener(newActionListener(){

publicvoidactionPerformed(ActionEvente)

{

if(count
{

listmodel.addElement(str[count++]);

}else

{

button1.setEnabled(flag);

flag=true;

}

}

});



button2.addActionListener(newActionListener(){

publicvoidactionPerformed(ActionEvente)

{

if(count
{

count=0;//列表重新开始添加元素

listmodel.clear();//列表元素清除

text.setText(null);

}else

{

count=0;

listmodel.clear();

text.setText(null);

button1.setEnabled(flag);//启动按钮

}

}

});



list.addListSelectionListener(newListSelectionListener(){

@SuppressWarnings("deprwww.wang027.comecation")

publicvoidvalueChanged(ListSelectionEvente)

{

if(e.getValueIsAdjusting())

return;

//如果检测到事件在更改,则返回true,后面语句不执行;当更改结束后,则返回false,执行后面语句。for(Objectitem:list.getSelectedValuesList())

{

text.append(item+"\n");//List型对象转换为Object

}

//list调用getSelectedValuesList()方法,产生一个字符串数组,内容为被选中的元素名称

}

});



setLayout(newFlowLayout());

Borderborder=BorderFactory.createMatteBorder(1,1,2,2,Color.RED);//添加边框

list.setBorder(border);//设置边框

text.setBorder(border);

add(button1);

add(button2);

add(newJScrollPane(text));

add(list);

}



publicstaticvoidmain(String[]args)

{

run(newListTest(),250,375);

}

}

复制代码

执行结果:







在上面的程序中,对JList的处理过程中用到了JList所支持的事件ListSelectionEvent的getValueIsAdjusting()方法以及JList的getSelectedValuesList()方法,需要注意这两个方法的用法。



(1)Booleanjavax.swing.event.ListSelectionEvent.getValueIsAdjusting()



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



例如,对于选择被更新以响应一个用户的拖动的事件,那么在拖动开始时,此属性被设置为true;在拖动结束时被设置为false。在拖动期间,监听器接收valueIsAdjusting属性设置为true的事件。在拖动的最后,当更改终止时,监听器接收一个值设置为false的事件。



如果将JList对象的注册程序去掉更新检测的语句:



if(e.getValueIsAdjusting())

return;

输出为:







可见,没有了更新检测,选中列表框元素后,有重复输出。







(2)Listjavax.swing.JList.getSelectedValuesList()



JList对象调用getSelectedValuesList()方法,产生一个字符串数组,内容为被选中的元素名称。



3、JList滚动条



JList本没有对滚动提供直接的支持,我们只要将JList包装进JScrollPane,它将自动帮助处理所有细节。



总结:JList想添加元素,可以执行将所有元素在JList初始化时加入的静态操作,也可以利用“列表模型”DefaultListModel处理所有列表修改细节的动态操作。



注意:在JList元素选择的过程中可能会用到更新检测,从而确保程序的稳定性。

献花(0)
+1
(本文系thedust79首藏)