Java 事件时在JLabel中存储自定义对象
我正在将自定义对象拖放到JLabel中,并且能够在传输过程中引用该对象(将标签字符串更改为received object to String),但不确定如何将自定义对象实际存储在JLabel中或构建引用 在转移过程中实现这一点的最佳方式是什么 以下是接收对象并使用其设置文本的工作传输代码(非常感谢前面的回答:: JLabel有我想要存储它们的特定实例变量。既然我有组件(JLabel)和值(自定义对象),我可以建立这个链接吗Java 事件时在JLabel中存储自定义对象,java,swing,Java,Swing,我正在将自定义对象拖放到JLabel中,并且能够在传输过程中引用该对象(将标签字符串更改为received object to String),但不确定如何将自定义对象实际存储在JLabel中或构建引用 在转移过程中实现这一点的最佳方式是什么 以下是接收对象并使用其设置文本的工作传输代码(非常感谢前面的回答:: JLabel有我想要存储它们的特定实例变量。既然我有组件(JLabel)和值(自定义对象),我可以建立这个链接吗 最坏的情况是,我只需要为每个标签构建一个TransferHandler,
最坏的情况是,我只需要为每个标签构建一个TransferHandler,并准确地引用值。这可能是最佳做法吗?我可以看到很多选择 选择#1 创建某种类型的
贴图
,并将对象存储在标签上,使用标签作为键
Map<JLabel, Person> mapPeople = new HashMap<JLable, Person>(25)
选择#2
利用put/getClientProperty
根据命名键存储值
在您的导入方法中
((JLabel)component).putClientProperty("person", value);
当你再次需要它的时候
Person=(Person)label.getClientProperty(“Person”)
选择#3
创建能够直接引用此人的自定义标签
public class PersonLabel extends JLabel {
private Person person;
public void setPerson(Person person) {
this.person = person;
setText(person == null ? null : person.toString());
}
public Person getPerson() {
return person;
}
}
基本上,您可以使用此组件来代替正常的JLabel
,请确保正确地转换它
这要归功于气垫船和垃圾神,因为他们首先提到了这一点
最终选择
最终的选择将取决于您自己的设计、需求以及您希望解决方案的可重用性
如果这是应用程序的“一次性”要求,则Map
和客户端属性是合理的解决方案
Map
对于其他开发人员来说更容易看到,这很明显是您想要做的。但是,它很容易搞乱。让Map包含不相关的数据或缺少数据,因为有人忘记/或不知道遵循要求
clientProperty
确实从这个意义上解决了Map
的一些缺点,因为您处理的是单个组件,而不是组件和Map
(尽管开发人员仍然可能忘记设置属性)但是与地图相比,它的可视性要低得多。开发人员可能需要更长的时间来了解如何存储/检索数据
然而,它确实具有简单的优点。您可以传递对标签的引用,您不仅拥有标签,还拥有人
自定义标签为您提供了灵活性的机会。它比clientProperty
解决方案更为明显,因为它定义了公共方法。它还允许您在创建标签时设置TransferHandler
,而不必在每次重新创建时单独建立每个标签-使用解决方案
归根结底是这样的。您是想要一个快速、一次性的解决方案,还是想要一个自包含且可重用的解决方案。Map
和clientProperty
选项的实现和使用相对较快。自定义组件需要更多的努力,但通常会导致更高的可重用性解决方案。一切取决于您;)为什么要将对象存储在JLabel中?如果您希望将某人与JLabel关联,可以使用映射
,例如HashMap,但我想您可能更愿意将此人放入ArrayList或其他集合中。我不熟悉映射,因此这可能是个窍门。同时,作为(非常草率的)解决方法,我使用JLabel工具提示作为引用,并使用if语句将工具提示与关联值匹配。。。我确实需要学习映射。您存储了哪些信息,为什么必须将其与JLabel关联?只有在必须将对象与JLabel关联时,才可以使用映射,但这可能不是必需的。JLabel用于显示信息,而不是存储信息。您需要澄清您试图解决的问题,而不是如何解决问题。您可以根据需要使用JComponent
方法putClientProperty()
和gettClientProperty()
。在你之前关于这个话题的问题中也引用了这个。所有的答案都很好,谢谢。我认为最后一个可能最适合我的需要,因为我将使用DnD设置自定义对象。
((JLabel)component).putClientProperty("person", value);
public class PersonLabel extends JLabel {
private Person person;
public void setPerson(Person person) {
this.person = person;
setText(person == null ? null : person.toString());
}
public Person getPerson() {
return person;
}
}