3

我有一些通过它们的构造函数参数化的类。我需要提供一个图形用户界面,让用户指定这些参数。关于这些类,我唯一​​可以假设的是有一个构造函数(默认或带参数)。

[更新] 我有三组类 Aimpl、Bimpl、Cimpl。集合 Aimple 中的类扩展类 A,Bimpl 中的类扩展类 B,Cimpl 中的类扩展类 C。A、B 和 C 的实例用于对数据进行计算。在编译时我不知道哪些子类可用,所以我扫描实现并将它们添加到适当的集合中。如果最终用户想要应用计算,他需要实例化它。为了实例化它,他需要为构造函数提供适当的参数。最终用户本身就是一名程序员,并且了解数组、抽象类和接口。他甚至知道什么是合理的论点。

起初只期望原始类型(或期望原始类型的类),所以我自己编写了一个运行良好的解决方案。但现在我必须处理数组、抽象类和接口。所以我正在寻找一个可以简化向用户提供输入字段、提取输入和创建对象的任务的库。

如果没有这样的图书馆,我自己该怎么做?对于数组,我可以使用 JTexFields 然后解析输入,对于抽象类和接口,我可以扫描扩展/实现类(使用反射库)并提供一个 JComboBox 让用户选择。我是 GUI 编程新手,所以我无法可靠地估计我的方法是否可行,我不想浪费时间解决以前解决的问题。

如果信息缺失,请随时指出。

4

1 回答 1

1

SWoeste 是正确的反射是用于类似于你的任务的东西,但它使用起来不是很简单。

事实上,您的问题与摇摆(或 GUI)无关。您正在解决“如何从字符串创建对象”问题。(或者至少可以简化为它)。如果您的用户是您所写的程序员,我认为非常简单的解决方案是使用 JSON(我认为它使用非常简单易懂的格式),我的代码适用于gson 1.6。

如果我有一个对象,比如说 FullTimeWorker,它扩展了 Person:

package net.betlista.gson;

public class Person {

    private String name;
    private String surname; // no setter

    public String getName() {
        System.out.println( "Person#getName()" );
        return name;
    }

    public void setName( final String name ) {
        this.name = name;
    }

}

全职工作者

package net.betlista.gson;

public class FullTimeWorker extends Person {

    private double salary;

}

现在您可以将 FullTimeWorker 类创建为

package net.betlista.gson;

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;

public class DeserializationTest {

    public static void main( final String[] args ) {
        final GsonBuilder gb = new GsonBuilder();
        final Gson gson = gb.create();
        // {
        //    "salary": 1234.5,
        //    "name": "John",
        //    "surname": "Doe",
        // }
        final String in = "{\"salary\":1234.5,\"name\":\"John\",\"surname\":\"Doe\"}";
        final FullTimeWorker w = gson.fromJson( in, FullTimeWorker.class );
    }

}

图形用户界面

您现在在 GUI 中只需要插入 JSON 字符串的 JTextField(或更好的 JTextArea)、用于类选择的 JComboBox 和 JButton,就这么简单。

很明显,您的 GUI 几乎可以完美 - 它只取决于您的想象力,但我不确定是否有比这更简单的东西 ;-)

于 2012-04-06T10:48:43.157 回答