Fxbefehle aus Main umwandeln in @FXML

Bitte aktiviere JavaScript!
Ich habe aus einem Tutorial diesesn Code
Code:
package ccc;
import javafx.application.Application;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.event.ActionEvent;
import javafx.geometry.HPos;
import javafx.geometry.Insets;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.ListView;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.ColumnConstraints;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.Priority;
import javafx.scene.layout.VBox;
import javafx.scene.paint.Color;
import javafx.stage.Stage;
/*from  w w  w. j a  va 2 s .  co m*/
public class Main extends Application {

  @Override
  public void start(Stage primaryStage) {
    BorderPane root = new BorderPane();
    Scene scene = new Scene(root, 400, 250, Color.WHITE);

    GridPane gridpane = new GridPane();
    gridpane.setPadding(new Insets(5));
    gridpane.setHgap(10);
    gridpane.setVgap(10);
    ColumnConstraints column1 = new ColumnConstraints(150, 150,
        Double.MAX_VALUE);
    ColumnConstraints column2 = new ColumnConstraints(50);
    ColumnConstraints column3 = new ColumnConstraints(150, 150,
        Double.MAX_VALUE);
    column1.setHgrow(Priority.ALWAYS);
    column3.setHgrow(Priority.ALWAYS);
    gridpane.getColumnConstraints().addAll(column1, column2, column3);

  
  //canditates
    final ObservableList<String> candidates = FXCollections
        .observableArrayList("Z", "A", "B", "C", "D");
    final ListView<String> candidatesListView = new ListView<>(candidates);
    gridpane.add(candidatesListView, 0, 1);

    final ObservableList<String> selected = FXCollections.observableArrayList();
    final ListView<String> heroListView = new ListView<>(selected);
    gridpane.add(heroListView, 2, 1);

    Button sendRightButton = new Button(" > ");
    sendRightButton.setOnAction((ActionEvent event) -> {
      String potential = candidatesListView.getSelectionModel()
          .getSelectedItem();
      if (potential != null) {
        candidatesListView.getSelectionModel().clearSelection();
        candidates.remove(potential);
        selected.add(potential);
      }
    });

    Button sendLeftButton = new Button(" < ");
    sendLeftButton.setOnAction((ActionEvent event) -> {
      String s = heroListView.getSelectionModel().getSelectedItem();
      if (s != null) {
        heroListView.getSelectionModel().clearSelection();
        selected.remove(s);
        candidates.add(s);
      }
    });
    VBox vbox = new VBox(5);
    vbox.getChildren().addAll(sendRightButton, sendLeftButton);

    gridpane.add(vbox, 1, 1);
    root.setCenter(gridpane);

    GridPane.setVgrow(root, Priority.ALWAYS);
    primaryStage.setScene(scene);
    primaryStage.show();
  }
  public static void main(String[] args) {
    launch(args);
  }
}
es laüft als Einzelanwendung. Ich fände es nun schick es in einem meiner Projekte einzufügen. Meine Projekte sind aber wohl der seltenen Sorte.
Java:
package application5;

import java.io.IOException;

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





