Java图形用户界面之列表框

 更新时间:2016年10月20日 08:57:41   作者:极客小子  
列表框通过Swing组件JList产生,其总是在屏幕上占据固定行数的空间。这篇文章主要介绍了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 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图形用户界面之列表框,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!

相关文章

  • Spring实现类私有方法的几个问题(亲测通用解决方案)

    Spring实现类私有方法的几个问题(亲测通用解决方案)

    现实的业务场景中,可能需要对Spring的实现类的私有方法进行测试。本文给大家分享Spring实现类私有方法面临的几个问题及解决方案,感兴趣的朋友跟随小编一起看看吧
    2021-06-06
  • java代码获取jenkins数据,构建历史等信息方式

    java代码获取jenkins数据,构建历史等信息方式

    这篇文章主要介绍了java代码获取jenkins数据,构建历史等信息方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-05-05
  • 全面解析Hibernate关联操作、查询操作、高级特性、并发处理机制

    全面解析Hibernate关联操作、查询操作、高级特性、并发处理机制

    这篇文章主要介绍了全面解析Hibernate关联操作、查询操作、高级特性、并发处理机制的相关资料,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2016-06-06
  • java中的stream流中的并行查询java

    java中的stream流中的并行查询java

    Stream流是Java 8引入的一种新的数据处理方式,它提供了一种高效、简洁的数据处理方式,Stream流可以让我们以声明式的方式处理数据,提高了代码的可读性和可维护性,同时,Stream流支持并行处理,可以充分利用多核CPU的性能,提高程序的运行效率
    2024-07-07
  • logback的DuplicateMessageFilter日志过滤操作源码解读

    logback的DuplicateMessageFilter日志过滤操作源码解读

    这篇文章主要为大家介绍了logback的DuplicateMessageFilter日志过滤操作源码解读,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-11-11
  • Java实现KFC点餐系统过程解析

    Java实现KFC点餐系统过程解析

    这篇文章主要介绍了Java实现KFC点餐系统过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-10-10
  • 使用Java实现先查询缓存再查询数据库

    使用Java实现先查询缓存再查询数据库

    这篇文章主要介绍了使用Java实现先查询缓存再查询数据库,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-07-07
  • Spring boot整合shiro+jwt实现前后端分离

    Spring boot整合shiro+jwt实现前后端分离

    这篇文章主要为大家详细介绍了Spring boot整合shiro+jwt实现前后端分离,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-12-12
  • Mybatis新手教程之简单入门

    Mybatis新手教程之简单入门

    这篇文章主要给大家介绍了关于Mybatis新手教程之简单入门的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-02-02
  • Java基础知识之注解、元注解

    Java基础知识之注解、元注解

    ava 注解,从名字上看是注释,解释。但功能却不仅仅是注释那么简单,下面这篇文章主要给大家介绍了关于Java基础知识之注解、元注解的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-01-01

最新评论