Jlist详解

Posted zwz-bk

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Jlist详解相关的知识,希望对你有一定的参考价值。

  JList有四种构造

  1.空构造

  2.数组的,不推荐使用,因为长度不可以改变

  3.Vector为参数,增删改方便,但没有直接的监听器事件

  4.listModel为参数,功能最强大的,listModel只关心里面的数据

  listModel是一个借口,用的时候默认使用它的实现类DefaultListModel 。

  JList选择的模式有三种:

  1.随意多选

  2.只能连续的多选或单选

  3.只能单选

  JList的监听

  要获得选中项或者监听选中项改变事件那么应该使用JList对象(比如鼠标点击)

  数据改变需要监听

  listModel默认jlist中的渲染是一个JLABEL所有放进去的都会作为一个label来显示

  Jlist默认添加的都显示是文本,如果想要添加非文本这类的或者需要显示出自己需要的组件,就必须自定义渲染器自定义渲染器去继承需要显示的组件并实现渲染器接口

  设置单元格的渲染器 jlist.setCellRenderer(new MyButtom());其中里面的参数放你需要的组件。加入你需要的是一个按钮就需要新建一个类继承JButton 实现 ListCellRenderer。

实现这个接口的方法,return this就是返回这个组件,在里面把按钮设置为你需要的东西。

  如果你需要的很复杂,你可以新建一个类继承JPenal实现 ListCellRenderer ,然后在方法中定义和设置好组件,用this.add把这些组件加进去返回就可以了。

  

package cn.zkingsoft;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.Image;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.Vector;

import javax.swing.BorderFactory;
import javax.swing.DefaultListModel;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollBar;
import javax.swing.JScrollPane;
import javax.swing.ListCellRenderer;
import javax.swing.ListModel;
import javax.swing.ListSelectionModel;
import javax.swing.ScrollPaneConstants;
import javax.swing.event.ListDataEvent;
import javax.swing.event.ListDataListener;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;

