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

And*_*que 2 java swing

我正在将自定义对象拖放到JLabel中,并且能够在传输过程中引用该对象(将标签String更改为接收到的对象toString),但不确定如何在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;
        }
Run Code Online (Sandbox Code Playgroud)

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

最糟糕的情况是,我只需要为每个标签构建一个TransferHandler 并准确引用该值.这可能是最好的做法吗?

Mad*_*mer 5

你有很多我可以看到的选择

选择#1

Map使用标签作为键,创建某种类型并将对象存储在标签上

Map<JLabel, Person> mapPeople = new HashMap<JLable, Person>(25)
Run Code Online (Sandbox Code Playgroud)

然后在你的导入方法

mapPeople.put((JLabel)component, (Person)value);
Run Code Online (Sandbox Code Playgroud)

选择#2

利用它put/getClientProperty来存储命名密钥的值...

在你的导入方法......

((JLabel)component).putClientProperty("person", value);
Run Code Online (Sandbox Code Playgroud)

当你需要它时

人员=(人)label.getClientProperty("人");

选择#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;
    }
}
Run Code Online (Sandbox Code Playgroud)

基本上,您可以使用此组件代替法线JLabel,确保正确投射.

归功于Hovercraft和trashgod首先提到大部分内容.

最终选择

最终的选择将取决于您自己的设计,要求以及您希望解决方案的可重用性.

如果这是您的应用程序的"一个"关闭要求,那么Map和客户端属性是合理的解决方案.

Map更高度可见的其他开发人员,很明显你正在尝试做的.然而,这很容易搞砸.让地图包含无关数据或缺少数据,因为有人忘记了/或不知道遵循要求.

clientProperty确实解决了Map这个意义上的一些缺点,因为你处理单个组件,而不是组件和Map(虽然开发人员仍然可能忘记设置属性)但是在比较时具有低得多的可见性到了Map.开发人员可能需要更长时间才能实现存储/检索数据的方式.

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

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

它将归结为什么.你想要一个快速的,一次性的解决方案,或者你想要的东西是独立的和可重复使用的.这些MapclientProperty选择的实施和使用相对较快.自定义组件需要花费更多精力,但通常会产生更易于使用的解决方案.全取决于你 ;)