在JTable中显示各种对象的实例变量并对其进行修改

时间:2013-06-04 16:12:56

标签: java

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

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

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

所以说列表包含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方法,以便我可以使用该表来处理可能被抛入列表的任意对象。

但有没有办法设计这个以便我不会诉诸于反思?目前的方法似乎是糟糕的设计。

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

1 个答案:

答案 0 :(得分:2)

你有一个类(Vehicle),你知道你希望能够通过JTable UI为这个类的一个实例动态操作的一些属性(make,model)的名称。

您可以选择各种不同的方法。

:一种。使用反射API

这就是反射API的用途。如果你想要一些如此动态的东西,使用反射没有任何问题。对于这个用例,性能开销并不重要。

<强> B中。使用基于反射API的beanutils

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

<强>℃。在运行时动态创建不同的TableModel类。

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

选择什么?

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

编辑: 我刚刚意识到在这个特定的用例中还需要另一个重要的功能。从String转换为每个属性和副cersa的相应数据类型。 Beanutils对此有完美的支持,所以它在这里得到了加分。