Java 显示可由多个其他类使用的类的文本
我有一个特定的类Java 显示可由多个其他类使用的类的文本,java,javafx,Java,Javafx,我有一个特定的类MenuPane,它扩展了GridPane。此窗格包含3个其他窗格,所有这些窗格也扩展了GridPane: StatPane,显示各种数字 ButtonPane,包含多个可点击按钮 日志窗格,用于显示文本消息 MenuPane可以使用日志窗格push(字符串消息)功能打印消息。但是,当单击按钮pane按钮时,我也需要打印消息 最有效的方法是什么?我当然可以给ButtonPane菜单栏,然后做this.MenuPane.LogPane.push(“这是一条消息”)
MenuPane
,它扩展了GridPane
。此窗格包含3个其他窗格,所有这些窗格也扩展了GridPane
:
StatPane
,显示各种数字ButtonPane
,包含多个可点击按钮日志窗格
,用于显示文本消息
MenuPane
可以使用日志窗格push(字符串消息)
功能打印消息。但是,当单击按钮pane
按钮时,我也需要打印消息
最有效的方法是什么?我当然可以给ButtonPane菜单栏,然后做this.MenuPane.LogPane.push(“这是一条消息”)但是这看起来很糟糕。有人知道更有效/更清洁的方法吗
日志窗格代码:
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);
}
}
您可以实现一个消息队列。然后让日志窗格轮询消息队列类以显示新消息。这意味着所有窗格都必须执行以下操作:
MessageQueue.postMessage("message to display");
然后,在日志查看器中有一个计时器,它会调用以下内容:
String 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();
}
}
公共类消息队列{
public static Queue messages=new PriorityQueue();
公共静态void postMessage(字符串消息)
{
消息。添加(消息);
}
公共静态字符串getMessage(){
返回消息。poll();
}
}
我认为类似的东西应该适合您的使用。您可以在按钮面板中定义messageHandler
属性;处理消息的东西只需“使用字符串执行某些操作”
,因此它不需要特定于日志窗格,它可以是:
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);
}
public class MenuPane {
public MenuPane() {
LogPane logPane = new LogPane();
ButtonPane buttonPane = new ButtonPane();
buttonPane.setMessageHandler(logPane::push);
// ...
}
// ...
}