2017-12-13 22 views
0
私は、多くの方法でモーダルウィンドウと呼ばれるクラスを持っている

に割り当てるペイン内からの私のモーダルウィンドウオブジェクトを閉じると、重要なものはここにいる:が、私はそれ

show(); 

hide(); 

getContent(); 

setContent(Pane p); 

私はモーダルウィンドウのインスタンスを作成し、私はsetContent(...);所定のPaneオブジェクト(ModalWindowインスタンスの作成後に生成されるオブジェクト)を使用して、show();を呼び出します。 hide();この方法は、公的にアクセス可能な一方で、通常は事前に生成されたウィンドウ内から呼び出される - 私は(のようなもの)

getPane(ModalWindow mW); 

私は(非表示にアクセスできるように、私はこれを行う)と呼ばれる別の方法を使用してこれを行います。ペインオブジェクト内から関数(私の場合は私のペインは、通常、モーダルウィンドウを閉じるためのボタンが含まれている、私はそう

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

を使用してこれを行うには、今、モーダルウィンドウの私のインスタンスのほとんどは、次のようになります。

を私は思ったんだけど何
ModalWindow mW = new ModalWindow(); 
mW.setContent(getPane(mW)); 
mW.show(); // ModalWindow usually closed from within itself 

は次のとおりです。作成後]ペインのオブジェクトを生成することなく、ペインが(に含まれていることをモーダルウィンドウオブジェクトにアクセスするためにリフレクション(またはその自然の何か)を使用する方法がありますModalWindowインスタンス)?

ここは完全です例:

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

要するに、オブジェクトがオブジェクトへの参照を保持している他のオブジェクトを発見する方法はありません(これはあなたがやろうとしていることです)。 (とにかく、このような 'ModalWindow'は1つしかないのはどうでしょうか?)おそらくあなたは実際のコードを投稿することができますか? –

+0

@James_D私は完全な例を追加しましたが、あなたは何を得ているのか分かります。 –

答えて

0

あなたはそれをこのような何か変更することができます。

public class ModalWindow { 

    StackPane centeringPane = new StackPane(); 

    // is this supposed to be bound to centeringPane.visibleProperty() somehow? 
    private BooleanProperty showing = new SimpleBooleanProperty(false); 

    private PaneHolder content ; 

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

    public ModalWindow(PaneHolder 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 PaneHolder getContent() { 
     return content ; 
    } 

    public void setContent(PaneHolder content) { 
     content.setModalWindow(this); 
     centeringPane.getChildren().clear(); 
     centeringPane.getChildren().add(content.getPane()); 
    } 
} 
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のコンテンツとして設定することはできません)。あなたにその考えを伝えてください。

+0

明日これを見ていきます。ご助力ありがとうございます。 –

関連する問題