显示可由多个其他类使用的Class的文本

时间:2017-12-19 12:55:57

标签: java javafx

我有一个特定的课程MenuPane,它扩展了GridPane。此窗格包含3个其他窗格,所有窗格也扩展GridPaneStatPane,显示各种数字
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);
  }
}

2 个答案:

答案 0 :(得分:1)

您可以实现消息队列。然后让日志窗格轮询消息队列类以显示要显示的新消息。这意味着所有窗格都必须执行以下操作:

MessageQueue.postMessage("message to display");

然后在您的日志查看器中有一个调用类似于:

的Timer
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();

    }

}

我认为类似的东西应该适合您的使用。

答案 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已经引用了LogPaneButtonPane,因此您只需:

public class MenuPane {

    public MenuPane() {

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

        buttonPane.setMessageHandler(logPane::push);

        // ...
    }

    // ...
}