gpt4 book ai didi

java - 在 JTable 中显示各种对象的实例变量并修改它们

转载 作者:搜寻专家 更新时间:2023-10-31 20:29:04 25 4
gpt4 key购买 nike

我正在设计一个有两个小部件的应用程序:

-包含任意对象的列表
- 显示当前选中对象特定属性的表格

目标是能够从列表中选择一个对象,查看属性,并根据需要修改它们。该列表可以包含各种类型的对象。

假设列表包含Vehicle 对象和Person 对象

public class Person
{
public String name;
public Integer age;
}

public class Vehicle
{
public String make;
public String model;
}

如果我单击一个Person 对象,表格将显示姓名和年龄,我可以为它们分配新值。同样,如果我单击 Vehicle 对象,它会在表中显示品牌和型号并允许我修改它们。

我考虑过写一个这样的方法

public String[] getFields()
{
return new String[] {"name", "age"};
}

它返回代表我想要查看的实例变量的字符串列表,并使用一些反射方法来获取/设置它们。我可以在所有类中定义这个 getFields 方法,这样我就可以使用该表来处理可能被扔到列表中的任意对象。

但是有没有办法设计这个,这样我就不会诉诸反射(reflection)了?当前的方法似乎是糟糕的设计。

另一方面,我可以创建多个 TableModel 对象,一个用于每个可能的类。该表将知道要显示哪些行以及如何访问对象的实例变量。但是每次添加一个新类时,我都必须定义一个新的表模型,这听起来也是一个薄弱的设计。

最佳答案

您有一个类 (Vehicle),并且知道一些属性(制造商、型号)的名称,您希望能够通过 JTable UI 为此类的实例动态操作这些属性。

您有多种不同的方法可供选择。

A.使用反射 API

这就是反射 API 的用途。如果你想要如此动态的东西,使用反射没有错。对于此用例,性能开销不会很大。

B.使用类似 beanutils 的库基于反射API

这应该比直接使用反射 API 更容易,但它的缺点是您需要在项目中包含另一个依赖项。

C.在运行时动态创建不同的 TableModel 类。

您可以使用 java compiler APIjavassist .根据运行时可用的信息,您可以为每种不同类型的表模型编译一个新类。如果您采用这种方法,您必须意识到类的创建是一项繁重的任务,因此在您第一次创建 TableModel 时,应用程序将需要一些时间来响应.

选择什么?

当然这是你的决定。对于特定的用例,反射或 beanutils 添加的开销微不足道,因此最好在 A 或 B 之间进行选择。在另一个性能更关键的用例中,您可以检查 C 方法,而不要忘记类创建响应时间问题。

编辑:我刚刚意识到,在这个特定的用例中,还需要另一个重要的功能。从 String 转换为每个属性的适当数据类型,反之亦然。 Beanutils 对此有完美的支持,因此它在这里得到了加分。

关于java - 在 JTable 中显示各种对象的实例变量并修改它们,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16922666/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com