public class JListTest extends JFrame{
    //数据
    private Object[] obj = new Object[5];
    private Vector<String> vec = new Vector<String>();
    private DefaultListModel dlm = new DefaultListModel();
    //容器
    private JList jlist = new JList();
    private JScrollPane jsp = new JScrollPane(jlist);
    private JButton jb = new JButton("测试");
    public JListTest() {
        this.setTitle("jlist");
        this.setSize(50, 500);
        this.setResizable(true);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setLocationRelativeTo(null);
        
        
        //使用数组的方式
//        obj[0]="aaa";
//        obj[1]="bbb";
//        obj[2]="ccc";
//        obj[3]="ddd";
//        obj[4]="eee";
//        jlist = new JList(obj);
        
        //使用集合
//        vec.add("111");
//        vec.add("222");
//        vec.add("333");
//        jlist = new JList(vec);
        
        //使用数据模式
//        dlm.addElement("小强");
//        dlm.addElement("小张");
//        dlm.addElement("小李");
//        dlm.addElement("小刘");
//        dlm.addElement("小黑");
//        dlm.addElement("小白");
        
        
        
        
        
        dlm.addElement(new MyContent("小黑","a.png"));
        dlm.addElement(new MyContent("小白","b.jpg"));
        dlm.addElement(new MyContent("小红","c.jpg"));
        dlm.addElement(new MyContent("小平","d.jpg"));
        jlist.setModel(dlm);
//        jlist = new JList(dlm);
        
        //设置单元格的高与宽
        jlist.setFixedCellHeight(40);
        jlist.setFixedCellWidth(10);
        //设置选择的模式
        jlist.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
//        jlist.setSelectionMode(ListSelectionModel.SINGLE_INTERVAL_SELECTION);
//        jlist.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
        
//        jlist.setBorder(BorderFactory.createLineBorder(Color.RED));
//        jlist.setBorder(BorderFactory.createEtchedBorder());
//        jlist.setBorder(BorderFactory.createTitledBorder(BorderFactory.createEtchedBorder(), "我的好友"));
//        jlist.setBorder(BorderFactory.createTitledBorder(BorderFactory.createEmptyBorder(),"我的好友"));
        
        //添加选择监听事件
//        jlist.addListSelectionListener(new ListSelectionListener(){
//            public void valueChanged(ListSelectionEvent e) {
////                System.out.println(e.getFirstIndex());
////                System.out.println(e.getLastIndex());
//                System.out.println(e.getSource().getClass());
//            }
//        });
        
        //jlist鼠标事件
        jlist.addMouseListener(new MouseAdapter(){
            public void mouseClicked(MouseEvent e) {
//                System.out.println(jlist.getSelectedIndex());
                jlist.setSelectionBackground(Color.PINK);
                jlist.setSelectionForeground(Color.BLUE);
                System.out.println(jlist.getSelectedValue().toString());
                System.out.println(jlist.getSelectedIndex());
//                System.out.println(jlist.locationToIndex(e.getPoint()));
                MyContent mc = (MyContent)jlist.getSelectedValue();
                JOptionPane.showMessageDialog(JListTest.this, mc.getName()+"=="+mc.getPhoto());
            }
        });
        
        //监听数据改变的事件
        dlm.addListDataListener(new ListDataListener(){
            public void contentsChanged(ListDataEvent e) {
                System.out.println("contentsChanged");
            }
            public void intervalAdded(ListDataEvent e) {
                System.out.println("intervalAdded");
            }
            public void intervalRemoved(ListDataEvent e) {
                System.out.println("intervalRemoved");
            }
        });
        
        
        
        
//        jb.addActionListener(new ActionListener(){
//
//            public void actionPerformed(ActionEvent e) {
////                dlm.add(3, "张佳乐");
////                dlm.removeElement("小黑");
////                dlm.setElementAt("aaa", 2);
//            }
//            
//        });
        
        //设置单元格的渲染器
//        jlist.setCellRenderer(new MyButtom());
        jlist.setCellRenderer(new MyJpanel());
        
        jsp.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED);
        this.getContentPane().add(jsp);
//        this.getContentPane().add(jb,BorderLayout.SOUTH);
        this.setVisible(true);
    }
    
    
    //内部类
    class MyButtom extends JButton implements ListCellRenderer{
        public Component getListCellRendererComponent(JList list, Object value,
                int index, boolean isSelected, boolean cellHasFocus) {
            this.setText(value.toString());
             if (isSelected) {
                 setBackground(list.getSelectionBackground());
                 setForeground(list.getSelectionForeground());
             } else {
                 setBackground(list.getBackground());
                 setForeground(list.getForeground());
             }
            return this;
        }
    }
    /**
     * 面板渲染
     * @author Administrator
     *
     */
    class MyJpanel extends JPanel implements ListCellRenderer{
        final JLabel name = new JLabel();
        final ImageIcon ii = new ImageIcon();
        final JLabel photo = new JLabel(ii);
        public Component getListCellRendererComponent(JList list, Object value,
                int index, boolean isSelected, boolean cellHasFocus) {
            MyContent mc = (MyContent)value;
            name.setText(mc.getName());
            ii.setImage(Toolkit.getDefaultToolkit().createImage(mc.getPhoto()).getScaledInstance(40, 40, Image.SCALE_SMOOTH));
             if (isSelected) {
                 setBackground(list.getSelectionBackground());
                 setForeground(list.getSelectionForeground());
             } else {
                 setBackground(list.getBackground());
                 setForeground(list.getForeground());
             }
             this.add(photo);
             this.add(name);
            return this;
        }
    }
    
    
    
    public static void main(String[] args) {
        new JListTest();
    }

}

 

以上是关于Jlist详解的主要内容,如果未能解决你的问题,请参考以下文章

使用拖放重新排序 JList

从 JList 中删除一行

查找 JList 的选中项并实时显示

JList 复制选择

JList 右键单击​​显示菜单(使用、删除、取消)

如何生成具有交替颜色的 Jlist