2017-12-19 9 views
1

MenuPane, GridPane까지 확장되는 특정 클래스가 있습니다. 문자 메시지를 표시하는 여러 개의 클릭 버튼
LogPane를 포함하는,
ButtonPane 보여줍니다 StatPane, 다양한 번호 :이 창은 3 개도 GridPane을 확장 모두 다른 창이 포함되어 있습니다.다른 여러 클래스에서 사용할 수있는 클래스를 표시하는 텍스트

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

답변

1

ButtonPanemessageHandler 속성을 정의 할 수 있습니다. 단순히 메시지를 처리 ​​뭔가 "는 String에 무언가를"해야한다, 그래서, 그냥 Consumer<String> 될 수 LogPane 특정 할 필요는 없습니다 : 당신의 MenuPane 이미 가지고 있기 때문에, 지금

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

} 

LogPaneButtonPane에 대한 참조는 다음과 같습니다.

public class MenuPane { 

    public MenuPane() { 

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

     buttonPane.setMessageHandler(logPane::push); 

     // ... 
    } 

    // ... 
} 
+1

매력처럼 작동했습니다. 감사. – JavaHR

1

당신은 메시지 큐를 구현할 수 있습니다. 그런 다음 로그 창에 새 메시지가 표시 될 메시지 대기열 클래스를 폴링하게하십시오. 이 같은 것을 볼 수 있었다

String messageToDisplay = MessageQueue.getMessage(); 

클래스 : 로그 뷰어에서 다음

MessageQueue.postMessage("message to display"); 

같은 것을 호출하는 타이머를 가지고 :

을이 모든 창은 같이해야 할 것이다 것을 의미
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(); 

    } 

} 

여러분의 용도에 맞게 잘 작동해야한다고 생각합니다.