2015-10-13 66 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