好的,所以我正在研究JavaFX软件。我正在使用BorderPane,我想我想让表格在右边。用户可以在表单之间切换菜单。我希望能够在更改为其他表单之前建议用户保存/完成表单(或不表示)。
所以我采用了一个简单的解决方案,一个接口,我将在我的自定义节点上实现:
public interface Closable {
public abstract void close();
}
我会将它们存储在名为ApplicationMainWindow的自定义BorderPane中:
public class ApplicationMainWindow extends BorderPane {
private HashMap<Pos,Closable> windowContent;
}
现在我将设置ApplicationMainWindow过程,我将在更改之前检查右边的当前节点,这就是问题
public void changeRight(Closable c) {
this.windowContent.get(Pos.CENTER_RIGHT).close();
this.setRight((Node)c);
this.windowContent.put(Pos.CENTER_RIGHT,c);
}
现在你可以看到,它根本不干净,因为它假设我只在Node子类中实现Closable。现在,当然,我可以确保它实现Closable并从Node(或子)扩展到这样做:
public void changeRight(Closable c,Node n) {
this.windowContent.get(Pos.CENTER_RIGHT).close();
this.setRight(n);
this.windowContent.put(Pos.CENTER_RIGHT,c);
}
但它仍然不会干净,因为我们会要求这个方法看起来像这样:
mainWindow.changeRight((Closable)myForm,(Node)myForm);
是否有更好/更干净的设计允许实现此功能?
答案 0 :(得分:0)
正如我所料,我的老师提供了一个简单而干净的解决方案。所以这是我的Closable界面:
public interface Closable {
public abstract void close();
}
我需要做的就是创建一个新的接口,它将使用getNode()方法从Closable扩展:
public interface NodeClosable extends Closable {
public Node getNode();
}
现在我需要做的就是在我的表单类
中实现这个接口public class MyForm extends VBox implements NodeClosable {
public Node getNode() {
return this;
}
public void close() {
/* some code here */
}
}
在我的ApplicationMainWindow中,我需要做的是:
public class ApplicationMainWindow extends BorderPane {
private HashMap<Pos,NodeClosable> windowContent;
public void changeRight(NodeClosable nc) {
this.windowContent.get(Pos.CENTER_RIGHT).close();
this.setRight(n.getNode());
this.windowContent.put(Pos.CENTER_RIGHT,c);
}
可以在一个界面中设置两种方法。