从我分配给它的窗格中关闭我的ModalWindow对象

时间:2017-12-13 00:22:13

标签: javafx

我有一个名为ModalWindow的类,有许多方法,重要的是:

show();

hide();

getContent();

setContent(Pane p);

当我创建ModalWindow的一个实例时,我的setContent(...);使用预定的Pane对象(在创建ModalWindow实例后生成的对象),然后调用show();. hide();方法,虽然可公开访问,通常从预先生成的窗格中调用 - 我这样做是通过使用另一种方法调用(类似的东西)

getPane(ModalWindow mW);

我这样做,以便我可以访问hide();从Pane对象中的函数(在我的情况下,我的Pane通常包含一个用于关闭ModalWindow的按钮,我这样做是通过使用

closeButton.setOnMouseClicked(event -> mW.hide());

所以,现在,我的大多数ModalWindow实例都是这样的:

ModalWindow mW = new ModalWindow();
mW.setContent(getPane(mW));
mW.show(); // ModalWindow usually closed from within itself

我想知道的是:有没有办法使用反射(或那种性质的东西)来访问包含Pane的ModalWindow对象(无需在创建ModalWindow实例后生成Pane对象) )?

以下是一个完整的例子:

public class Main {
    public static void main(String[] args) {
        ModalWindow mW = new ModalWindow();
        mW.setContent(PaneHolder.getPane(mW));
        mW.show();
    }
}

public class ModalWindow {

    StackPane centeringPane = new StackPane();
    private BooleanProperty showing = new SimpleBooleanProperty(false);

    public ModalWindow() {
        centeringPane.setOpacity(0);
        centeringPane.setAlignment(Pos.CENTER);
    }

    public ModalWindow(Pane content) {
        centeringPane.setOpacity(0);
        centeringPane.setAlignment(Pos.CENTER);
        setContent(content);
    }

    public void show() {
        centeringPane.setVisible(true);
    }

    public void hide() {
        centeringPane.setVisible(false);
    }

    public boolean isShowing() {
        return showing.get();
    }

    public BooleanProperty showingProperty() {
        return showing;
    }

    public void setShowing(boolean showing) {
        this.showing.set(showing);
    }

    public Pane getContent() {
        return (Pane) centeringPane.getChildren().get(0);
    }

    public void setContent(Pane content) {
        centeringPane.getChildren().clear();
        centeringPane.getChildren().add(content);
    }
}
public class PaneHolder {
    Pane getPane(ModalWindow mW) {
        Pane p = new Pane();
        Button closeButton = new Button("Close");
        closeButton.setOnAction(event -> mW.hide()); // I need the reference to mW here
        p.getChildren.add(closeButton);
        return p;
    }
}

1 个答案:

答案 0 :(得分:0)

你可以这样修改:

public class PaneHolder {

    private final Pane pane ;
    private ModalWindow mw ;

    public PaneHolder() {
        pane = new Pane();
        Button closeButton = new Button("Close");
        closeButton.setOnAction(event -> mw.hide()); 
        p.getChildren.add(closeButton);
        return p;
    }

    public Pane getPane() {
        return pane ;
    }

    void setModalWindow(ModalWindow mw) {
        this.mw = mw ;
    }
}
PaneHolder paneHolder = new PaneHolder();
ModalWindow mw = new ModalWindow(paneHolder);

然后你可以做以下事情:

PaneHolder

并且关闭按钮无需其他代码即可使用。

这不是完全健壮的等等;您可能想要更多地考虑这些对象的生命周期(例如,您可能希望强制ModalWindow无法设置为{{1}}的内容(如果它是&#39}}。已经是另一个人的内容,等等,但它应该给你这个想法。