我有一个特定的类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
已经具有对LogPane
和ButtonPane
的引用,因此您所需要做的就是:public class MenuPane {
public MenuPane() {
LogPane logPane = new LogPane();
ButtonPane buttonPane = new ButtonPane();
buttonPane.setMessageHandler(logPane::push);
// ...
}
// ...
}