JavaFX @FXML Annotation mit Klassen und Instanzen verbinden?

DefconDev

Bekanntes Mitglied
Java:
public class ViewList {
	
	
	CheckBoxTreeItem rootItem = new CheckBoxTreeItem("A");
	@FXML TreeView treeview = new TreeView(rootItem);
	
	@FXML
	public void ViewListFill(){
		
		rootItem.setExpanded(true);
		System.out.println("hhhhhh");
		treeview.setCellFactory(CheckBoxTreeCell.forTreeView());
		
		CheckBoxTreeItem checkBoxTreeItem = new CheckBoxTreeItem("Völkerwanderunghhhhhhhhhhhhhhhhhhhhh");
	        rootItem.getChildren().add(checkBoxTreeItem);

	       checkBoxTreeItem = new CheckBoxTreeItem("b");
	       rootItem.getChildren().add(checkBoxTreeItem);
	    
	      treeview.setRoot(rootItem);
		
	}

}

Java:
@Override 
	public void start(Stage stage) throws Exception {
	Pane root = (Pane) FXMLLoader.load(getClass().getResource("mm.fxml"));
	ViewList view = new ViewList();
	view.viewListFill();
	Scene scene = new Scene(root);
	stage.setScene(scene);
	stage.show();
	
	
	
	}

Den TreeView habe ich im SceneBuilder eingefügt. Wenn ich die Methode viewListFill aufrufe, zeigt er mir zwar den Syso-print an aber die TreeItems und deren Strings werden nicht in der TreeView eingefügt. Es wirkt so als würden zwei verschiedene Instanzen dieser Klassen erzeugt, einmal aus dem FXML und einmal so im code.

Ein versuch über doe Controller Klasse per Event(Button click) das zu bewerkstelligen funktioinierte einwandfrei.
 
Zuletzt bearbeitet von einem Moderator:
Du brauchst sowas als Controller:
Java:
import javafx.fxml.FXML;
import javafx.scene.control.CheckBoxTreeItem;
import javafx.scene.control.TreeView;
import javafx.scene.control.cell.CheckBoxTreeCell;

public class FXMLDocumentController {

  @FXML
  private TreeView<String> treeview;
  private CheckBoxTreeItem<String> rootItem;

  public void viewListFill() {
    rootItem.setExpanded(true);
    System.out.print("hhhhhh");
    treeview.setCellFactory(CheckBoxTreeCell.forTreeView());

    CheckBoxTreeItem<String> checkBoxTreeItem = new CheckBoxTreeItem("Völkerwanderung");
    rootItem.getChildren().add(checkBoxTreeItem);

    checkBoxTreeItem = new CheckBoxTreeItem<>("b");
    rootItem.getChildren().add(checkBoxTreeItem);
  }

  @FXML
  public void initialize() {
    rootItem = new CheckBoxTreeItem<>("A");
    treeview.setRoot(rootItem);
  }
}

und in deiner Applikation:

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

public class JavaForumTest extends Application {

  @Override
  public void start(Stage stage) throws Exception {
    FXMLLoader loader = new FXMLLoader(getClass().getResource("FXMLDocument.fxml"));
    Parent root = loader.load();
    FXMLDocumentController controller = loader.getController();
    controller.viewListFill();

    Scene scene = new Scene(root);

    stage.setScene(scene);
    stage.show();
  }

  public static void main(String[] args) {
    launch(args);
  }
}
 
Hi, danke dir für deine Antwort.

Das erste was ich mich jetzt aber Frage, die Methode public void initialize() hat eine FXML Annotation, also muss ich diese Methode speziell im Scene Builder deklarieren. Wo da? Also welche Componente? Die TreeView? Und wenn ja, wo genau?
 
Nein musst du nicht. Das interface Initializable ist überholt und wird mit Reflection aufgerufen, wie in der Doku zu lesen ist. Jetzt macht man das mit einer void-Methode ohne Parameter mit dem namen initialize().
 
Noch eine Frage, warum hast du dann die @FXML Annotation bei der Methode-initialize da gelassen?

Wenn ich die entfernen, funktioniert trotzdem alles.


Seit wann ist das interface überholt? Bzw. warum wurde das geändert? Ich sehe noch die Zusammenhänge nicht.

Sorry, wenn die Frage etwas dumm erscheint.
 
Les doch bitte die Doku die ich oben genannt hab. Es muss eine annotierte initialize-Methode sein.

Code:
Controller initialization interface.
NOTE This interface has been superseded by automatic injection of location and resources properties into the controller. FXMLLoader will now automatically call any suitably annotated no-arg initialize() method defined by the controller. It is recommended that the injection approach be used whenever possible.

Seit 2.2 wenn ich das richtig gesehen hab.

Es wurde nach dem IoC Prinzip modeliert.
 
Zuletzt bearbeitet:

Neue Themen


Zurück
Oben