2015-10-13 70 views
1

我正在尝试构建一个动态的gui。反思:创建一个实例-java

我有以下类:

Public abstract class Property 
String ip1; 
int port; 

和很多从这个类创建的子类,例如有以下两种:

public class PropertyDns extends Property 
string ip2; 
int port2; 

Public class PropretyNetBios extends Property 
long time; 

目标: 用户选择的一个子属性,然后我想出示他需要填写的字段才能创建实例。 例如:如果他被选中PropertyDns我会出现: “ip1:____ port1:______ ip2:_______ port2:______” 当他完成时,他会按“ok”然后我想创建一个这样的实例与他选择的价值类别。

有什么办法可以做到吗?

我设法使用反射来呈现的字段:

Field[] s1=p.getClass().getSuperclass().getDeclaredFields(); 
      Field[] s=p.getClass().getDeclaredFields(); 
for (int i = 0; i < s.length; i++) { 
    ans[i]=s[i].getName(); 
} 

,但我认为是做得不好。

+0

请发表您的实际代码(格式化)。你在这里有什么不会编译,很难阅读。 – azurefrog

+0

您是否事先知道用户可以选择的所有子类? –

+0

@ ErickG.Hagstrom No :( –

回答

0

不使用反射并通过在Property类中定义的基础行为,可以列举从一组已知的变量的表单元素。

如果您特别想使用反射,我建议您先创建一个基本工作示例,然后在您奋斗时寻求帮助。

abstract class Property { 

    abstract Map<String, String> getPropertyNames(); 

    abstract void mapProperties(Map<String, String> userInput); 

} 

class Ip extends Property { 

    private String ip; 
    private String port; 

    public String getIp() { 
     return this.ip; 
    } 

    public int getPort() { 
     return Integer.parseInt(this.port); 
    } 

    Map<String, String> getPropertyNames() { 
     Map<String, String> names = new HashMap<>(); 
     names.put("ip", "IP Address"); 
     names.put("port", "Port"); 
    } 

    void mapProperties(Map<String, String> userInput) { 
     for (Map.Entry<String, String> entry : userInput.entrySet()) { 
      String key = entry.getKey(); 
      String value = entry.getValue(); 

      if ("ip".equals(key)) { 
       this.ip = value; 
      } else if ("port".equals(key)) { 
       this.port = value; 
      } 
     } 
    } 
} 

GUI

class GUI { 

    // psuedo code ahead, warning... 

    buildForm() { 


     Property p = Property.getInstance(userSelectedType); 
     Map m = p.getPropertyNames(); 
     for (entry in map) { 
      // build input type 
      // add listener to set values 
     } 
    } 

    void save() { 
     // run through user input map 
     // call p.mapProperties(userInputMap); 
    } 
} 

说明,我在SO编辑器,而不是一个IDE键入这一点,就会编译

+0

@Gaël,请参阅我对此的评论:) – epoch