在Java中通过GUI进行对象实例化

时间:2012-04-05 09:11:03

标签: java swing

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

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

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

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

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

1 个答案:

答案 0 :(得分: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;
    }

}

FullTimeWorker

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

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

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