我正在将自定义对象拖放到JLabel中,并且能够在传输过程中引用该对象(将标签String更改为接收到的对象toString),但不确定如何在JLabel中实际存储自定义对象或建立一个参考。
在转移过程中实现这一目标的最佳方法是什么?
以下是接收对象并使用它来设置文本的工作传输代码(非常感谢之前的答案:here:
public boolean importData(TransferSupport support) {
boolean accept = false;
if (canImport(support)) {
try {
Transferable t = support.getTransferable();
Object value = t.getTransferData(PersonTransferable.PERSON_FLAVOR);
if (value instanceof Person) {
Component component = support.getComponent();
if (component instanceof JLabel) {
((JLabel)component).setText(((Person)value).toString());
//action here
}
}
} catch (Exception exp) {
exp.printStackTrace();
}
}
return accept;
}
JLabel有我想要存储的特定实例变量。由于我有组件(JLabel)和值(自定义对象),我可以建立此链接吗?
最糟糕的情况是,我只需为每个标签构建一个TransferHandler并准确引用该值。这可能是最好的做法吗?
答案 0 :(得分:5)
我可以看到许多选择
选择#1
创建某种类型的Map
并将该对象存储在标签上,使用标签作为密钥
Map<JLabel, Person> mapPeople = new HashMap<JLable, Person>(25)
然后在你的导入方法
mapPeople.put((JLabel)component, (Person)value);
选择#2
利用put/getClientProperty
将值存储在命名键...
在导入方法中......
((JLabel)component).putClientProperty("person", value);
当你需要它时
Person 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
,请确保正确投射。
归功于Hovercraft和trashgod首先提到大部分内容。
最终选择
最终的选择将取决于您自己的设计,要求以及您希望解决方案的可重用性。
如果这是您的应用程序的“一”关闭要求,则Map
和客户端属性是合理的解决方案。
Map
对其他开发者来说更加明显,显而易见的是你要做的事情。然而,这很容易搞砸。让地图包含不相关的数据或丢失数据,因为有人忘记了/或者不知道要遵守这些要求。
clientProperty
确实解决了Map
在这个意义上的一些缺点,因为你处理单个组件,而不是组件和Map
(尽管它仍然是开发人员可能忘记设置属性)但与Map
相比,其可见性要低得多。开发人员可能需要更长时间才能意识到您存储/检索数据的方式。
它确实具有简单的优势。你可以传递对标签的引用,你不仅有标签,还有Person
。
自定义标签为您提供灵活的机会。它比clientProperty
解决方案更明显,因为它定义了公共方法。它还允许您在创建标签时设置TransferHandler
,而不必在每次要重新使用解决方案时单独建立每个标签。
它将归结为什么。你想要一个快速的,一次性的解决方案,或者你想要的东西是独立的和可重复使用的。 Map
和clientProperty
选项的实施和使用相对较快。自定义组件需要花费更多精力,但通常会产生更易于使用的解决方案。这完全取决于你;)