有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

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

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

目标是能够从列表中拾取对象,查看属性,并根据需要修改它们。该列表可以容纳各种类型的对象

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

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

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

如果我单击Person对象,该表将显示名称和年龄,我可以为它们指定新值。类似地,如果我单击Vehicle对象,它将在表中显示make和model,并允许我修改它们

我曾考虑过写一种类似这样的方法

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

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

但是有没有一种方法可以让我不去思考?目前的做法似乎是糟糕的设计

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


共 (1) 个答案

  1. # 1 楼答案

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

    你可以选择各种不同的方法

    A.使用反射API

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

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

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

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

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

    选择什么

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

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