我有一个关于实现Swing控件的问题,该控件使用自定义类作为其属性之一。我的目标是在netbeans IDE中使用此控件,并在设计时将其配置为与任何其他组件一样。我已经为我的 ConnectionInfo 对象实现了一个自定义属性编辑器,它可以正常工作。
然而 - 当我在Netbeans中配置我的 IntLEDs ConnectionInfo 属性并保存它时,我可以在Netbeans生成的代码中看到它在启动我的 ConnectionInfo 上课。
这实际上是Netbeans IDE生成的内容:
intLED1.setConnection(???);
所以我猜Netbeans不知道如何实例化我的 ConnectionInfo 类。 但是如何告诉Netbeans该怎么做呢? :)
此代码基本上是我的组件的剥离版本
public class IntLED extends JPanel {
private ConnectionInfo connection = new ConnectionInfo("", 11159, "", "", Variable.VARIABLE_TYPE.INT);
public IntLED() {
initComponents();
PropertyEditorManager.registerEditor(ConnectionInfo.class, PviCpuPropertyEditor.class);
}
public ConnectionInfo getConnection() {
return connection;
}
public void setConnection(ConnectionInfo connection) {
this.connection = connection;
}
}
这里是 ConnectionInfo 代码。只是一些成员和Getters / Setters。
public class ConnectionInfo {
private String pviHost = "";
private int pviPort = 11159;
private String pviTask = "";
private String pviVarname = "";
private Variable.VARIABLE_TYPE pviType;
public ConnectionInfo() {
}
public ConnectionInfo(String pviHost, int pviPort, String pviTask, String pviVarname, Variable.VARIABLE_TYPE type) {
this.pviHost = pviHost;
this.pviPort = pviPort;
this.pviTask = pviTask;
this.pviVarname = pviVarname;
this.pviType = type;
}
public String getPviHost() {
return pviHost;
}
public void setPviHost(String pviHost) {
this.pviHost = pviHost;
}
public int getPviPort() {
return pviPort;
}
public void setPviPort(int pviPort) {
this.pviPort = pviPort;
}
public String getPviTask() {
return pviTask;
}
public void setPviTask(String pviTask) {
this.pviTask = pviTask;
}
public String getPviVarname() {
return pviVarname;
}
public void setPviVarname(String pviVarname) {
this.pviVarname = pviVarname;
}
public Variable.VARIABLE_TYPE getPviType() {
return pviType;
}
public void setPviVarname(Variable.VARIABLE_TYPE pviType) {
this.pviType = pviType;
}
}
我还尝试将 ConnectionInfo -Class的成员直接放入我的 IntLED -Class,这样可以正常工作!但我真的需要让用户直接在一个编辑器中配置这些成员,因为编辑器还提供了一个测试器来测试这些设置等等。
我希望有人能指出我正确的方向:)
非常感谢你!
答案 0 :(得分:2)
我在自定义属性和Matisse代码生成器之间找到了'缺失的链接'!
在我的自定义属性编辑器(扩展PropertyEditorSupport
)中,我做了不覆盖方法getJavaInitializationString()
。
显然,当这个方法没有被覆盖时,它会返回'???'这正是我所看到的。
以下是我修复它的方法:
@Override
public String getJavaInitializationString() {
return String.format("new ConnectionInfo(\"%s\", %d, \"%s\", \"%s\", Variable.VariableType.BOOLEAN)", getValue().getHost(), getValue().getPort(), getValue().getTask(), getValue().getVarname());
}
当然应该有一些Nullpointer检查等等。但这基本上是如何告诉马蒂斯如何初始化你的自定义类!
答案 1 :(得分:0)
我希望我能理解您的问题,但在我看来,您希望能够将自定义JPanel
(IntLED
)添加为可在GUI编辑器中使用的组件(马蒂斯)像其他所有组件一样?
这里有一个答案(https://stackoverflow.com/a/18409887/963076),解释了如何将自定义组件添加到GUI编辑器。
编辑:
好的,我明白了。要更改Netbeans生成的代码,您应该在该组件的Properties
对话框中查找该参数。右键单击该组件,然后单击“属性”。然后在属性列表中找到connection
。应显示connection
,因为Netbeans会查找所有get()
和set()
方法,并将其添加为您可以编辑的属性。找到connection
后,按右侧的...
按钮。它会弹出一个对话框,允许您设置该组件的属性。您可能需要选择“自定义代码”。
(在下面的图片中,我使用了columnModel
属性作为插图)。
从下面的屏幕中选择“自定义代码”。