如何使用图标和文本创建JList?

我有这个代码想要使JList谈话文本和图标必须做什么。
有些人建议我制作标签清单,在表格中放置文字图标是否可能? 怎么样?

/////////////////搜索嵌入式评论。

 import javax.swing.JPanel; import javax.swing.JButton; import javax.swing.JLabel; import java.awt.datatransfer.DataFlavor; import java.awt.datatransfer.Transferable; import java.awt.datatransfer.UnsupportedFlavorException; import java.awt.dnd.DropTarget; import java.awt.dnd.DropTargetDragEvent; import java.awt.dnd.DropTargetDropEvent; import java.awt.dnd.DropTargetEvent; import java.awt.dnd.DropTargetListener; import java.io.File; import java.io.IOException; import java.util.List; import javax.swing.DefaultListModel; import javax.swing.Icon; import javax.swing.JList; import javax.swing.JScrollPane; import javax.swing.filechooser.FileSystemView; public class pan extends JPanel implements DropTargetListener { private DefaultListModel listModel = new DefaultListModel(); private DropTarget dropTarget; private JLabel jLabel1; private JScrollPane jScrollPane1; private JList list; /** * Create the panel. */ public pan() { setLayout(null); list = new JList(); dropTarget = new DropTarget(list, this); list.setModel(listModel); list.setDragEnabled(true); //list.setTransferHandler(new FileTransferHandler()); jScrollPane1 = new JScrollPane(); jScrollPane1.setViewportView(list); jScrollPane1.setBounds(10, 150, 635, 330); add(jScrollPane1); } public void dragEnter(DropTargetDragEvent arg0) { // nothing } public void dragOver(DropTargetDragEvent arg0) { // nothing } public void dropActionChanged(DropTargetDragEvent arg0) { // nothing } public void dragExit(DropTargetEvent arg0) { // nothing } public void drop(DropTargetDropEvent evt) { int action = evt.getDropAction(); evt.acceptDrop(action); try { Transferable data = evt.getTransferable(); if (data.isDataFlavorSupported(DataFlavor.javaFileListFlavor)) { List files = (List) data.getTransferDat(DataFlavor.javaFileListFlavor); for (File file : files) { Icon icon=FileSystemView.getFileSystemView().getSystemIcon(file); /////////////////listModel.addElement(filepath+icon);///////////////////////want code do this } } } catch (UnsupportedFlavorException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { evt.dropComplete(true); } } } 

解决了这个问题之后,我将为每个元素添加动作,如果双击它将打开桌面
到存储在列表中的路径。

FileDragList

 import java.awt.*; import java.awt.datatransfer.*; import java.awt.dnd.*; import javax.swing.*; import javax.swing.border.LineBorder; import javax.swing.filechooser.FileSystemView; import java.io.*; import java.util.List; public class FileDropList extends JPanel implements DropTargetListener { private DefaultListModel listModel = new DefaultListModel(); private DropTarget dropTarget; private JLabel jLabel1; private JScrollPane jScrollPane1; private JList list; /** * Create the panel. */ public FileDropList() { //setLayout(null); list = new JList(); dropTarget = new DropTarget(list, this); list.setModel(listModel); list.setDragEnabled(true); FileListCellRenderer renderer = new FileListCellRenderer(); list.setCellRenderer(renderer); //list.setTransferHandler(new FileTransferHandler()); jScrollPane1 = new JScrollPane(list); //jScrollPane1.setBounds(10, 150, 635, 330); add(jScrollPane1); } public static void main(String[] args) throws Exception { Runnable r = new Runnable() { @Override public void run() { JPanel pan = new FileDropList(); pan.setBorder(new LineBorder(Color.BLACK)); JOptionPane.showMessageDialog(null, pan); } }; SwingUtilities.invokeLater(r); } public void dragEnter(DropTargetDragEvent arg0) { // nothing } public void dragOver(DropTargetDragEvent arg0) { // nothing } public void dropActionChanged(DropTargetDragEvent arg0) { // nothing } public void dragExit(DropTargetEvent arg0) { // nothing } public void drop(DropTargetDropEvent evt) { int action = evt.getDropAction(); evt.acceptDrop(action); try { Transferable data = evt.getTransferable(); if (data.isDataFlavorSupported(DataFlavor.javaFileListFlavor)) { List files = (List) data.getTransferData(DataFlavor.javaFileListFlavor); for (File file : files) { listModel.addElement(file); } } } catch (UnsupportedFlavorException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { evt.dropComplete(true); } } } /** A FileListCellRenderer for a File. */ class FileListCellRenderer extends DefaultListCellRenderer { private static final long serialVersionUID = -7799441088157759804L; private FileSystemView fileSystemView; private JLabel label; private Color textSelectionColor = Color.BLACK; private Color backgroundSelectionColor = Color.CYAN; private Color textNonSelectionColor = Color.BLACK; private Color backgroundNonSelectionColor = Color.WHITE; FileListCellRenderer() { label = new JLabel(); label.setOpaque(true); fileSystemView = FileSystemView.getFileSystemView(); } @Override public Component getListCellRendererComponent( JList list, Object value, int index, boolean selected, boolean expanded) { File file = (File)value; label.setIcon(fileSystemView.getSystemIcon(file)); label.setText(fileSystemView.getSystemDisplayName(file)); label.setToolTipText(file.getPath()); if (selected) { label.setBackground(backgroundSelectionColor); label.setForeground(textSelectionColor); } else { label.setBackground(backgroundNonSelectionColor); label.setForeground(textNonSelectionColor); } return label; } } 

原始答案

 import java.awt.datatransfer.*; import java.awt.dnd.*; import javax.swing.*; import javax.swing.filechooser.FileSystemView; import java.io.*; import java.util.List; public class FileDragList extends JPanel implements DropTargetListener { private static final long serialVersionUID = 1L; private DefaultListModel listModel = new DefaultListModel(); private JScrollPane jScrollPane1; private JList list; /** * Create the panel. */ public FileDragList() { setLayout(null); list = new JList(); DropTarget dropTarget = new DropTarget(list, this); list.setModel(listModel); list.setDragEnabled(true); FileListCellRenderer renderer = new FileListCellRenderer(); list.setCellRenderer(renderer); //list.setTransferHandler(new FileTransferHandler()); jScrollPane1 = new JScrollPane(); jScrollPane1.setViewportView(list); jScrollPane1.setBounds(10, 150, 635, 330); add(jScrollPane1); } public static void main(String[] args) throws Exception { Runnable r = new Runnable() { @Override public void run() { JOptionPane.showMessageDialog(null, new FileDragList()); } }; SwingUtilities.invokeLater(r); } public void dragEnter(DropTargetDragEvent arg0) { // nothing } public void dragOver(DropTargetDragEvent arg0) { // nothing } public void dropActionChanged(DropTargetDragEvent arg0) { // nothing } public void dragExit(DropTargetEvent arg0) { // nothing } public void drop(DropTargetDropEvent evt) { int action = evt.getDropAction(); evt.acceptDrop(action); try { Transferable data = evt.getTransferable(); if (data.isDataFlavorSupported(DataFlavor.javaFileListFlavor)) { List files = (List) data.getTransferData(DataFlavor.javaFileListFlavor); for (File file : files) { Icon icon=FileSystemView.getFileSystemView().getSystemIcon(file); /////////////////listModel.addElement(filepath+icon);///////////////////////want code do this } } } catch (UnsupportedFlavorException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { evt.dropComplete(true); } } } 

 Icon icon=FileSystemView.getFileSystemView().getSystemIcon(file); 

哦对了..试试文件浏览器GUI的FileTreeCellRenderer的变种。

就是这样,用于左边的树。

FileTreeCellRenderer

 /** A TreeCellRenderer for a File. */ class FileTreeCellRenderer extends DefaultTreeCellRenderer { private FileSystemView fileSystemView; private JLabel label; FileTreeCellRenderer() { label = new JLabel(); label.setOpaque(true); fileSystemView = FileSystemView.getFileSystemView(); } @Override public Component getTreeCellRendererComponent( JTree tree, Object value, boolean selected, boolean expanded, boolean leaf, int row, boolean hasFocus) { DefaultMutableTreeNode node = (DefaultMutableTreeNode)value; File file = (File)node.getUserObject(); label.setIcon(fileSystemView.getSystemIcon(file)); label.setText(fileSystemView.getSystemDisplayName(file)); label.setToolTipText(file.getPath()); if (selected) { label.setBackground(backgroundSelectionColor); label.setForeground(textSelectionColor); } else { label.setBackground(backgroundNonSelectionColor); label.setForeground(textNonSelectionColor); } return label; } } 

更新

一个SSCCE,它使上面的渲染器适应列表。

在此处输入图像描述

 import java.awt.*; import javax.swing.*; import javax.swing.filechooser.FileSystemView; import java.io.File; public class FileList { public static void main(String[] args) throws Exception { Runnable r = new Runnable() { @Override public void run() { JPanel gui = new JPanel(new BorderLayout(2,2)); File userHome = new File(System.getProperty("user.home")); File[] files = userHome.listFiles(); JList list = new JList(files); list.setCellRenderer(new FileListCellRenderer()); gui.add(new JScrollPane(list)); JOptionPane.showMessageDialog(null, gui); } }; SwingUtilities.invokeLater(r); } } /** A FileListCellRenderer for a File. */ class FileListCellRenderer extends DefaultListCellRenderer { private static final long serialVersionUID = -7799441088157759804L; private FileSystemView fileSystemView; private JLabel label; private Color textSelectionColor = Color.BLACK; private Color backgroundSelectionColor = Color.CYAN; private Color textNonSelectionColor = Color.BLACK; private Color backgroundNonSelectionColor = Color.WHITE; FileListCellRenderer() { label = new JLabel(); label.setOpaque(true); fileSystemView = FileSystemView.getFileSystemView(); } @Override public Component getListCellRendererComponent( JList list, Object value, int index, boolean selected, boolean expanded) { File file = (File)value; label.setIcon(fileSystemView.getSystemIcon(file)); label.setText(fileSystemView.getSystemDisplayName(file)); label.setToolTipText(file.getPath()); if (selected) { label.setBackground(backgroundSelectionColor); label.setForeground(textSelectionColor); } else { label.setBackground(backgroundNonSelectionColor); label.setForeground(textNonSelectionColor); } return label; } }