Java Jlist 用法

本文介绍了Java中JList的使用,包括Vector类的应用、JList内容的刷新、添加、删除和修改方法。同时讲解了如何结合JOptionPane、JTextField和JScrollPane进行交互。文章还探讨了全选、全不选和反选的实现策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Jlist 学习

Java Vector 类

Vector 类实现了一个动态数组。和 ArrayList 很相似,但是两者是不同的:

  • Vector 是同步访问的。
  • Vector 包含了许多传统的方法,这些方法不属于集合框架。

Vector 主要用在事先不知道数组的大小,或者只是需要一个可以改变大小的数组的情况。

Vector 类支持 4 种构造方法。

第一种构造方法创建一个默认的向量,默认大小为 10:

Vector()

第二种构造方法创建指定大小的向量。

Vector(int size)

第三种构造方法创建指定大小的向量,并且增量用 incr 指定。增量表示向量每次增加的元素数目。

Vector(int size,int incr)

第四种构造方法创建一个包含集合 c 元素的向量:

Vector(Collection c)

除了从父类继承的方法外 Vector 还定义了以下方法:

序号方法描述
1void add(int index, Object element) 在此向量的指定位置插入指定的元素。
2boolean add(Object o) 将指定元素添加到此向量的末尾。
3boolean addAll(Collection c) 将指定 Collection 中的所有元素添加到此向量的末尾,按照指定 collection 的迭代器所返回的顺序添加这些元素。
4boolean addAll(int index, Collection c) 在指定位置将指定 Collection 中的所有元素插入到此向量中。
5void addElement(Object obj) 将指定的组件添加到此向量的末尾,将其大小增加 1。
6int capacity() 返回此向量的当前容量。
7void clear() 从此向量中移除所有元素。
8Object clone() 返回向量的一个副本。
9boolean contains(Object elem) 如果此向量包含指定的元素,则返回 true。
10boolean containsAll(Collection c) 如果此向量包含指定 Collection 中的所有元素,则返回 true。
11void copyInto(Object[] anArray) 将此向量的组件复制到指定的数组中。
12Object elementAt(int index) 返回指定索引处的组件。
13Enumeration elements() 返回此向量的组件的枚举。
14void ensureCapacity(int minCapacity) 增加此向量的容量(如有必要),以确保其至少能够保存最小容量参数指定的组件数。
15boolean equals(Object o) 比较指定对象与此向量的相等性。
16Object firstElement() 返回此向量的第一个组件(位于索引 0) 处的项)。
17Object get(int index) 返回向量中指定位置的元素。
18int hashCode() 返回此向量的哈希码值。
19int indexOf(Object elem) 返回此向量中第一次出现的指定元素的索引,如果此向量不包含该元素,则返回 -1。
20int indexOf(Object elem, int index) 返回此向量中第一次出现的指定元素的索引,从 index 处正向搜索,如果未找到该元素,则返回 -1。
21void insertElementAt(Object obj, int index) 将指定对象作为此向量中的组件插入到指定的 index 处。
22boolean isEmpty() 测试此向量是否不包含组件。
23Object lastElement() 返回此向量的最后一个组件。
24int lastIndexOf(Object elem) 返回此向量中最后一次出现的指定元素的索引;如果此向量不包含该元素,则返回 -1。
25int lastIndexOf(Object elem, int index) 返回此向量中最后一次出现的指定元素的索引,从 index 处逆向搜索,如果未找到该元素,则返回 -1。
26Object remove(int index) 移除此向量中指定位置的元素。
27boolean remove(Object o) 移除此向量中指定元素的第一个匹配项,如果向量不包含该元素,则元素保持不变。
28boolean removeAll(Collection c) 从此向量中移除包含在指定 Collection 中的所有元素。
29void removeAllElements() 从此向量中移除全部组件,并将其大小设置为零。
30boolean removeElement(Object obj) 从此向量中移除变量的第一个(索引最小的)匹配项。
31void removeElementAt(int index) 删除指定索引处的组件。
32protected void removeRange(int fromIndex, int toIndex) 从此 List 中移除其索引位于 fromIndex(包括)与 toIndex(不包括)之间的所有元素。
33boolean retainAll(Collection c) 在此向量中仅保留包含在指定 Collection 中的元素。
34Object set(int index, Object element) 用指定的元素替换此向量中指定位置处的元素。
35void setElementAt(Object obj, int index) 将此向量指定 index 处的组件设置为指定的对象。
36void setSize(int newSize) 设置此向量的大小。
37int size() 返回此向量中的组件数。
38List subList(int fromIndex, int toIndex) 返回此 List 的部分视图,元素范围为从 fromIndex(包括)到 toIndex(不包括)。
39Object[] toArray() 返回一个数组,包含此向量中以恰当顺序存放的所有元素。
40Object[] toArray(Object[] a) 返回一个数组,包含此向量中以恰当顺序存放的所有元素;返回数组的运行时类型为指定数组的类型。
41String toString() 返回此向量的字符串表示形式,其中包含每个元素的 String 表示形式。
42void trimToSize() 对此向量的容量进行微调,使其等于向量的当前大小。

实例

下面的程序说明这个集合所支持的几种方法:

import java.util.*;

public class VectorDemo {

   public static void main(String args[]) {
      // initial size is 3, increment is 2
      Vector v = new Vector(3, 2);
      System.out.println("Initial size: " + v.size());
      System.out.println("Initial capacity: " +
      v.capacity());
      v.addElement(new Integer(1));
      v.addElement(new Integer(2));
      v.addElement(new Integer(3));
      v.addElement(new Integer(4));
      System.out.println("Capacity after four additions: " +
          v.capacity());

      v.addElement(new Double(5.45));
      System.out.println("Current capacity: " +
      v.capacity());
      v.addElement(new Double(6.08));
      v.addElement(new Integer(7));
      System.out.println("Current capacity: " +
      v.capacity());
      v.addElement(new Float(9.4));
      v.addElement(new Integer(10));
      System.out.println("Current capacity: " +
      v.capacity());
      v.addElement(new Integer(11));
      v.addElement(new Integer(12));
      System.out.println("First element: " +
         (Integer)v.firstElement());
      System.out.println("Last element: " +
         (Integer)v.lastElement());
      if(v.contains(new Integer(3)))
         System.out.println("Vector contains 3.");
      // enumerate the elements in the vector.
      Enumeration vEnum = v.elements();
      System.out.println("\nElements in vector:");
      while(vEnum.hasMoreElements())
         System.out.print(vEnum.nextElement() + " ");
      System.out.println();
   }
}

以上实例编译运行结果如下:

Initial size: 0
Initial capacity: 3
Capacity after four additions: 5
Current capacity: 5
Current capacity: 7
Current capacity: 9
First element: 1
Last element: 12
Vector contains 3.

Elements in vector:
1 2 3 4 5.45 6.08 7 9.4 10 11 12

what I learnt form this

Vector和Arryalist相似,用法相似,这样就差不多了。

然后在Jlist对象创建时,将调好的Vector对象放进去就行了。

Jlist内容刷新的方法

  • 首先对相应的按钮加上监听,然后再使用Jlist中的setListData方法,传入更新过的Vector内容即可

用户管理实现方法:

  1. 在初始化时,利用sql查询语句来查询所有的用户名,将查询到的结果集放到vector对象中,然后在利用vector对象来建立一个Jlist对象,实现了初次进入用户管理界面的程序运行逻辑
  2. 选中某一个用户之后,就可以通过sql查询,在下面的区域现实出相应的用户数据,有保存按钮,可以实现用户数据的修改和保存。
  3. 保存之后可以接到刷新方法上去。
  4. 刷新方法就是通过再次查询sql数据库,然后将查询到的结果集覆盖到vector对象中,然后再通过Jlist中的setListData方法重新调整jlist中的内容。
  5. Vector对象覆盖方法:可以使用Vector对象中的clear方法,将对象中所存储的信息清楚,便于重新读起内容。

