以前对JList不大了解,只知道显示固定的数据,今天特地的看了一下JList的API,基本弄懂了JList的用法,可以实现JList的动态更新和图片加载。
这是主类
package jlist_v1; import java.awt.BorderLayout; public class MyJistText extends JFrame { private JPanel contentPane; private JLabel label; private JList list; private Vector<Object> dataVec; private JList< Object> list2; private int count=1; private JComboBox comboBox; /** * Launch the application. */ public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { public void run() { try { MyJistText frame = new MyJistText(); frame.setVisible(true); } catch (Exception e) { e.printStackTrace(); } } }); } /** * Create the frame. */ public MyJistText() { setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setBounds(100, 100, 450, 300); contentPane = new JPanel(); contentPane.setBorder(new EmptyBorder(5, 5, 5, 5)); contentPane.setLayout(new BorderLayout(0, 0)); setContentPane(contentPane); JScrollPane scrollPane = new JScrollPane(); contentPane.add(scrollPane, BorderLayout.WEST); String[] words= { "quick", "brown", "hungry", "wild"}; list = new JList(words); list.addMouseListener(new MouseAdapter() { @Override public void mouseClicked(MouseEvent e) { if(e.getClickCount()==2){ //得到双击的item的index int index = list.locationToIndex(e.getPoint()); System.out.println("Double clicked on Item " + index); //实现list2的动态更新 dataVec.addElement(""+count++); list2.setModel(new StringListModel(dataVec)); } } }); scrollPane.setViewportView(list); //list.setLayoutOrientation(JList.HORIZONTAL_WRAP); // list.setVisibleRowCount(2);//设置可见的行数 // list.setCellRenderer(new FontCellRenderer()); list.setCellRenderer(new MyCellRenderer()); list.addListSelectionListener(new ListSelectionListener() { @Override public void valueChanged(ListSelectionEvent e) { boolean flag=e.getValueIsAdjusting(); int last=e.getLastIndex(); if(flag){System.out.println("按下"+last);} else{ System.out.println("松开"+last); System.out.println(list.getSelectedValue()); label.setText(list.getSelectedValue().toString()); } } }); dataVec=new Vector<Object>(); dataVec.add("100"); list2=new JList<Object>(); list2.setModel(new StringListModel(dataVec)); JScrollPane scrollPane_1 = new JScrollPane(list2); contentPane.add(scrollPane_1, BorderLayout.EAST); label = new JLabel(""); contentPane.add(label, BorderLayout.SOUTH); comboBox = new JComboBox(words); comboBox.addItemListener(new ItemListener() { @Override public void itemStateChanged(ItemEvent e) { System.out.println(comboBox.getItemAt(comboBox.getSelectedIndex())); } }); contentPane.add(comboBox, BorderLayout.NORTH); } }
要实现JList的动态更新,需要实现ListModel接口
class StringListModel implements ListModel { private Vector<Object> dataVec; public StringListModel(Vector<Object> dataVec) { super(); this.dataVec = dataVec; } @Override public int getSize() { return dataVec.size(); } @Override public Object getElementAt(int index) { return dataVec.elementAt(index); } @Override public void addListDataListener(ListDataListener l) { } @Override public void removeListDataListener(ListDataListener l) { } }
要实现JList元素的特殊效果,如加载图片,背景颜色设置,需要实现ListCellRenderer接口
class MyCellRenderer extends JLabel implements ListCellRenderer { final static ImageIcon longIcon = new ImageIcon("images/qq.png"); final static ImageIcon shortIcon = new ImageIcon("images/weixin.png"); public Component getListCellRendererComponent( JList list, // the list Object value, // value to display int index, // cell index boolean isSelected, // is the cell selected boolean cellHasFocus) // does the cell have focus { String s = value.toString(); setText(s); setIcon((s.length()>5) ? longIcon : shortIcon); if (isSelected) { setBackground(Color.CYAN); setForeground(list.getSelectionForeground()); } else { setBackground(list.getBackground()); setForeground(list.getForeground()); } setEnabled(list.isEnabled()); setFont(list.getFont()); setOpaque(true); return this; } }
这些在api中都有相应的范例,不做过多介绍,只不过,通过对JTABLE,JLIST和JCOMBOBOX的研究发现,其动态更新都需要实现相应的model,更改外观都需要实现相应的渲染器,这些组件都采用了MVC架构,知道这一点,对于其他组件的学习就容易多了。
相关推荐
本篇将深入探讨如何使用`JList`以及如何为其添加滚动条。 首先,`JList`可以通过传入一个字符串数组来初始化其内容。例如,我们可以创建一个包含若干元素的数组,然后将其作为参数传递给`JList`的构造函数: ```...
jlist应用例子,JLIST应用例子,移动举例
总的来说,这个示例展示了如何在`JList`中使用`JCheckBox`,提供了一种更直观的多选方式。通过自定义`ListModel`、渲染器和鼠标监听器,我们可以使`JList`具有勾选功能,从而增强用户界面的交互性。这在创建GUI应用...
在Java Swing库中,`JList`是一个常用的组件,用于展示一系列...记得在实际项目中,要考虑到性能优化,比如预加载策略、使用缩略图等,以确保用户体验流畅。同时,也可以考虑添加动画效果,使得图片切换更为平滑自然。
本文将介绍如何使用 JavaSwing 中的 ListCellRenderer 接口来自定义 JList 组件的外观。 一、ListCellRenderer 接口 ListCellRenderer 接口是 JavaSwing 中的一个重要接口,用于自定义 JList 和 JComboBox 组件的...
创建了自定义的渲染器后,将其设置到`JList`上,使用`jList.setCellRenderer(customRenderer)`。 5. **加载和显示图片**: 图片通常存储在文件系统或资源包中。使用`ImageIcon`可以从指定路径加载图片,然后将其...
### JList在Java中的应用与特性详解 #### 引言 在Java的Swing图形用户界面库中,`JList`组件提供了展示列表项的强大功能,不仅能够支持单列或多列显示,还提供了丰富的事件处理机制,使得它成为构建用户交互界面时...
本篇文章将深入探讨如何使用Java构建具有各种特性的`JList`,包括添加图片、实现拖放功能以及自定义外观等。我们将通过以下五个主题来展开讨论: 1. **添加图片到JList** 在`JList`中添加图片,可以使用户界面更加...
首先,`JList`的基本使用包括创建`DefaultListModel`来存储列表项,然后将该模型赋值给`JList`。例如: ```java DefaultListModel<String> model = new DefaultListModel(); model.addElement("项1"); model....
swing中的jlist 代码中定义了两个jlist 从一个jlist双击列表项可以将该项从这个列表删除并添加至另外一个列表中去
在这个例子中,我们将深入探讨`JList` 的使用方法,并结合给出的`List.java`文件来解析其关键知识点。 首先,`JList` 是javax.swing包中的类,它继承自`JComponent`,并实现了`ListModel`接口。`ListModel` 是`...
JLIst的使用,主要是介绍基础
这就涉及到事件监听器的使用。本教程将详细解释如何在`JList`上实现事件监听器,以及`ListModelTest`这个示例代码是如何工作的。 首先,我们需要了解`JList`中的两种主要事件类型:`ListSelectionEvent`和`...
对于那些希望为列表增加更多视觉元素(如图片)的应用程序来说,使用 `ListCellRenderer` 接口可以大大增强 `JList` 的表现力。本文将详细介绍如何使用 `ListCellRenderer` 来创建一个更加美观且功能丰富的 `JList` ...
### JList多选值的获取 #### 概述 在Java Swing中,`JList` 组件被广泛用于创建用户界面中的列表框。不同于选择框(通常指`JComboBox`),`JList` 支持多种选择模式,使得用户能够灵活地进行单选或多选操作。本文...
使用一个 `Object[]` 或 `Vector<?>` 构造 JList 实例,这适用于列表项数量较少且固定的情况。 ```java // 通过 Object[] 初始化 String[] items = {"选项1", "选项2", "选项3"}; JList<String> list1 = new ...
文档中介绍了JList控件的简单使用方法,包括对列表点击事件的处理。
在Java Swing中,`JList` 是一个常用的组件,用于展示一系列可选择的项。当用户点击`JList`的空白区域时,默认行为是选中列表的最后一项。这对于某些应用场景,比如带有右键菜单的界面,可能会带来不便,因为用户...
最后,创建`MyListDemo`示例类,用于展示如何使用自定义`JList`。在这个类中,你可以加载初始数据,设置事件监听,以及处理用户与列表的交互。 ```java public class MyListDemo { public static void main(String...
JList默认使用DefaultListCellRenderer,但我们可以创建一个继承自DefaultListCellRenderer的子类,并重写其`getListCellRendererComponent`方法,以此来定制每个单元格的显示。在这个方法中,你可以设置文本、图标...