javafx.scene.control.TextArea.clear()不会清除显示的文本

时间:2018-06-20 13:30:01

标签: java javafx

我有一个带有TextArea字段的小型JavaFX应用程序,用于显示操作结果。 在运行类并第二次显示结果之前,我想清理TextArea。 我使用TextArea.clear();

但是仍然可以使用该文本,并且仅在方法结束时使用TextArea.insertText(0,text)覆盖文本。

eBICSResultText是TextArea

public void execute(ActionEvent event) {

       eBICSResultText.clear();
       eBICSResultText.setStyle("-fx-text-fill: black;");
        String currentBankAccess=CBbankAccess.getValue();
        String currentUser=CBuserId.getValue();
        String currentOT=CBorderType.getValue();
        String transferDirect=myEBICSData.getTransferDirect(currentOT);
        List<String> paramList = new ArrayList<String>();
        paramList.add(currentUser);
        paramList.add(currentBankAccess);
        paramList.add(currentOT);
        if (transferDirect.equals("R")) {
            paramList.add(1, "send");
            String fileToSend=sendFile.getText();
            if (fileToSend.equals("")) {
                eBICSResultText.setStyle("-fx-text-fill: firebrick; -fx-highlight-text-fill: firebrick;");
                eBICSResultText.insertText(0, "no file to send specified!");
                return;
            }
            paramList.add(fileToSend);
        } else if (transferDirect.equals("S")) {
            paramList.add(1, "fetch");
        } else {
            logger.error("no EBICS run!");
            return;
        }
        String[] EBICSparams = paramList.toArray(new String[0]);
        EBICSKernel kernel = new EBICSKernel();
        kernel.process(EBICSparams);
        int lastResult=kernel.getLastEBICSResult();
        String lastText=kernel.getLastEBICSReturnText();
        if (lastResult == -1 )
            eBICSResultText.setStyle("-fx-text-fill: firebrick; -fx-highlight-text-fill: firebrick;");
        eBICSResultText.insertText(0, lastText);
   }

3 个答案:

答案 0 :(得分:0)

首先,我将检查以确保您清除的TextArea是正确的。我曾经有两次设置对文本区域的引用,而不是将它们设置为不同的值。

第二,JavaFX事件应在Platform.runLater(event)调用中运行。由于您不在JavaFX Thread上,因此可能无法清除文本区域。如果您已经(单击按钮,将调用Node中的侦听器),则无视此评论。

第二,如果您确定它是正确的文本区域,并且在JavaFX Application Thread上,请尝试使用textArea.setText(text)

答案 1 :(得分:0)

所以我去了,把你的函数变成了一个可运行的例子,它对我来说很好用。为了使其正常工作,我对您的值进行了硬编码,并注释掉了导致我出错的东西,例如我没有的类(对我来说,更容易随意更改)

import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.TextArea;
import javafx.scene.layout.HBox;
import javafx.stage.Stage;

import java.util.ArrayList;
import java.util.List;


public class Main extends Application {

    TextArea eBICSResultText = new TextArea("Lorem ipsum dolor sit amet");

    @Override
    public void start(Stage stage) {
        HBox hBox = new HBox();

        Button executeButton = new Button("Execute");
        executeButton.setOnAction(this::execute);

        hBox.getChildren().addAll(eBICSResultText,executeButton);

        Scene scene = new Scene(hBox);
        stage = new Stage();
        stage.setScene(scene);
        stage.show();
    }

