我有一个带有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);
}
答案 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;
}
}