JTextField

//      jText=new JTextField();
//      jText.setText("jfkdlsajfjdsafkdjsakjfldkjsakfjdklsajf");
//      jText.setBounds(600,300,100,100);
//      jText.setAutoscrolls(true);
//      jText.setEditable(false);
        //学习了JTextField的使用方法。
        /*总结,
        JTF只能显示单行,而JTA可以显示多行
        JTS要设置文字可以使用setText,大多数的控件内的文字都是这样的。
        JTS还可以设置只读,用setEditable方法来设置。

JScrollPane

  • jsp创建时,应当把相应的组件直接当参数放进去

    例如:

    JScrollPane jsp=new JScrollPane(jlist);//其中jlist时一个jlist对象。
    
  • 这样就可将jlist加上滚动条

  • jsp对象可以用setBounds设置位置和大小

  • jsp对象可以像如下这样设置竖直方向上和水平方向上是否有scrollbar

  •     jscrollpane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
        //设置竖直方向上的滚动条一直出现
        jscrollpane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
    

JOptionPane

这个好像是一个很有意思的工具类,能很方便的弹出窗口并执行一个小功能。

Example:

        String inputStr=JOptionPane.showInputDialog("请输入要添加的内容");

这句话执行之后会出现一个对话框来引导输入内容,然后将输入的内容赋值到左边。

jlist添加内容

利用上面的JOP来方便地请求用户输入相应的内容,然后将东西放到Vector对象内,再set一下jlist的data就行了。

jlist删除选中内容

可以使用jlist中的方法:getSelectedValues方法来获得一个对象数组,然后利用该对象数组和Vector对象中的remove方法来循环移除相应的东西,然后再重新setListData就行了。

if(jlist.getSelectedValuse().lengeth>0){
  Object[] ojbArr = jlist.getSelectedValues();
  for(int i=0;i<objArr.length;i++){
    v.remove(objArr[i]);
  }
  jlist.setListData(v);
}

通过这样的操作之后就可以实现删除Jlist中内容的功能了。

总结:

  • 检查要删除的内容是否不为空
  • 利用getSelectedValues方法将选中的元素放到Object数组中
  • 利用for循环,一个一个删除Vector对象中相应的内容。
  • 利用setListData方法重新设置相应Jlist中的内容

我自己的练习结果:

    public void delThings(ActionEvent e){
        if(jl.getSelectedValues().length>0){
            Object[] objArr=jl.getSelectedValues();
            for(int i = 0; objArr.length>i;i++){
                v.remove(objArr[i]);
            }
            jl.setListData(v);
        }else JOptionPane.showMessageDialog(null,"没有选中内容");
    }
jlist修改内容

整体思路:

  • 首先创建一个按钮,添加监听
  • 同样利用Object数组来通过getSelectedValues获取Jlist中的数据,这里要加上条件判断,以确保只修改一个值。
  • 接收getSelectedValues必须使用Object数组来进行接收,不然会出错,不知道为什么,即使是要接受的值只有一个。
  • 同理,利用JOP来创建一个弹窗来接收数据,将原数据删掉,然后再在Vector末尾添加,再重新设置JL的data即可。
    public void changeThings(ActionEvent e){
        if(jl.getSelectedValues().length==1){
            Object[] objArr=jl.getSelectedValues();//这里必须使用数组吗??
            //这里只能使用对象数组来进行接收,不然会出现问题。
            v.remove(objArr[0]);
            String inputStr = JOptionPane.showInputDialog("请输入要修改的内容",objArr[0]);
            v.add(inputStr);
            jl.setListData(v);
        }else{
            JOptionPane.showMessageDialog(null,"只能选中一行数据来进行修改");
        }
    }

这个方法还可以改良:修改的话应该是将原位置的数据清空,然后将新数据放到原位置,而这个方法却将其放到了末尾,有点不合理

java中Vector类的add还可以指定下标插入。

void add(int index, Object element) 

所以只要获取要修改的数据的下标,然后再指定下标插入就行了。

获取Jlist所选中的下标的方法为getSelectedIndex,注意该方法只返回一个数字,是下标最小的那个数字,而不是数组。

还有一个问题就是remove动作在对话框弹出之前就被删除了,非常的不自然。

所以应当放在对话框执行之后

下面就是改进后的方法

    public void changeThings(ActionEvent e){
        if(jl.getSelectedValues().length==1){
            int indexS=jl.getSelectedIndex();
            Object[] objArr=jl.getSelectedValues();//这里必须使用数组吗??
            //这里只能使用对象数组来进行接收,不然会出现问题。
            String inputStr = JOptionPane.showInputDialog("请输入要修改的内容",objArr[0]);
            v.remove(objArr[0]);
            v.add(indexS,inputStr);
            jl.setListData(v);
        }else{
            JOptionPane.showMessageDialog(null,"只能选中一行数据来进行修改");
        }
    }
JList全选/全不选/反选

首先要了解一些Jlist选中模式

JList一共有三种选中模式

MULTIPLE_INTERVAL_SELECTION=2
可以选择不相邻的几项

SINGLE_INTERVAL_SELECTION=1
只能选择连续的几项

SINGLE_SELECTION=0

一次只能选择一项

JList默认是第一种选择模式,就是限制最小的那种

JList设置选择模式的方法为setSelectionMode(ListSelectionModel.[选中模式名称(就是上面的那三种)]/直接填入一个0-2的整数分别代表以上方法)

全选思路:

            public void actionPerformed(ActionEvent e) {
                jlist.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
                int[] allSelect = new int[v.size()];//获取JList的行数//即获取Vector对象所存储字符串的数目。
                //获得Vector对象中的行数之后再创建一个这么长的整形数组
                for (int i = 0; i < v.size(); i++) {
                    allSelect[i] = i;//初始化这个数组,使这个数组中的元素包含所有想要选中的下标
                }
                jlist.setSelectedIndices(allSelect);//将一个存储着待选中行号整型数组当作参数放到JList中的setSelectedIndices方法中去,即可实现选中功能
            }
  1. 首先初始化Jlist的选中模式,将选中模式调整为符合功能需求的模式,由于该方法是全选,所以要选择MULTIPLY_INTERVAL_SELECTION模式。
  2. 然后创建一个整型数组,数组的长度为Vector的长度(为什么要设置一个这么长的数组?因为JList选中方法setSelectedIndices需要一个整型数组,该方法会将每个元素内对应的行标记为选中状态)
  3. 将所有的行标填入整形数组中
  4. 利用setSelectedIndices方法选中所有行

全不选思路:

  1. 初始化jlist选中模式
  2. 创建一个jlist长度的整形数组,然后将这些数组全部赋值为-1
  3. 将该数组放到setSelectedIndices方法中,即可实现全不选功能
    public void nsAll(ActionEvent e){
        jl.setSelectionMode(2);
        int[] s=new int[v.size()];
        for(int i=0;i<s.length;i++){
            s[i]=-1;
        }
        jl.setSelectedIndices(s);
    }

反选思路

    public void reverseSelectButton(ActionEvent e){
        int[] all=new int[v.size()];
        for(int i=0;i<all.length;i++){
            all[i] = i;
        }//创建全选数组
        int[] sel=jl.getSelectedIndices();//获得已选择的数组
        for(int i=0;i<sel.length;i++){//根据已选择的数组的下标来反选全选数组即可
            int temp=sel[i];
            for (int j=0;j<all.length;j++){//细心。。。这里写错了导致bug
                if(temp==all[j]){
                    all[j]=-1;
                }
            }
        }//最后别忘记了set。。。
        jl.setSelectedIndices(all);
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值