我有一个特定的课程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);
}
}
答案 0 :(得分:1)
您可以实现消息队列。然后让日志窗格轮询消息队列类以显示要显示的新消息。这意味着所有窗格都必须执行以下操作:
MessageQueue.postMessage("message to display");
然后在您的日志查看器中有一个调用类似于:
的TimerString messageToDisplay = MessageQueue.getMessage();
该课程看起来像这样:
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();
}
}
我认为类似的东西应该适合您的使用。
答案 1 :(得分:1)
您可以在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);
// ...
}
// ...
}