⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dragdroplistdemo.java

📁 Java_JDK_实例宝典书中的源码
💻 JAVA
字号:
package book.gui.dragdrop;

import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.Container;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.File;
import java.util.Hashtable;

import javax.swing.DefaultListCellRenderer;
import javax.swing.DefaultListModel;
import javax.swing.JFrame;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextField;
import javax.swing.ListCellRenderer;
import javax.swing.ListSelectionModel;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;

/**
 * 一个展示支持拖放的List的例子。 该例子主要演示如下几点: 
 * (1)JList的使用,根据数据模型自定义显示模型,即显示和数据分离。
 * (2)JList的项被选择时的事件处理,即ListSelectionListener的实现。
 * (3)JList实现拖放,文件拖放到JList中,JList中的项拖放到文件系统中。
 */
public class DragDropListDemo extends JFrame implements ListSelectionListener {
	/**
	 * 该例子包含两个组件,上面是一个文本框。下面是一个List列表, 
	 * 当用户单击列表中的项时,将会在文本框中显示该项的值。
	 */
	// 文本框
	private JTextField fileName;

	// 可拖放的List
	private DroppableList list;

	public DragDropListDemo() {
		super("DragDropListDemo");

		fileName = new JTextField(40);
		// 创建一个可拖放的List,并放入滚动板中
		list = new DroppableList();
		// 设置List中单元格的显示模型,也就是说,List的数据模型中项的值是"value",
		// 但是通过设置显示模型,在显示List时,可能看到的是"new_value"。
		// 因为在List在显示数据模型里的值时,会调用ListCellRender的getListCellRendererComponent方法。
		// 这里自定义一个ListCellRender,名字叫CustomCellRenderer,
		// 并实现了getListCellRendererComponent方法。
		list.setCellRenderer(new CustomCellRenderer());
		// 设置List为单选,一次只能选择一项
		list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
		JScrollPane listScrollPane = new JScrollPane(list);

		// List的数据模型
		DefaultListModel listModel = (DefaultListModel) list.getModel();
		String dirName = new String("/");
		String filelist[] = new File(dirName).list();
		for (int i = 0; i < filelist.length; i++) {
			String thisFileSt = dirName + filelist[i];
			File thisFile = new File(thisFileSt);
			if (thisFile.isDirectory())
				continue;
			try {
				// 将单个文件的信息组成一项放在List的数据模型中。
				listModel.addElement(makeNode(thisFile.getName(), thisFile
						.toURL().toString(), thisFile.getAbsolutePath()));
			} catch (java.net.MalformedURLException e) {
			}
		}

		// 为List添加选择事件侦听器,类型为ListSelectionListener。
		// 当用户选择List中的一项时,会调用ListSelectionListener的valueChanged方法
		list.addListSelectionListener(this);
		if (listModel.size() > 0) {
			// 默认为选择第0项
			list.setSelectedIndex(0);
			String name = listModel.getElementAt(list.getSelectedIndex())
					.toString();
			fileName.setText(name);
		} else {
			list.setSelectedIndex(-1);
			fileName.setText("null");
		}

		JPanel buttonPane = new JPanel();
		buttonPane.add(fileName);
		Container contentPane = getContentPane();
		contentPane.add(listScrollPane, BorderLayout.CENTER);
		contentPane.add(buttonPane, BorderLayout.NORTH);
	}

	/**
	 * 实现 ListSelectionListener接口定义的方法。 当用户选择List中的项时,调用该方法
	 */
	public void valueChanged(ListSelectionEvent e) {
		// 如果此事件是多个更改事件之一,则getValueIsAdjusting返回 true
		if (e.getValueIsAdjusting() == false) {
			// 表明此事件是一个单个事件,即单击List中的项。
			// 将List中被选择的项的值显示在文本框中。
			fileName.setText("");
			if (list.getSelectedIndex() != -1) {
				String name = list.getSelectedValue().toString();
				fileName.setText(name);
			}
		}
	}

	/**
	 * 利用文件的信息建立一个节点,存放在List的数据模型中。节点类型为一个Hashtable
	 */
	private static Hashtable makeNode(String name, String url, String strPath) {
		Hashtable hashtable = new Hashtable();
		hashtable.put("name", name);
		hashtable.put("url", url);
		hashtable.put("path", strPath);
		return hashtable;
	}

	/**
	 * 内部类,定义了List单元格内容显示的格式。
	 */
	class CustomCellRenderer implements ListCellRenderer {
		DefaultListCellRenderer listCellRenderer = new DefaultListCellRenderer();

		/**
		 * 实现ListCellRenderer接口定义的getListCellRendererComponent方法。
		 */
		public Component getListCellRendererComponent(JList list, Object value,
				int index, boolean selected, boolean hasFocus) {
			// 利用默认的单元格内容显示格式,对于选中的项,用特殊颜色标示。
			listCellRenderer.getListCellRendererComponent(list, value, index,
					selected, hasFocus);
			// 用新的格式显示项的值
			listCellRenderer.setText(getValueString(value));
			return listCellRenderer;
		}

		/**
		 * 根据值获得显示字符串
		 */
		private String getValueString(Object value) {
			String returnString = "null";
			if (value != null) {
				if (value instanceof Hashtable) {
					Hashtable h = (Hashtable) value;
					String name = (String) h.get("name");
					String url = (String) h.get("url");
					// 显示Hashtable中键值对
					returnString = name + " ==> " + url;
				} else {
					returnString = "X: " + value.toString();
				}
			}
			return returnString;
		}
	}

	public static void main(String s[]) {
		JFrame frame = new DragDropListDemo();
		// 关闭窗口的另一种方式。与setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);等价
		frame.addWindowListener(new WindowAdapter() {
			public void windowClosing(WindowEvent e) {
				System.exit(0);
			}
		});
		frame.pack();
		frame.setVisible(true);
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -