2016-01-16 63 views
1

我有一個ArrayList的javafx.scene.control.Control(ArrayList)與兩個不同的控制下類(組合框,文本框)。組合框不能轉換爲TextField?

所以我想用它們兩個中的新輸入(example)來更新列表。

但是當我嘗試它,Eclipse使這樣的錯誤:

Exception in thread "JavaFX Application Thread" java.lang.ClassCastException: javafx.scene.control.ComboBox cannot be cast to javafx.scene.control.TextField 
    at application.DocumentBuildUp.aktualisiereListe(DocumentBuildUp.java:34) 
    at application.MainStage$2.handle(MainStage.java:99) 
    at application.MainStage$2.handle(MainStage.java:1) 
    at com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(Unknown Source) 
    at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(Unknown Source) 
    at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(Unknown Source) 
    at com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(Unknown Source) 
    at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(Unknown Source) 
    at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(Unknown Source) 
    at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(Unknown Source) 
    at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(Unknown Source) 
    at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(Unknown Source) 
    at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(Unknown Source) 
    at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(Unknown Source) 
    at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(Unknown Source) 
    at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(Unknown Source) 
    at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(Unknown Source) 
    at com.sun.javafx.event.EventUtil.fireEventImpl(Unknown Source) 
    at com.sun.javafx.event.EventUtil.fireEvent(Unknown Source) 
    at javafx.event.Event.fireEvent(Unknown Source) 
    at javafx.scene.Node.fireEvent(Unknown Source) 
    at javafx.scene.control.Button.fire(Unknown Source) 
    at com.sun.javafx.scene.control.behavior.ButtonBehavior.mouseReleased(Unknown Source) 
    at com.sun.javafx.scene.control.skin.BehaviorSkinBase$1.handle(Unknown Source) 
    at com.sun.javafx.scene.control.skin.BehaviorSkinBase$1.handle(Unknown Source) 
    at com.sun.javafx.event.CompositeEventHandler$NormalEventHandlerRecord.handleBubblingEvent(Unknown Source) 
    at com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(Unknown Source) 
    at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(Unknown Source) 
    at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(Unknown Source) 
    at com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(Unknown Source) 
    at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(Unknown Source) 
    at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(Unknown Source) 
    at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(Unknown Source) 
    at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(Unknown Source) 
    at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(Unknown Source) 
    at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(Unknown Source) 
    at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(Unknown Source) 
    at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(Unknown Source) 
    at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(Unknown Source) 
    at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(Unknown Source) 
    at com.sun.javafx.event.EventUtil.fireEventImpl(Unknown Source) 
    at com.sun.javafx.event.EventUtil.fireEvent(Unknown Source) 
    at javafx.event.Event.fireEvent(Unknown Source) 
    at javafx.scene.Scene$MouseHandler.process(Unknown Source) 
    at javafx.scene.Scene$MouseHandler.access$1500(Unknown Source) 
    at javafx.scene.Scene.impl_processMouseEvent(Unknown Source) 
    at javafx.scene.Scene$ScenePeerListener.mouseEvent(Unknown Source) 
    at com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(Unknown Source) 
    at com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(Unknown Source) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at com.sun.javafx.tk.quantum.GlassViewEventHandler.lambda$handleMouseEvent$354(Unknown Source) 
    at com.sun.javafx.tk.quantum.QuantumToolkit.runWithoutRenderLock(Unknown Source) 
    at com.sun.javafx.tk.quantum.GlassViewEventHandler.handleMouseEvent(Unknown Source) 
    at com.sun.glass.ui.View.handleMouseEvent(Unknown Source) 
    at com.sun.glass.ui.View.notifyMouse(Unknown Source) 
    at com.sun.glass.ui.win.WinApplication._runLoop(Native Method) 
    at com.sun.glass.ui.win.WinApplication.lambda$null$148(Unknown Source) 
    at java.lang.Thread.run(Unknown Source) 

我希望你能有所幫助。

這是代碼。 類DokumentBuilUp具有updateList的方法。我將它命名爲「aktualisiereListe」。 :))

類MainStage中:

public class MainStage extends Application { 

    /** 
    * Globale Variablen 
    */ 
    private int abstandszaehler = 0; 
    private ScrollPane rahmen = new ScrollPane(); 
    private XMLActions xA = new XMLActions(); 
    private Pane partPane = new Pane(); 
    private Group huelle = new Group(); 
    private int iD = 0; 
    private List<Control> entries = new ArrayList<Control>(); 
    private DocumentBuildUp dBU = new DocumentBuildUp(entries); 



    /** 
    * The main class for a JavaFX application extends the javafx.application.Application class. 
    * The start() method is the main entry point for all JavaFX applications. 
    */ 
    public static void main(String[] args) { 
     launch(args); 
    } 


    @Override 
    public void start(Stage primaryStage) { 
     //Policy bezüglich Scrollingverhalten 
     rahmen.setHbarPolicy(ScrollBarPolicy.ALWAYS); 
     rahmen.setVbarPolicy(ScrollBarPolicy.ALWAYS); 

     //Fenster konfigurieren und anzeigen 
     primaryStage.setTitle("XML-Zeilenersteller"); 
     primaryStage.setResizable(false); 


     //Erzeugt notwendige Elemente im GUI 
     erzeugeEinzelneElemente(); 

     partPane.setStyle("-fx-background-color: lightsteelblue"); 
     huelle.getChildren().addAll(partPane); 
     rahmen.setContent(huelle); 
     Scene mainScene = new Scene(rahmen, 900, 590); 
     primaryStage.setScene(mainScene); 
     primaryStage.show(); 
    } 







    /** 
    * HauptElemente für die Root 
    */ 
    public void erzeugeEinzelneElemente(){ 
     //Buttons 
     Button newXMLLine = new Button(); 
     newXMLLine.setText("Einfügen neuer XML-Zeile"); 
     newXMLLine.setLayoutX(735); 
     newXMLLine.setLayoutY(80); 
     newXMLLine.setOnAction(new EventHandler<ActionEvent>() { 
      @Override 
      public void handle(ActionEvent event) { 
       setEverythingInALine(); 
      } 
     }); 

     Button newXMLDocument = new Button(); 
     newXMLDocument.setText("Erstelle XML-Dokument"); 
     newXMLDocument.setLayoutX(735); 
     newXMLDocument.setLayoutY(550); 
     newXMLDocument.setOnAction(new EventHandler<ActionEvent>() { 
      @Override 
      public void handle(ActionEvent event) { 


       dBU.aktualisiereListe(entries); 

       System.out.println("Test2"); 
      } 
     }); 

     //Überschrift 
     Text header = new Text(105, 50, "XML Lines Creator"); 
     header.setFont(new Font(30)); header.setStyle("-fx-underline: true;"); 

     /** 
     * Hinzufügen zur GUI 
     */ 
     partPane.getChildren().addAll(newXMLDocument,newXMLLine,header); 
    } 






    /** 
    * Methode zur Erstellungen der Zeilen an Comboboxen, Textfelder 
    */ 
    @SuppressWarnings({ "rawtypes", "unchecked" }) 
    public void setEverythingInALine(){ 
     //Comboboxen 
     ComboBox cB = new ComboBox(xA.getList()); 
     partPane.getChildren().add(cB); 
     cB.setLayoutX(80); 
     cB.setLayoutY(80 + abstandszaehler); 
     entries.add(cB); 
     iD++; 
//  cB.setId(Integer.toString(iD)); 

     //Textfield 
     TextField tFID= new TextField ("ID"); 
     partPane.getChildren().add(tFID); 
     tFID.setLayoutX(185); 
     tFID.setLayoutY(80 + abstandszaehler); 
     entries.add(tFID); 



     TextField tFName= new TextField ("Name"); 
     partPane.getChildren().add(tFName); 
     tFName.setLayoutX(340); 
     tFName.setLayoutY(80 + abstandszaehler); 
     entries.add(tFName); 


     TextField tFWert= new TextField ("Wert"); 
     partPane.getChildren().add(tFWert); 
     tFWert.setLayoutX(495); 
     tFWert.setLayoutY(80 + abstandszaehler); 
     entries.add(tFWert); 


     System.out.println(Integer.toString(iD)); 

     //Zaehler für den Abstand 
     abstandszaehler = abstandszaehler + 30; 

     System.out.println(entries); 
    } 
} 

類DocumentBuilUp:

public class DocumentBuildUp{ 

    @SuppressWarnings("unused") 
    private List<Control> list; 

    public DocumentBuildUp(List<Control> list){ 
     this.list = list; 
    } 

    public List<String> aktualisiereListe(List<Control> list){ 

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

     for(int i=0; i<=list.size()-1; i++){ 

      //Brauche die Zahl beim Anklicken der Zeile Listener? 
      if(i%3 == 1){ 
       ComboBox cB = (ComboBox) list.get(i); 
       stringEntries.add((String) cB.getValue()); 
      } 

      if(i%3 == 2 || i%3 == 0){ 
       TextField tF = (TextField) list.get(i); 
       stringEntries.add(tF.getText()); 
      } 
     } 
     System.out.println(stringEntries); 

     return stringEntries; 
    } 
} 

編輯: 我可以有兩個分離式列表嘗試。一個用於Combobox,一個用於Textfield。編輯2: 它正在與兩個Arraylists! :))

回答

1

如果你比較如何entries列表的內容加入,你如何在aktualisiereListe使用它,你應該能夠看到這個問題:

public void setEverythingInALine(){ 
    ... 
    entries.add(someCombobox); 
    ... 
    entries.add(someTextfield); 
    ... 
    entries.add(someTextfield2); 
    ... 
    entries.add(someTextfield3); 
} 

這意味着有一個子3 TextField s。另外,第一元素是一個組合框

public List<String> aktualisiereListe(List<Control> list){ 
    ... 
    for(int i=0; i<=list.size()-1; i++){ 
     if(i%3 == 1){ 
      ComboBox cB = (ComboBox) list.get(i); 
      ... 
     } 

     if(i%3 == 2 || i%3 == 0){ 
      TextField tF = (TextField) list.get(i); 
      ... 
     } 
    } 
    ... 
} 

在這裏假設第一個元素(索引0)是一個TextField0 % 3 = 0),它不是這種情況。另外的3個TextField S中的子會產生一個錯誤,因爲連續3個指標將產生全部3個不同的值模3:

1 % 3 = 1 
2 % 3 = 2 
3 % 3 = 0 

這將導致另一ClassCastException

我會考慮將元素添加到列表,並檢索它們這樣一種不好的做法,因爲你不能在不破壞其他aktualisiereListe改變元素的順序(當然也可以,但有非常嚴格的限制)。一個稍微好一點的辦法是使用instanceof檢查元素類型:

for(Control c : list) { 
     if(c instanceof ComboBox){ 
      ComboBox cB = (ComboBox) c; 
      ... 
     } else { 
      TextField tF = (TextField) c; 
      ... 
     } 
    } 

但是你可以簡單地保持一個列表,始終是最新的,通過註冊的更改偵聽到Control s,這是我想喜歡:

public class ListModifyingChangeListener implements ChangeListener<String> { 
    private final int index; 
    private final List<String> list; 

    public ListModifyingChangeListener(int index, List<String> list) { 
     this.index = index; 
     this.list = list; 
    } 

    @Override 
    public void changed(ObservableValue<? extends String> observable, String oldValue, String newValue) { 
     list.set(index, newValue); 
    } 

} 
List<String> liste; // this could be declared a field 

    ComboBox<String> cB = ... 
    ... 

    // create fixed sized list with initial values 
    liste = Arrays.asList(cB.getValue(), tFID.getText(), tFName.getText(), tFWert.getText()); 

    // register listeners that modify a certain element of liste on change 
    cB.valueProperty().addListener(new ListModifyingChangeListener(0, liste)); 
    tFID.textProperty().addListener(new ListModifyingChangeListener(1, liste)); 
    tFName.textProperty().addListener(new ListModifyingChangeListener(2, liste)); 
    tFWert.textProperty().addListener(new ListModifyingChangeListener(3, liste)); 

這可以確保liste總是包含最新的值,還可以防止名單不必要的娛樂。無需將控件列表傳遞給方法並區分控件類型...

+0

謝謝。我不知道有一個InstanceOf方法,這使得更容易! :D – Ceeya

1

符合此條件的位置(i%3 == 2 || i%3 == 0)上有ComboBox,因此將ComboBox強制轉換爲TextField(((TextField)list.get(i))時會出現錯誤。

+0

Jep你說得對。我用兩個分離的數組列表來解決這個問題。 – Ceeya