Hinzufügen einer benutzerdefinierten Komponente zu SceneBuilder 2.0

Ich brauche einen Auswahl-Listener und wähle Methode in einem Bereich aus, um eine Hervorhebung zu überwachen und anzuzeigen, wenn auf einen Knoten geklickt wird.

Ich habe Folgendes getan:

public class PaneWithSelectionListener extends Pane { private ObjectProperty selectedAnnotation = new SimpleObjectProperty(); public PaneWithSelectionListener() { super(); selectedAnnotation.addListener((obs, oldAnno, newAnno) -> { if (oldAnno != null) { oldAnno.setStyle(""); } if (newAnno != null) { newAnno.setStyle("-fx-border-color: blue;-fx-border-insets: 5;-fx-border-width: 1;-fx-border-style: dashed;"); } }); setOnMouseClicked(e->selectAnnotation(null)); } public void selectAnnotation(Annotation ann){ selectedAnnotation.set(ann); } } 

Und das funktioniert gut – aber ich kann nicht mehr mit SceneBuilder arbeiten, da meine FXML diesen PaneWithSelectionListener und nicht Pane referenziert. Ich bin mir nicht sicher, wie ich mein benutzerdefiniertes Fenster in SceneBuilder bringen kann. Ich habe mir andere Fragen angeschaut und sie sind alle eine Kombination aus FXML und Controllern – wo dies nur ein Pane .

Kennt jemand eine Möglichkeit, dies zu tun, oder vielleicht die PaneWithSelectionListener für einen PaneWithSelectionListener bei der Initialisierung PaneWithSelectionListener ?

Vielen Dank

Wenn das Problem nur darin besteht, Ihre benutzerdefinierte class in SceneBuilder verfügbar zu machen, können Sie dies mit den folgenden Schritten tun:

  1. Bündeln Sie Ihre benutzerdefinierte class (und alle unterstützenden classn wie Annotation ) als JAR-Datei
  2. Aktivieren Sie in SceneBuilder die Dropdown-Schaltfläche neben “Bibliothek” oben im linken Bereich: Bildbeschreibung hier eingeben
  3. Wählen Sie “JAR / FXML-Datei importieren …”
  4. Wählen Sie die Jar-Datei, die Sie in Schritt 1 erstellt haben
  5. PaneWithSelectionListener Sie sicher, dass die class, auf die Sie in SceneBuilder ( PaneWithSelectionListener ) zugreifen müssen, PaneWithSelectionListener ist
  6. Drücken Sie “Komponente importieren”
  7. PaneWithSelectionListener wird nun in SceneBuilder unter “Benutzerdefiniert” im linken Bereich angezeigt: Bildbeschreibung hier eingeben

Sie werden feststellen, dass das Dropdown-Menü in SceneBuilder über die Option “Benutzerdefinierter Bibliotheksordner” verfügt, über den Sie den Ordner öffnen können, in dem die JAR-Dateien gespeichert sind. Für eine schnelle Option können Sie einfach JAR-Dateien in diesen Ordner kopieren und (nach einer kurzen Verzögerung) werden die enthaltenen classn in der Liste “Benutzerdefiniert” angezeigt.

Ich habe ein CustomCB ein Kombinationsfeld vom Typ ein userObject erstellt. In meinem Fall habe ich als userObject verwendet. Das ganze Projekt und der TESTER sind hier. Die erste ist CustomCB, die Komponenten und die aus diesem Code generierte JAR-Datei wird der Bibliothek hinzugefügt. Dies kann in SCENE BUILDER geladen werden. Danach steht es für das Szenendesign zur Verfügung.

Dann haben Sie natürlich einen Tester CustomCB2, der auch eine FXML verwenden kann, anstatt wie ich es gemacht habe.

Ich möchte eigentlich, dass die Elemente, die mit dem Text beginnen, den ich in der ComboBox eintippe, in der Liste angezeigt werden. Aber ich weiß nicht, wie ich es machen soll. Weil der ERSTE NAME oder LETZTE NAME der PERSON-class mit ‘Pe’ beginnen kann. Wenn ich eine Lösung finde, werde ich sie hier veröffentlichen.

