好的,我正在开发 JavaFX 软件。我正在使用 BorderPane,假设我希望表单位于右侧。用户可以通过菜单在表单之间进行切换。我希望能够建议用户在更改为另一个表单之前保存/完成表单(或不保存)。
所以我采用了一个简单的解决方案,一个接口(interface),我将在自定义节点上实现它:
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);
是否有更好/更简洁的设计来实现此功能?
最佳答案
正如我所期望的,我的老师提供了一个简单干净的解决方案。这是我的 Closable 界面:
public interface Closable {
public abstract void close();
}
我需要做的就是创建一个新的接口(interface),该接口(interface)将使用 getNode() 方法从 Closable 扩展:
public interface NodeClosable extends Closable {
public Node getNode();
}
现在我需要做的就是在我的表单类中实现这个接口(interface)
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);
}
也许可以在一个界面中设置这两种方法。
关于java - 接口(interface)和节点的存储和使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44256646/