    public void execute(ActionEvent event) {
        eBICSResultText.clear();
        eBICSResultText.setStyle("-fx-text-fill: black;");
        String currentBankAccess="123";//CBbankAccess.getValue();
        String currentUser="456";//CBuserId.getValue();
        String currentOT="789";//CBorderType.getValue();
        String transferDirect="S";//myEBICSData.getTransferDirect(currentOT);
        List<String> paramList = new ArrayList<String>();
        paramList.add(currentUser);
        paramList.add(currentBankAccess);
        paramList.add(currentOT);
        if (transferDirect.equals("R")) {
            paramList.add(1, "send");
            String fileToSend="";//sendFile.getText();
            if (fileToSend.equals("")) {
                eBICSResultText.setStyle("-fx-text-fill: firebrick; -fx-highlight-text-fill: firebrick;");
                eBICSResultText.insertText(0, "no file to send specified!");
                return;
            }
            paramList.add(fileToSend);
        } else if (transferDirect.equals("S")) {
            paramList.add(1, "fetch");
        } else {
//            logger.error("no EBICS run!");
            return;
        }
//        String[] EBICSparams = paramList.toArray(new String[0]);
//        EBICSKernel kernel = new EBICSKernel();
//        kernel.process(EBICSparams);
        int lastResult=1;//kernel.getLastEBICSResult();
        String lastText="look at that";//kernel.getLastEBICSReturnText();
        if (lastResult == -1 )
            eBICSResultText.setStyle("-fx-text-fill: firebrick; -fx-highlight-text-fill: firebrick;");
        eBICSResultText.insertText(0, lastText);
    }


    public static void main(String[] args) { launch(args); }
}

仍然不确定是什么问题,您是否想在函数开头和结尾之间看到清晰的文字?

答案 2 :(得分:0)

如Zephyr所述,解决方案是将实际处理移到继承javafx.concurrent.Service的单独类中。 与此类的数据交换必须使用getter,setter和事件来实现。

    public void execute(ActionEvent event) {     
       logger.entry();
       eBICSResultText.setStyle("-fx-text-fill: black; -fx-highlight-text-fill: firebrick;");
       eBICSResultText.clear();
       eBICSResultText.setText("Process EBICS...");
       String currentBankAccess=CBbankAccess.getValue();
       String currentUser=CBuserId.getValue();
       String currentOT=CBorderType.getValue();
       String transferDirect=myEBICSData.getTransferDirect(currentOT);
       List<String> paramList = new ArrayList<String>();
       paramList.add(currentUser);
       paramList.add(currentBankAccess);
       paramList.add(currentOT);
       if (transferDirect.equals("R")) {
           paramList.add(1, "send");
           String fileToSend=sendFile.getText();
           if (fileToSend.equals("")) {
               eBICSResultText.setStyle("-fx-text-fill: firebrick; -fx-highlight-text-fill: firebrick;");
               eBICSResultText.setText("no file to send specified!");
               return;
           }
           paramList.add(fileToSend);
       } else if (transferDirect.equals("S")) {
           paramList.add(1, "fetch");
       } else {
           logger.error("no EBICS run!");
       }
       BTexecute.setDisable(true);
       MyEBICSService service = new MyEBICSService();
       service.setOnSucceeded(new EventHandler<WorkerStateEvent>() {

           @Override
           public void handle(WorkerStateEvent t) {
               BTexecute.setDisable(false);
               eBICSResultText.setText("EBICS communcation finished");
               int lastResult=service.getLastEBICSResult();
               String lastText=t.getSource().getValue().toString();
               if (lastResult == -1 ) {
                   eBICSResultText.setStyle("-fx-text-fill: firebrick; -fx-highlight-text-fill: firebrick;");
               }
               eBICSResultText.setText(lastText);
           }
       });
       service.setParams(paramList);
       service.start();
   }

...

class MyEBICSService extends Service<String> {

    /** holds the logger */
    private XLogger logger = XLoggerFactory.getXLogger(MyEBICSService.class.getName());

    List<String> paramList = new ArrayList<String>();

    int lastResult = -1;
    String lastText = "unknown";

       @Override
       protected Task<String> createTask() {
          return new Task<String>() {
             @Override
             protected String call() throws Exception {
               String[] EBICSparams = paramList.toArray(new String[0]);
               EBICSKernel kernel = new EBICSKernel();
               kernel.process(EBICSparams);
               logger.debug("EBICSKernel finished");
               lastResult=kernel.getLastEBICSResult();
               lastText=kernel.getLastEBICSReturnText();
               return lastText;
             }
          };
       }

    public final void setParams(List<String> paramList2) {
        this.paramList=paramList2;
    }
    public Integer getLastEBICSResult() {
        return this.lastResult;
    }
}