Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/394.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 事件时在JLabel中存储自定义对象_Java_Swing - Fatal编程技术网

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

Java 事件时在JLabel中存储自定义对象,java,swing,Java,Swing,我正在将自定义对象拖放到JLabel中,并且能够在传输过程中引用该对象(将标签字符串更改为received object to String),但不确定如何将自定义对象实际存储在JLabel中或构建引用 在转移过程中实现这一点的最佳方式是什么 以下是接收对象并使用其设置文本的工作传输代码(非常感谢前面的回答:: JLabel有我想要存储它们的特定实例变量。既然我有组件(JLabel)和值(自定义对象),我可以建立这个链接吗 最坏的情况是,我只需要为每个标签构建一个TransferHandler,

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

在转移过程中实现这一点的最佳方式是什么

以下是接收对象并使用其设置文本的工作传输代码(非常感谢前面的回答::

JLabel有我想要存储它们的特定实例变量。既然我有组件(JLabel)和值(自定义对象),我可以建立这个链接吗


最坏的情况是,我只需要为每个标签构建一个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;
    }
}