存储和使用界面和节点

时间:2017-05-30 07:57:43

标签: java javafx interface

好的,所以我正在研究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);

是否有更好/更干净的设计允许实现此功能?

1 个答案:

答案 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);
    }

可以在一个界面中设置两种方法。