我试图建立一个动态的gui。
我有以下课程:
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 :(得分:0)
看看Class.getDeclaredConstructor()
(然后使用你得到的构造函数)或者只是Class.newInstance()
,这取决于你的类是否提供构造函数。
答案 1 :(得分: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,它将 NOT 编译