public class Main extends Application {
    
private Stage primaryStage;

public void start(Stage primaryStage){
        this.primaryStage =primaryStage;
        mainWindow();
    }
    public void mainWindow(){
    
        try{
    
    FXMLLoader loader = new FXMLLoader(Main.class.getResource("MainWindow.fxml"));
    AnchorPane pane =loader.load();   
    primaryStage.setMinHeight(400.00);
    primaryStage.setMinWidth(400.00);
    
    MainWindowController mainWindowController = loader.getController();
    mainWindowController.setMain(this);
    Scene scene=new Scene(pane);
    primaryStage.setScene(scene);
    primaryStage.show();



  
 

    
    
    

       }
Java:
package application5;


import java.io.BufferedWriter;
             import java.io.FileWriter;
             import java.io.IOException;
             import java.io.PrintWriter;

import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.ListView;
import javafx.scene.control.TextArea;
import javafx.scene.layout.GridPane;



public class MainWindowController {
    
    public Main main;
    public void setMain(Main main){
        this.main =main;}
    @FXML
    private GridPane gridpane;
      @FXML
        private Label selected;       
      
      @FXML
        private Label Canditates;


            
            @FXML
            private Button sendLeftButton;

            @FXML
            private Button sendRightButton;
            @FXML
            private ListView  heroListView;
            

            @FXML
            private ListView candidatesListView;

            @FXML
        private TextArea lesenText;

        @FXML
        private TextArea schreibenText;

        @FXML
        private Button lesebut;

        @FXML
        private Button schreibbut;


        @FXML
        private Label label;

        @FXML
        private Button speichbut;   
      
      
        @FXML
        private ListView myliste;
        
        
      
        @FXML
        void actButLeft(ActionEvent event){
      
   }

        @FXML
        void actButRight(ActionEvent event) {
                
        }
          
        @FXML
        void kk1(ActionEvent event) {
            
        }

        @FXML
        void kk2(ActionEvent event) {

        }


        @FXML
        void LeseBut(ActionEvent event) {
       }
        @FXML
        void OnMouseclicketlist(ActionEvent  event ){
            myliste.getOnMouseClicked();
            System.out.println(schreibenText);
            
        
        }
        @FXML
        void SpeichBut(ActionEvent event) throws java.io.FileNotFoundException {
     String dateiText =schreibenText.getText();//die TextArea id für die Eingabe nennt sich schreibenText
             lesenText.appendText(dateiText);//derButton Speicherbut löst das lesed aus schreibtext aus und überträgt nach Textarea LesenText
             PrintWriter pWriter = null;
             try {System.out.println ("geklickt");
                    pWriter = new PrintWriter(new BufferedWriter(new FileWriter("\\C:\\test.txt")));
                    pWriter.println(dateiText);// das zuletzt ausgelesene dateiText wird in die Datei test.txt geschrieben
                } catch (IOException ioe) {
                    ioe.printStackTrace();
                } finally {
                    if (pWriter != null){
                        pWriter.flush();
                        pWriter.close();
                    }
                }
            }
      
@FXML
        void SchreiBut(ActionEvent event) {
            
            
            System.out.print("bot gedrückt");
            
            String leo = lesenText.getText();
            schreibenText.appendText(leo);
            
    
    }}
Code:
<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.geometry.*?>
<?import java.lang.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>
<?import javafx.scene.layout.AnchorPane?>

<AnchorPane cache="true" cacheHint="QUALITY" prefHeight="617.0" prefWidth="900.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="application5.MainWindowController">
  <!-- TODO Add Nodes -->
  <children>
      <HBox prefHeight="584.0" prefWidth="692.0">
         <children>
            <VBox prefHeight="584.0" prefWidth="398.0">
               <children>
                  <GridPane fx:id="gridpane" prefHeight="584.0" prefWidth="5.0" VBox.vgrow="ALWAYS">
                    <columnConstraints>
                      <ColumnConstraints hgrow="SOMETIMES" maxWidth="198.0" minWidth="10.0" prefWidth="183.0" />
                      <ColumnConstraints hgrow="SOMETIMES" maxWidth="140.0" minWidth="10.0" prefWidth="36.0" />
                        <ColumnConstraints hgrow="SOMETIMES" maxWidth="196.0" minWidth="10.0" prefWidth="179.0" />
                    </columnConstraints>
                    <rowConstraints>
                      <RowConstraints maxHeight="190.0" minHeight="0.0" prefHeight="0.0" vgrow="SOMETIMES" />
                      <RowConstraints maxHeight="390.0" minHeight="10.0" prefHeight="390.0" vgrow="SOMETIMES" />
                      <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
                    </rowConstraints>
                     <children>
                        <VBox prefHeight="200.0" prefWidth="100.0" GridPane.columnIndex="1" GridPane.rowIndex="1">
                           <children>
                              <Button fx:id="sendLeftButton" mnemonicParsing="false" onAction="#actButLeft" text="&lt;" />
                              <Button fx:id="sendRightButton" mnemonicParsing="false" onAction="#actButRight" text="&gt;">
                                 <VBox.margin>
                                    <Insets top="20.0" />
                                 </VBox.margin>
                              </Button>
                           </children>
                        </VBox>
                        <Label fx:id="canditates" text="Canditates" />
                        <Label fx:id="selected" text="selected" GridPane.columnIndex="2" />
                        <ListView fx:id="candidatesListView" onEditStart="#kk1" prefHeight="200.0" prefWidth="200.0" GridPane.rowIndex="1" />
                        <ListView fx:id="heroListView" onEditStart="#kk2" prefHeight="200.0" prefWidth="200.0" GridPane.columnIndex="2" GridPane.rowIndex="1" />
                     </children>
                     <VBox.margin>
                        <Insets />
                     </VBox.margin>
                  </GridPane>
               </children>
            </VBox>
          <VBox id="VBox" alignment="CENTER" prefHeight="584.0" prefWidth="256.0" spacing="5.0">
            <children>
                  <ListView fx:id="myliste" onMouseClicked="#OnMouseclicketlist" prefHeight="200.0" prefWidth="200.0" />
                  <TextArea fx:id="lesenText" prefHeight="115.0" prefWidth="500.0" />
                  <TextArea fx:id="schreibenText" prefHeight="124.0" prefWidth="500.0" />
              <Label fx:id="label" alignment="CENTER" prefHeight="15.0" prefWidth="99.0" text="Label" />
              <Button fx:id="lesebut" blendMode="GREEN" cache="true" cacheHint="QUALITY" mnemonicParsing="false" onAction="#LeseBut" text="lesen" textOverrun="WORD_ELLIPSIS" />
              <Button fx:id="speichbut" blendMode="GREEN" cache="true" cacheHint="QUALITY" mnemonicParsing="false" onAction="#SpeichBut" text="speichern" />
                  <Button fx:id="schreibbut" mnemonicParsingich die Befehle="false" onAction="#SchreiBut" text="schreiben" />
            </children>
          </VBox>
         </children>
      </HBox>
  </children>
</AnchorPane>
Um das in mein Fenster einzubauen habe ich die Komponenten mit scenebuilder eingerichtet. Deshalb gehe ich davon aus das ich die Befehle zum einrichten weg lassen kann. und den Rest in die Aktion Events verlageren kann. Aber leider funktionirt das nicht. Weder in der Main als auch im mainWindowController ergibt das etwas Sinnvolles. Ich bekomme die Listview aber keinen Inhalt.
 
Java:
package ccc;
import javafx.application.Application;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.event.ActionEvent;
import javafx.geometry.HPos;
import javafx.geometry.Insets;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.ListView;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.ColumnConstraints;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.Priority;
import javafx.scene.layout.VBox;
import javafx.scene.paint.Color;
import javafx.stage.Stage;
/*from  w w  w. j a  va 2 s .  co m*/
public class Main extends Application {

  @Override
  public void start(Stage primaryStage) //wird in Main ausgeführt nicht verwendet
    BorderPane root = new BorderPane();//stattdessen Anchorpane
    Scene scene = new Scene(root, 400, 250, Color.WHITE);

    GridPane gridpane = new GridPane();//nicht verwendet
    gridpane.setPadding(new Insets(5));//nicht verwendet
    gridpane.setHgap(10);//nicht verwendet
    gridpane.setVgap(10);//nicht verwendet
    ColumnConstraints column1 = new ColumnConstraints(150, 150,//nicht verwendet
        Double.MAX_VALUE);
    ColumnConstraints column2 = new ColumnConstraints(50);//nicht verwendet
    ColumnConstraints column3 = new ColumnConstraints(150, 150,//nicht verwendet
        Double.MAX_VALUE);//nicht verwendet
    column1.setHgrow(Priority.ALWAYS);//nicht verwendet
    column3.setHgrow(Priority.ALWAYS);//nicht verwendet//nicht verwendet
    gridpane.getColumnConstraints().addAll(column1, column2, column3);//nicht verwendet

  
  //candidates das ist  mein Problem ich dachte als Variable einfach zuerst
    final ObservableList<String> candidates = FXCollections
        .observableArrayList("Z", "A", "B", "C", "D");
    final ListView<String> candidatesListView = new ListView<>(candidates);
    gridpane.add(candidatesListView, 0, 1);

    final ObservableList<String> selected = FXCollections.observableArrayList();
    final ListView<String> heroListView = new ListView<>(selected);
    gridpane.add(heroListView, 2, 1);

    Button sendRightButton = new Button(" > ");//nicht verwendet
    sendRightButton.setOnAction((ActionEvent event) -> {//nicht verwendet
      String potential = candidatesListView.getSelectionModel()//eingefügt beim Button"actButRight"
          .getSelectedItem();//eingefügt beim Button"actButRight"
      if (potential != null) {//eingefügt beim Button"actButRight"
        candidatesListView.getSelectionModel().clearSelection();//eingefügt beim Button"actButRight"
        candidates.remove(potential);//eingefügt beim Button"actButRight"
        selected.add(potential);//eingefügt beim Button"actButRight"
      }
    });

    Button sendLeftButton = new Button(" < ");//nicht verwendet
    sendLeftButton.setOnAction((ActionEvent event) -> {//nicht verwendet
      String s = heroListView.getSelectionModel().getSelectedItem();//eingefügt beim Button"actBuLeft"
      if (s != null) {                                              //eingefügt beim Button"actBuLeft"
        heroListView.getSelectionModel().clearSelection();         //eingefügt beim Button"actBuLeft"
        selected.remove(s);                                            //eingefügt beim Button"actBuLeft"
        candidates.add(s);                                            //eingefügt beim Button"actBuLeft"
      }
    });
    VBox vbox = new VBox(5);//nicht verwendet
    vbox.getChildren().addAll(sendRightButton, sendLeftButton);//nicht verwendet

    gridpane.add(vbox, 1, 1);//nicht verwendet
    root.setCenter(gridpane);//nicht verwendet

    GridPane.setVgrow(root, Priority.ALWAYS);//nicht verwendet
    primaryStage.setScene(scene);//wird in Main ausgeführt nicht verwendet
    primaryStage.show();//wird in Main ausgeführt nicht verwendet
  }
  public static void main(String[] args) {//wird in Main ausgeführt nicht verwendet
    launch(args);
  }
}
Das problem sind die Zeilen Canditates
 
Das auslassen desGridpane anweisung ergibt eine leere Liste
Code:
public void AusgangsLiwst() {
             ObservableList<String> candidates = FXCollections
                    .observableArrayList("Z", "A", "B", "C", "D");
                 ListView<String> candidatesListView = new ListView<>(candidates);
                gridpane.add(candidatesListView, 0, 1);

                 ObservableList<String> selected = FXCollections.observableArrayList();
                ListView<String> heroListView = new ListView<>(selected);
                gridpane.add(heroListView, 2, 1);
die Übernahme der Buttonanweisungen ergeben nicht und add bzw remov sind mit error unterstrichen. Versuche mit diesem Teil als Button Aktion Event führt nicht zum Ergebnis
Code:
  ObservableList<String> candidates = FXCollections.observableArrayList();
        ObservableList<String> S1 = FXCollections.observableArrayList();
        ObservableList<String> selected = FXCollections.observableArrayList();

        String potential = candidatesListView.getSelectionModel().getSelectedItem();
            if (potential != null) {
              candidatesListView.getSelectionModel().clearSelection();//eingefügt beim Button"actButRight"
              candidates.remove(potential);//eingefügt beim Button"actButRight"
              selected.add(potential);//eingefügt beim Button"actButRight"
              S1.add(potential);
              ListView<String> candidatesListView = new ListView<>(candidates);
              gridpane.add(candidatesListView, 0, 1);
              ListView<String> potentialListView2 = new ListView<> (S1);
              gridpane.add(heroListView, 1, 2);
              ListView<String> heroListView = new ListView<>(selected);
              gridpane.add(heroListView, 2, 1);
 
Wenn ich dein Problem richtig verstehe, möchtest du den Code, den du ganz oben gepostet hast, umstellen auf FXML?

Allerdings passt der Code nicht wirklich zusammen, also möchtest du vermutlich irgendwas anderes machen?
 
Button on Aktion Event Eintrag!!
Äh?


Es wird kein Fehler angezeigt aber die Liste wird nicht aktualisiert..
Und das bezieht sich auf welchen dieser X Codeschnipsel?

Auf das fertige Tutorial?
Auf deinen Code aus #1, wo die Liste halt auch nicht angefasst wird?
Auf deinen Code aus #3, der keinen Kontext hat?

ja gern dieses in mein Fenster(listing 2-4)einbauen.
Was
 
erst habe ich gedacht es liegt an dem Final aus dem ersten listing. Dann an den ObservableList<String> die ich in verschiedenen Positionen verlagert habe. Dann habe ich gedacht die Listen werden jeweils neu erzeugt mit
Code:
 ListView<String> candidatesListView = new ListView<>(candidates);
              gridpane.add(candidatesListView, 0, 1);
aber es tut sich nichts. Die erste Zeile sollte die Liste ausgeben und obwohl ich das Final ausgelassen habe und keine Modifikation (das müßte eigendlich ohne probleme in der Klasse erkennbar sein) geschrieben aber trotzdem wird die souce nicht erkannt.
 
Es würde vielleicht helfen wenn du einfach noch mal strukturiert versuchst zu erklären, was genau du eigentlich vor hast. Du postest hier (fast willkürlich) irgendwelche Codeschnipsel ohne jeglichen Zusammenhang und schreibst - meiner Meinung nach - wirres Zeug.
Also:
- Was ist die Ausgangssiutation
- Was willst du erreichen
- Was geht nicht
 
wenn die candidatesListView einmal gefüllt ist sollte ohne Modifikation diese Liste in der Klasse und Pakage sichtbar bzw. wiederholbar und editierbar sein. Das ist sie aber wohl nicht. Die liste jeweils unter der Button aktion anweisung einzufügen erzeugt keinen Fehler aber kein tausch!!
 
ohne Modifikation diese Liste in der Klasse und Pakage sichtbar bzw. wiederholbar und editierbar sein.
Auch wenn ich keine Ahnung hab was du mit "wiederholbar" meinst .. ein Hinweis: Die ListView ist eine GUI Komponente und braucht in den seltensten Fällen irgendwo von außen sichtbar sein. Wenn schon gibt es ein Model, die die Inhalt der Liste in einer Collection/ObservableList abbildet.
Die liste jeweils unter der Button aktion anweisung einzufügen erzeugt keinen Fehler aber kein tausch!!
Die Fehlerbeschreibung ist mehr als Mager. Vielleicht lässt du einfach mal deine bisherigen Versuche außer acht und schilderst noch mal was du eigentlich machen willst ..
 
Die Ausgangssituation ist das erste Listing. Es ist ein eigenständiges Programm mit Main. In meinen nächsten Listings die meine andere Main.java mit anhängenden WindowController.Java und dem mainWindow.fxml unter der selben Package auch ein eigenständiges Programm ergeben wird eine andere Scene gezeigt und gesteuert.In dieser Umgebung will ich gerne das erste Listing einbauen. Das f xml Dokument wird mit Scenebuilder für das erste Listing angepasst. mit
public void AusgangsLiwst() { das ich unter einem Extra ButtonAktion Event auslöse ergibt die Liste im der Java Applikation und sollte eigendlich dann innerhalb der Klasse sichtbar sein. Es sollte dann auch editierbar sein.Aber die source wird trotzdem nicht in den anderen FXML anweisungen zu Verfügung angezeigt. Die Teile in der Main unterzubringen löst nicht das Problem. ich probiere schon den dritten Tag . Habe auch verschiedene Tutorials durchgeschaut. Meine Suche auf euren Sêiten enden nach dem zweiten Beitrag bei anderen Themen.
 
Im fünten Listing ist das erste Listing mit meinen Ideen es in mein drittes Listing einzufügen. Der Knackpunkt ist der Teil unter dem Kommentar //Candidates.
 
Die Main aus dem erten Listing mit Befehlen aus der Main des zweiten Listing zu erweitern und dann den MainWindowController:java und MainWin.dow.fxml dokument zu erweitern funktioniert auch nicht.
 
Das Kryptische der listing 2 bis 4 ist; die Main ist das Startfenster; das MainWindowController kontrolliert das fxml Dokument und ist die Auslöser- und Auswertersteuerung. Beim ersten ist das alles vereint ohne fxml Dokument (durch Befehle erzeugt und nicht mit SceneBuilder editierbar. (auch probiert))
 
Also ich kann Dir weiterhin nicht wirklich folgen....

Paar Hinweise, was mir aufgefallen ist:
a) if ist keine Schleife.
b) Du solltest dir klar überlegen, welche Daten Du in einem Fenster speichern / bearbeiten willst um dafür die dann entsprechenden Variablen zu erstellen. In einer Methode (z.B. in einer Methode, die ein Action Event bearbeitet) irgend welche neue Strukturen in lokalen Variablen anzulegen sieht dubios aus. Sprich Code aus #17 in einer Methode ist schon seltsam. Candidates sollte evtl. Eine Instanzvariable sein, die dann nur gesetzt wird oder so.
 
@FXML private ListView heroListView; @FXML private ListView candidatesListView;
Bei einer ListView solltest du immer den generischen Typ mit angeben... In deinem Fall also sicherlich Strings.
ObservableList<String> candidates = FXCollections.observableArrayList();
ist eine Buttonaktion Versuch
Nein du erstellst hier einfach nur eine leere ObservableList. Mit einem Button hat das herzlich wenig zu tun
mit
public void AusgangsLiwst() {
Die Methode sehe ich in keinem deiner "Listings"

Gib dir bitte einfach mal ein bisschen mehr Mühe mit deinen Posts. Dann kann man dich unter Umständen auch verstehen
 
Passende Stellenanzeigen aus deiner Region:

Oben