2017-12-19 10 views
1

私は特定のクラスMenuPaneを持っていますが、これはGridPaneです。テキストメッセージを表示する、複数のクリック可能ボタン
LogPaneを含む、
ButtonPane示すStatPane、種々の数:このペインは3つのもGridPaneを拡張すべてが他のペインを含んでいます。他の複数のクラスで使用できるクラスを示すテキスト

MenuPaneは、LogPanes push(String message)機能を使用してメッセージを印刷できます。しかし、ButtonPaneボタンをクリックしたときにもメッセージを印刷する必要があります。

これに最も効率的な方法は何ですか?もちろんButtonPaneにMenuPaneを与えることができ、this.MenuPane.LogPane.push("This is a message.");を実行することができますが、これはひどいです。誰もがこれを行うより効率的な/クリーンな方法を知っていますか?

LogPaneコード:

import Project.Other.Constants; 
import javafx.scene.control.TextArea; 
import javafx.scene.layout.GridPane; 

/** 
* Created on 15/12/2017. 
* Scrollable window which contains Text messages. 
*/ 
class LogPane extends GridPane{ 

    private TextArea log; 

    LogPane(){ 
    initialize(); 
    } 

    private void initialize(){ 
    log = new TextArea(); 
    log.setEditable(false); 
    log.prefWidth(Constants.width/3); 
    log.prefHeight(Constants.height); 
    log.setText("Text Log loaded. Messages:"); 
    setConstraints(log, 0, 0); 
    getChildren().add(log); 

    setMinHeight(Constants.height); 
    setMaxHeight(Constants.height); 
    setMinWidth(Constants.width/3); 
    setMaxWidth(Constants.width/3); 
    } 

    void push(String message){ 
    log.setText(log.getText() + "\n" + message); 
    log.appendText(""); 
    //log.setScrollTop(Double.MAX_VALUE); 
    } 
} 

答えて

1

ButtonPanemessageHandlerプロパティを定義できます。単にメッセージを処理する何かが「Stringで何かを」しなければならないので、それは、それだけでConsumer<String>することができLogPaneに固有である必要はありません:あなたのMenuPaneがすでに持っているので、今

public class ButtonPane { 

    private Consumer<String> messageHandler = s -> { } ; 

    public void setMessageHandler(Consumer<String> messageHandler) { 
     this.messageHandler = messageHandler ; 
    } 

    // ... 

    // to handle a message, just do: 
    // String message = ... ; 
    // messageHandler.accept(message); 

} 

LogPaneButtonPaneへの参照に必要なものは次のとおりです。

public class MenuPane { 

    public MenuPane() { 

     LogPane logPane = new LogPane(); 
     ButtonPane buttonPane = new ButtonPane(); 

     buttonPane.setMessageHandler(logPane::push); 

     // ... 
    } 

    // ... 
} 
+1

それは魅力のように働きました!ありがとう。 – JavaHR

1

あなたがメッセージキューを実装することができます。次に、新しいメッセージが表示されるように、ログペインでメッセージキュークラスをポーリングするようにします。このような何かを見ることができる

String messageToDisplay = MessageQueue.getMessage(); 

クラス:あなたのログビューアで次に

MessageQueue.postMessage("message to display"); 

のようなものを呼び出すタイマーを持っている:

をこれは、すべてのペインのような何かをしなければならないことを意味します
public class MessageQueue { 

    public static Queue<String> messages = new PriorityQueue<String>(); 

    public static void postMessage(String message) 
    { 
     messages.add(message); 
    } 

    public static String getMessage(){ 

     return messages.poll(); 

    } 

} 

あなたの使い方にはうまくいくはずです。

関連する問題