在事件时将自定义对象存储在 JLabel 中



我正在将自定义对象拖放到 JLabels,并且能够在传输过程中引用该对象(将标签字符串更改为接收对象到字符串),但不确定如何将自定义对象实际存储在 JLabel 中或构建引用。

在转移过程中完成此操作的最佳方法是什么?

这是接收对象并使用它来设置文本的工作传输代码(非常感谢之前的答案:这里:

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;
}

JLabels具有特定的实例变量,我想将它们存储到其中。由于我有组件(JLabel)和值(自定义对象),我可以建立此链接吗?

最坏的情况是,我只需要为每个标签构建一个 TransferHandler 并准确引用该值。这也许是最佳实践吗?

我可以看到你有很多选择

选择 #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);

当您再次需要它时

Personperson = (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对其他开发人员来说更加明显,很明显您要做什么。 但是,这很容易搞砸。 让地图要么包含不相关的数据,要么因为有些人忘记/或不知道遵循要求而丢失数据。

从这个意义上说,clientProperty确实解决了Map的一些缺点,因为您正在处理单个组件,而不是组件和Map(尽管开发人员仍然有可能忘记设置属性),但与Map相比,可见性要低得多。 开发人员可能需要更长的时间才能意识到您如何存储/检索数据。

它确实具有简单的优点。 您可以传递对标签的引用,您不仅拥有标签,还拥有Person

自定义标签为您提供了灵活性的机会。 它比clientProperty解决方案更明显,因为它定义了公共方法。 它还允许您有机会在创建标签时设置TransferHandler,而不必在每次要重用解决方案时单独建立每个标签。

归根结底是这个。 您是想要一个快速的、一次性的解决方案,还是想要一些自包含且可重复使用的东西。MapclientProperty选择的实现和使用速度相对较快。 自定义组件将花费更多的精力,但通常会产生更可重用的解决方案。 这一切都取决于你;)