我有一个特定的类MenuPane,它扩展了GridPane。此窗格包含其他3个窗格,它们也都扩展了GridPane
StatPane,显示各种数字
ButtonPane,其中包含多个可点击的按钮
LogPane,显示短信。

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

最佳答案

您可以在messageHandler中定义ButtonPane属性。处理消息的内容只需“使用String做某事”,因此它不必特定于LogPane,它可以只是一个Consumer<String>

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);

}


现在,由于您的MenuPane已经具有对LogPaneButtonPane的引用,因此您所需要做的就是:

public class MenuPane {

    public MenuPane() {

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

        buttonPane.setMessageHandler(logPane::push);

        // ...
    }

    // ...
}

09-17 01:28