Dies ist die benutzerdefinierte Komponente.

 package customCB; /* * To change this license header, choose License Headers in Project Properties. * To change this template file, choose Tools | Templates * and open the template in the editor. */ import javafx.beans.property.IntegerProperty; import javafx.beans.property.SimpleIntegerProperty; import javafx.beans.property.SimpleStringProperty; import javafx.beans.property.StringProperty; /** * * @author Hornigold Arthur */ public class APerson { private final StringProperty firstName; private final StringProperty lastName; private final IntegerProperty familyID; private final IntegerProperty personID; public APerson() { this(null, null, 0,0); } /** * Constructor with some initial data. * * @param familyID * @param familyName */ public APerson (String firstName, String lastName, int familyID, int personID) { this.firstName = new SimpleStringProperty(firstName); this.lastName = new SimpleStringProperty(lastName); this.familyID = new SimpleIntegerProperty(familyID); this.personID = new SimpleIntegerProperty(personID); } public int getFamilyID() { return familyID.get(); } public void setFamilyID(int FamilyID) { this.familyID.set(FamilyID); } public IntegerProperty familyIDProperty() { return familyID; } public int getPersonID() { return personID.get(); } public void setPersonID(int PersonID) { this.personID.set(PersonID); } public IntegerProperty personIDProperty() { return personID; } public String getFirstName() { return firstName.get(); } public void setFirstName(String FirstName) { this.firstName.set(FirstName); } public StringProperty firstNameProperty() { return firstName; } public String getLastName() { return lastName.get(); } public void setLastName(String LastName) { this.lastName.set(LastName); } public StringProperty lastNameProperty() { return lastName; } public String toString() { String name = getFirstName() + " " + getLastName()+ " [" + getFamilyID() +"]"; return name; } } 

Dies ist die FXML für die benutzerdefinierte Komponente.

 < ?xml version="1.0" encoding="UTF-8"?> < ?import javafx.scene.control.ComboBox?> < ?import javafx.scene.layout.VBox?>    

Dies ist der Controller für dieses FXML, aber erwähnen Sie es nicht in der FXML-Datei. Es wirft einen Fehler auf.

 package customCB; import java.io.IOException; import java.net.URL; import java.util.ResourceBundle; import org.controlsfx.control.textfield.TextFields; import javafx.event.ActionEvent; import javafx.fxml.FXML; import javafx.fxml.FXMLLoader; import javafx.scene.control.ComboBox; import javafx.scene.control.ListView; import javafx.scene.layout.VBox; public class CustomComboController extends VBox{ @FXML private ResourceBundle resources; @FXML private URL location; @FXML private ComboBox myCustomCombo; @FXML void cbOnAction(ActionEvent event) { } @FXML void initialize() { assert myCustomCombo != null : "fx:id=\"myCustomCombo\" was not injected: check your FXML file 'CustomLvFXML.fxml'."; } public CustomComboController() { FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("customCombo.fxml")); fxmlLoader.setRoot(this); fxmlLoader.setController(this); try { fxmlLoader.load(); } catch (IOException exception) { throw new RuntimeException(exception); } } public void setCBValues(javafx.collections.ObservableList values) { myCustomCombo.setItems(values); myCustomCombo.setEditable(true); TextFields.bindAutoCompletion(myCustomCombo.getEditor(), myCustomCombo.getItems()); } } 

Laden Sie controlsfx-8.40.12.jar von WEB herunter und fügen Sie dies in die Bibliothek BUILD PATH ein.

Erstellen Sie jetzt eine JAR-Datei für dieses Projekt. “BenutzerCB.jar”.

Diese JAR-Datei muss als benutzerdefiniertes Steuerelement im Szenen-Generator enthalten sein. Ich benutze Version 10.0.

Nun, da es Teil des Szenen-Builders ist, können Sie diese Komponente beim Entcasting verwenden, außer Sie können es so machen, wie ich es in meinem TESTCODE gemacht habe. Sie müssen “CustomCB.jar” als Teil der Bibliothek zum Erstellen hinzufügen.

Dies ist der Code für den Tester.

 package customCB2; import javafx.application.Application; import javafx.stage.Stage; import javafx.scene.Scene; import javafx.scene.layout.VBox; public class Main extends Application { static private javafx.collections.ObservableList fathers = javafx.collections.FXCollections.observableArrayList(); static private javafx.collections.ObservableList mothers = javafx.collections.FXCollections.observableArrayList(); @Override public void start(Stage stage) throws Exception { CustomComboController customControl2 = new CustomComboController(); CustomComboController customControl3 = new CustomComboController(); loadFathers(); loadMothers(); customControl2.setCBValues(fathers); customControl3.setCBValues(mothers); VBox root = new VBox(); root.getChildren().addAll(customControl2, customControl3); stage.setScene(new Scene(root)); stage.setTitle("Custom Control Combo box"); stage.setWidth(300); stage.show(); } public static void main(String[] args) { launch(args); } private void loadFathers() { fathers.clear(); fathers.add(new APerson("Hornigold","Arthur",1,63)); fathers.add(new APerson("Andrews","Sundareson",2,60)); fathers.add(new APerson("Christopher","Easweradoss",3,57)); fathers.add(new APerson("Arthur","Kennedy",4,55)); } private void loadMothers() { mothers.clear(); mothers.add(new APerson("Victoria","Arthur",1,95)); mothers.add(new APerson("Eliza", "Daniel",1,60)); mothers.add(new APerson("Nesammal", "Rivington",2,57)); mothers.add(new APerson("Ratnammal","Andews",1,55)); } } 

Es braucht viele Verbesserungen. Wenn jemand improvisieren kann, füge es bitte hier hinzu.