2016-07-25 89 views
1

原諒我,如果我問的是顯而易見的,但我不知道如何使用RichTextFx在StyleClassedTextArea中創建綁定。我想要做的是有一個區域和一個按鈕(這將觸發某種類型的文本處理),並禁用該按鈕,如果該區域爲空。 我的代碼如下RichTextFx:如何添加綁定到StyleClassedTextArea

Main.java

package application; 

import javafx.application.Application; 
import javafx.fxml.FXMLLoader; 
import javafx.stage.Stage; 
import javafx.scene.Parent; 
import javafx.scene.Scene; 

public class Main extends Application { 

    @Override 
    public void start(Stage primaryStage) { 
     try { 
      Parent root = FXMLLoader.load(getClass().getResource("Main.fxml"));    
      Scene scene = new Scene(root); 
      scene.getStylesheets().add(getClass().getResource("application.css").toExternalForm()); 
      primaryStage.setScene(scene); 
      primaryStage.show(); 
     } catch(Exception e) { 
      e.printStackTrace(); 
     } 
    } 

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

Controller.java

package application; 

import java.net.URL; 
import java.util.ResourceBundle; 
import org.fxmisc.richtext.StyleClassedTextArea; 
import javafx.beans.binding.Bindings; 
import javafx.beans.value.ObservableStringValue; 
import javafx.fxml.FXML; 
import javafx.fxml.Initializable; 
import javafx.scene.control.Button; 

public class Controller implements Initializable { 
    @FXML private StyleClassedTextArea mainArea; 
    @FXML private Button processButton; 
    @Override 
    public void initialize(URL arg0, ResourceBundle arg1) { 
     // TODO Auto-generated method stub 
     processButton.disableProperty().bind(Bindings.isEmpty((ObservableStringValue) mainArea.textProperty())); 
    } 
} 

Main.fxml

<?xml version="1.0" encoding="UTF-8"?> 

<?import javafx.scene.control.Button?> 
<?import javafx.scene.layout.AnchorPane?> 
<?import javafx.scene.layout.VBox?> 
<?import org.fxmisc.richtext.StyleClassedTextArea?> 


<AnchorPane prefHeight="308.0" prefWidth="291.0" xmlns:fx="http://javafx.com/fxml/1" xmlns="http://javafx.com/javafx/8.0.60" fx:controller="application.Controller"> 
    <children> 
     <VBox layoutY="6.0" prefHeight="308.0" prefWidth="291.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0"> 
     <children> 
      <StyleClassedTextArea fx:id="mainArea" /> 
      <Button fx:id="processButton" mnemonicParsing="false" text="process" /> 
     </children> 
     </VBox> 
    </children> 
</AnchorPane> 

,這是因爲mainTextArea.textProperty()回報ObservableValue<String>當我投它拋出以下堆棧跟蹤

javafx.fxml.LoadException: 
/C:/Users/dcg601/workspace/javafx/bin/application/Main.fxml 

    at javafx.fxml.FXMLLoader.constructLoadException(FXMLLoader.java:2601) 
    at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2579) 
    at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2441) 
    at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3214) 
    at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3175) 
    at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3148) 
    at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3124) 
    at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3104) 
    at javafx.fxml.FXMLLoader.load(FXMLLoader.java:3097) 
    at application.Main.start(Main.java:22) 
    at com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$162(LauncherImpl.java:863) 
    at com.sun.javafx.application.PlatformImpl.lambda$runAndWait$175(PlatformImpl.java:326) 
    at com.sun.javafx.application.PlatformImpl.lambda$null$173(PlatformImpl.java:295) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at com.sun.javafx.application.PlatformImpl.lambda$runLater$174(PlatformImpl.java:294) 
    at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:95) 
    at com.sun.glass.ui.win.WinApplication._runLoop(Native Method) 
    at com.sun.glass.ui.win.WinApplication.lambda$null$148(WinApplication.java:191) 
    at java.lang.Thread.run(Unknown Source) 
Caused by: java.lang.ClassCastException: org.reactfx.value.SuspendableValWrapper cannot be cast to javafx.beans.value.ObservableStringValue 
    at application.Controller.initialize(Controller.java:20) 
    at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2548) 
    ... 17 more 
+0

嘗試顯式強制轉換:'processButton.disableProperty()。bind(Bindings.isEmpty((ObservableStringValue)mainTextArea.textPropert y()));' –

+0

@AndreyM不幸的是不起作用,拋出一個奇怪的例外。我編輯了我的問題,包括一個MCVE –

+0

那麼錯誤說換句話說它不能被鑄造:) –

回答

1

這是瘋了,但它的工作原理的異常:

@Override 
public void initialize(URL arg0, ResourceBundle arg1) { 
    // TODO Auto-generated method stub 
    ObservableValue<String> qwer = mainArea.textProperty(); 

    ObservableStringValue qwerQ = new ObservableStringValue() { 
     public String get() { return qwer.getValue(); } 
     public String getValue() { return qwer.getValue(); } 
     public void addListener(InvalidationListener listener) { 
      qwer.addListener(listener); 
     } 
     public void removeListener(InvalidationListener listener) { 
      qwer.removeListener(listener); 
     } 
     public void addListener(ChangeListener<? super String> listener) { 
      qwer.addListener(listener); 
     } 
     public void removeListener(ChangeListener<? super String> listener) { 
      qwer.removeListener(listener); 
     } 
    }; 

    processButton.disableProperty().bind(Bindings.isEmpty(qwerQ)); 
} 

但可能更好地添加一個簡單的聽衆:

mainArea.textProperty().addListener((ov, oldv, newv) -> { 
    processButton.setDisable(newv.isEmpty()); 
}); 
+0

感謝它的工作,但我更喜歡聽者模式 –