Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/blackberry/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 显示可由多个其他类使用的类的文本_Java_Javafx - Fatal编程技术网

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

        // ...
    }

    // ...
}