慕村9548890
在编程中,数据为王。数据如何表示不应该是数据的考虑因素,这是 UI/视图层的领域/职责。这通常由模型-视图-控制器模式表示在您的示例中,您有两条(基本)信息。一个文件和一个状态(未运行、已运行、已删除),您要将此信息组合为“数据”。在 Java 中,这通常意味着一个普通的旧 Java 对象(或 Pojo)因为状态只有有限的可能性,我们可以用 aenum来表示它,从而限制有效值public enum FileStatus { NOT_RUN, RUN, DELETED;}然后我们可以创建我们自己的 pojo ...public class FileOperation { private File file; private FileStatus status; public FileOperation(File file, FileStatus status) { this.file = file; this.status = status; } public FileOperation(File file) { this(file, FileStatus.NOT_RUN); } public File getFile() { return file; } public FileStatus getStatus() { return status; } public void setStatus(FileStatus newStatus) { if (status == newStatus) { return; } this.status = newStatus; }}现在,当我们想知道文件的状态时,我们知道从哪里获取它。但是JList呢?你问,好问题。我们真正想要的是某种方式JList可以在任何FileOperation对象的状态发生变化时得到通知。现在,您可以迭代ListModel,但这不是一个非常干净的解决方案,更好的解决方案是允许在FileOperation更改时生成事件并ListModel监听它们并采取自己的行动。这是观察者模式ƒ的基本概念有很多方法可以做到这一点,但我很懒,所以我将使用可用的属性更改 APIpublic class FileOperation { private File file; private FileStatus status; private PropertyChangeSupport propertyChangeSupport = new PropertyChangeSupport(this); public FileOperation(File file, FileStatus status) { this.file = file; this.status = status; } public FileOperation(File file) { this(file, FileStatus.NOT_RUN); } public File getFile() { return file; } public FileStatus getStatus() { return status; } public void setStatus(FileStatus newStatus) { if (status == newStatus) { return; } FileStatus oldStatus = status; status = newStatus; propertyChangeSupport.firePropertyChange("status", oldStatus, status); } public void addPropertyChangeListener(PropertyChangeListener listener) { propertyChangeSupport.addPropertyChangeListener(listener); } public void removePropertyChangeListener(PropertyChangeListener listener) { propertyChangeSupport.removePropertyChangeListener(listener); }}现在我们需要一个ListModel可以响应它的......public class FileOperationListModel extends AbstractListModel<FileOperation> { private List<FileOperation> items = new ArrayList<FileOperation>(25); private PropertyChangeListener handler = new PropertyChangeHandler(); public void add(FileOperation fo) { fo.addPropertyChangeListener(handler); int size = items.size(); items.add(fo); fireIntervalAdded(this, size, size); } public void remove(FileOperation fo) { int index = items.indexOf(fo); if (index < 0) { return; } fo.removePropertyChangeListener(handler); items.remove(fo); fireIntervalRemoved(this, index, index); } @Override public int getSize() { return items.size(); } @Override public FileOperation getElementAt(int index) { return items.get(index); } public class PropertyChangeHandler implements PropertyChangeListener { @Override public void propertyChange(PropertyChangeEvent evt) { if (!(evt.getSource() instanceof FileOperation)) { return; } FileOperation fo = (FileOperation) evt.getSource(); int index = items.indexOf(fo); fireContentsChanged(FileOperationListModel.this, index, index); } }}现在,拼图的最后一部分是您将需要一个ListCellRenderer可以显示您想要的信息的自定义。为此,您必须首先阅读如何使用列表和编写自定义单元格渲染器