我有一个名为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;
}
}
答案 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}}。已经是另一个人的内容,等等,但它应该给你这个想法。