2014-09-01 17 views
5

Stavo lavorando su un palco quando ho notato che praticamente avevo esattamente la stessa cosa tre volte. Invece di quello (dal momento che lo odio), ho deciso di prendere quelle che ho avuto quelle 3 volte e trasformarlo in un componente personalizzato.È possibile importare un JAR contenente un controllo JavaFX personalizzato in Scene Builder?

Ora so che posso aggiungerlo nel codice ma non posso prevedere il comportamento del layout (due di questi verranno inseriti direttamente nelle schede e il terzo verrà inserito in un riquadro della griglia).

Ho provato a importare il file .jar che conteneva il controllo in Scene Builder. Apparve una finestra di dialogo che mi chiedeva cosa volesse importare nel JAR ma era completamente vuoto.

Ho visto prima che alcuni individui hanno aggiunto "controlli personalizzati" (un termine che uso liberamente) solo per scoprire che fondamentalmente scarica semplicemente un gruppo di componenti per formare il controllo. Potrebbe funzionare per alcune persone ma non lo sto cercando. Per chiarire

Quello che voglio (erano ho esaminare il codice FXML):

<DGCSDefiner //other layout related XML code/> 

quello che non vogliamo:

<GridPane //bla bla XML layout code> 
    <columnConstraints> 
     //bla bla column constraint stuff 
    </columnConstraints> 
    //etc, etc 
</GridPane> 

è possibile? Sto uscendo di nuovo da C# e VS2010 e sono un po 'viziato quando si tratta di controlli personalizzati, quindi se è possibile realizzare qualcosa del genere, qualcuno può dirmi come?

È possibile importare un file JAR compilato contenente un controllo JavaFX personalizzato in Scene Builder, in modo tale che la sua rimozione dalla libreria comporti ciò che ho descritto lì?

MODIFICA 1 Ok, questo è quello che ho nel mio file FXML. Secondo mlody991, ho bisogno di 3 file per fare questo lavoro: Il file FXML (Costruito con SceneBuilder):

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

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

<fx:root alignment="CENTER" hgap="5.0" styleClass="root" stylesheets="@DGCSDefiner.css" type="GridPane" vgap="5.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="DGCSDefiner.DGCSDefinerController"> 
    <children> 
     <ComboBox fx:id="cbxColorStyle" maxHeight="1.7976931348623157E308" maxWidth="1.7976931348623157E308" prefWidth="150.0" promptText="Select Background Color Style" /> 
     <ColorPicker fx:id="cpSolidColor" maxHeight="1.7976931348623157E308" maxWidth="1.7976931348623157E308" prefHeight="32.0" prefWidth="283.0" visible="false" GridPane.rowIndex="1" /> 
     <StackPane fx:id="spSettings" styleClass="Group" GridPane.rowIndex="2" GridPane.vgrow="NEVER"> 
     <children> 
      <GridPane fx:id="gpLinearSettings" hgap="5.0" styleClass="Group" vgap="20.0" visible="false"> 
       <children> 
        <Label text="Angle" GridPane.halignment="RIGHT" GridPane.valignment="CENTER"> 
        <font> 
         <Font name="Arial" size="12.0" /> 
        </font> 
        </Label> 
        <ComboBox fx:id="cbxLinearAngle" maxHeight="1.7976931348623157E308" maxWidth="1.7976931348623157E308" prefWidth="150.0" GridPane.columnIndex="1" GridPane.halignment="CENTER" GridPane.valignment="CENTER" /> 
        <Label text="1st Color" GridPane.halignment="RIGHT" GridPane.rowIndex="1" /> 
        <ColorPicker fx:id="cpFirstLinearColor" maxHeight="1.7976931348623157E308" maxWidth="1.7976931348623157E308" GridPane.columnIndex="1" GridPane.halignment="CENTER" GridPane.rowIndex="1" GridPane.valignment="CENTER" /> 
        <Label text="2nd Color" GridPane.halignment="RIGHT" GridPane.rowIndex="2" /> 
        <ColorPicker fx:id="cpSecondLinearColor" maxHeight="1.7976931348623157E308" maxWidth="1.7976931348623157E308" GridPane.columnIndex="1" GridPane.halignment="CENTER" GridPane.hgrow="ALWAYS" GridPane.rowIndex="2" GridPane.valignment="CENTER" GridPane.vgrow="ALWAYS" /> 
       </children> 
       <columnConstraints> 
        <ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" /> 
        <ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" /> 
       </columnConstraints> 
       <rowConstraints> 
        <RowConstraints minHeight="10.0" vgrow="NEVER" /> 
        <RowConstraints minHeight="10.0" vgrow="NEVER" /> 
        <RowConstraints minHeight="10.0" vgrow="NEVER" /> 
       </rowConstraints> 
      </GridPane> 
      <TabPane fx:id="tabRadialSettings" styleClass="Group" tabClosingPolicy="UNAVAILABLE" visible="false"> 
       <tabs> 
        <Tab closable="false" text="Colors"> 
        <content> 
         <GridPane hgap="5.0" styleClass="Group" vgap="5.0"> 
          <children> 
           <Label maxHeight="1.7976931348623157E308" text="1st Color" GridPane.vgrow="NEVER" /> 
           <ColorPicker fx:id="cpFirstRadialColor" maxHeight="1.7976931348623157E308" maxWidth="1.7976931348623157E308" GridPane.columnIndex="1" GridPane.vgrow="NEVER" /> 
           <Label maxHeight="1.7976931348623157E308" text="2nd Color" GridPane.rowIndex="1" GridPane.vgrow="NEVER" /> 
           <ColorPicker fx:id="cpSecondRadialColor" maxHeight="1.7976931348623157E308" maxWidth="1.7976931348623157E308" GridPane.columnIndex="1" GridPane.rowIndex="1" GridPane.vgrow="NEVER" /> 
          </children> 
          <columnConstraints> 
           <ColumnConstraints hgrow="NEVER" minWidth="10.0" /> 
           <ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" /> 
          </columnConstraints> 
          <rowConstraints> 
           <RowConstraints minHeight="10.0" vgrow="SOMETIMES" /> 
           <RowConstraints minHeight="10.0" vgrow="SOMETIMES" /> 
          </rowConstraints> 
         </GridPane> 
        </content> 
        </Tab> 
        <Tab closable="false" text="Size and Position"> 
        <content> 
         <GridPane hgap="5.0" styleClass="Group" vgap="5.0"> 
          <children> 
           <Label text="H Position" /> 
           <Label text="V Position" GridPane.rowIndex="1" /> 
           <Label text="Radius" GridPane.rowIndex="2" /> 
           <Slider fx:id="sliderHPos" maxHeight="1.7976931348623157E308" maxWidth="1.7976931348623157E308" min="1.0" showTickMarks="true" GridPane.columnIndex="1" /> 
           <Slider fx:id="sliderVPos" maxHeight="1.7976931348623157E308" maxWidth="1.7976931348623157E308" min="1.0" showTickMarks="true" value="1.0" GridPane.columnIndex="1" GridPane.rowIndex="1" /> 
           <Slider fx:id="sliderRadius" maxHeight="1.7976931348623157E308" maxWidth="1.7976931348623157E308" min="1.0" showTickMarks="true" value="1.0" GridPane.columnIndex="1" GridPane.rowIndex="2" /> 
          </children> 
          <columnConstraints> 
           <ColumnConstraints hgrow="NEVER" minWidth="10.0" /> 
           <ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" /> 
          </columnConstraints> 
          <rowConstraints> 
           <RowConstraints minHeight="10.0" vgrow="SOMETIMES" /> 
           <RowConstraints minHeight="10.0" vgrow="SOMETIMES" /> 
           <RowConstraints minHeight="10.0" vgrow="SOMETIMES" /> 
          </rowConstraints> 
         </GridPane> 
        </content> 
        </Tab> 
       </tabs> 
      </TabPane> 
     </children> 
     </StackPane> 
    </children> 
    <columnConstraints> 
     <ColumnConstraints halignment="CENTER" hgrow="SOMETIMES" minWidth="10.0" /> 
    </columnConstraints> 
    <rowConstraints> 
     <RowConstraints minHeight="10.0" vgrow="SOMETIMES" /> 
     <RowConstraints minHeight="10.0" vgrow="SOMETIMES" /> 
     <RowConstraints minHeight="10.0" vgrow="ALWAYS" /> 
    </rowConstraints> 
</fx:root> 

il file della classe Java (che rappresenterà l'oggetto reale in codice):

package DGCSDefiner; 

import java.io.IOException; 
import static java.util.Arrays.asList; 
import javafx.fxml.FXML; 
import javafx.fxml.FXMLLoader; 
import javafx.scene.control.ColorPicker; 
import javafx.scene.control.ComboBox; 
import javafx.scene.control.Slider; 
import javafx.scene.control.TabPane; 
import javafx.scene.layout.GridPane; 
import javafx.scene.layout.Pane; 
import javafx.scene.layout.StackPane; 

public class DGCSDefiner extends Pane { //DigiGames Color Settings Definer. 
    // Values injected by FXMLLoader 
    //<editor-fold defaultstate="collapsed" desc="FXML Variables"> 
    //<editor-fold defaultstate="collapsed" desc="Containers"> 
    @FXML private GridPane gpLinearSettings; // fx:id="gpLinearSettings" 
    @FXML private StackPane spSettings;   // fx:id="spSettings" 
    @FXML private TabPane tabsRadialSettings; // fx:id="tabRadialSettings" 
    //</editor-fold> 
     //<editor-fold defaultstate="collapsed" desc="Color Pickers"> 
    @FXML private ColorPicker cpSolidColor,   // fx:id="cpSolidColor" 
           cpFirstLinearColor, // fx:id="cpFirstLinearColor" 
           cpSecondLinearColor, // fx:id="cpSecondLinearColor" 
           cpFirstRadialColor, // fx:id="cpFirstRadialColor" 
           cpSecondRadialColor; // fx:id="cpSecondRadialColor" 
    //</editor-fold> 
    //<editor-fold defaultstate="collapsed" desc="Combo Boxes"> 
    @FXML private ComboBox<ColorStyles>  cbxColorStyle; // fx:id="cbxColorStyle" 
    @FXML private ComboBox<Integer>  cbxLinearAngle; // fx:id="cbxLinearAngle" 
    //</editor-fold> 
    //<editor-fold defaultstate="collapsed" desc="Sliders"> 
    @FXMLprivate Slider  sliderRadius, // fx:id="sliderRadius" 
          sliderHPos,  // fx:id="sliderHPos" 
          sliderVPos;  // fx:id="sliderVPos" 
    //</editor-fold> 
    //</editor-fold> 
    private FXMLLoader Loader; 

    @FXML // This method is called by the FXMLLoader when initialization is complete 
    void initialize() { 
     //<editor-fold defaultstate="collapsed" desc="Assertions"> 
     //<editor-fold defaultstate="collapsed" desc="Container Assertions"> 
     assert this.gpLinearSettings != null : "fx:id=\"gpLinearSettings\" was not injected: check your FXML file 'JFXMLColorStyleDefiner.fxml'."; 
     assert this.spSettings  != null : "fx:id=\"spSettings\" was not injected: check your FXML file 'JFXMLColorStyleDefiner.fxml'."; 
     assert this.tabsRadialSettings != null : "fx:id=\"tabsRadialSettings\" was not injected: check your FXML file 'JFXMLColorStyleDefiner.fxml'."; 
     //</editor-fold> 
     //<editor-fold defaultstate="collapsed" desc="ColorPicker Assertions"> 
     assert this.cpSolidColor != null : "fx:id=\"cpSolidColor\" was not injected: check your FXML file 'JFXMLColorStyleDefiner.fxml'."; 
     assert this.cpFirstLinearColor != null : "fx:id=\"cpFirstLinearColor\" was not injected: check your FXML file 'JFXMLColorStyleDefiner.fxml'."; 
     assert this.cpSecondLinearColor != null : "fx:id=\"cpSecondLinearColor\" was not injected: check your FXML file 'JFXMLColorStyleDefiner.fxml'."; 
     assert this.cpFirstRadialColor != null : "fx:id=\"cpFirstRadialColor\" was not injected: check your FXML file 'JFXMLColorStyleDefiner.fxml'."; 
     assert this.cpSecondRadialColor != null : "fx:id=\"cpSecondRadialColor\" was not injected: check your FXML file 'JFXMLColorStyleDefiner.fxml'."; 
     //</editor-fold> 
     //<editor-fold defaultstate="collapsed" desc="ComboBox Assertions"> 
     assert this.cbxColorStyle != null : "fx:id=\"cbxColorStyle\" was not injected: check your FXML file 'JFXMLColorStyleDefiner.fxml'."; 
     assert this.cbxLinearAngle != null : "fx:id=\"cbxLinearAngle\" was not injected: check your FXML file 'JFXMLColorStyleDefiner.fxml'."; 
     //</editor-fold> 
     //<editor-fold defaultstate="collapsed" desc="Slider Assertions"> 
     assert this.sliderRadius != null : "fx:id=\"sliderRadius\" was not injected: check your FXML file 'JFXMLColorStyleDefiner.fxml'."; 
     assert this.sliderHPos  != null : "fx:id=\"sliderHPos\" was not injected: check your FXML file 'JFXMLColorStyleDefiner.fxml'."; 
     assert this.sliderVPos  != null : "fx:id=\"sliderVPos\" was not injected: check your FXML file 'JFXMLColorStyleDefiner.fxml'."; 
     //</editor-fold> 
     //</editor-fold> 
     //<editor-fold defaultstate="collapsed" desc="Initializations"> 
     //<editor-fold defaultstate="collapsed" desc="ComboBox Initializations"> 
     this.cbxColorStyle.getItems().addAll(
      asList(ColorStyles.values()) 
     ); 
     for (int x = 0; x < 8; x++) 
      this.cbxLinearAngle.getItems().add(x * 45); 
     this.cbxColorStyle.setOnAction(event -> { 
      ColorStyles CS = this.cbxColorStyle.getValue(); 
      this.cpSolidColor.setVisible(CS == ColorStyles.SOLID); 
      this.gpLinearSettings.setVisible(CS == ColorStyles.LINEAR); 
      this.tabsRadialSettings.setVisible(CS == ColorStyles.RADIAL); 
     }); 
     //</editor-fold> 
     this.Loader = new FXMLLoader(
      this.getClass().getResource("DGCSDefiner.fxml") 
     ); 
     this.Loader.setRoot(this); 
     this.Loader.setController(this); 
     //</editor-fold> 
    } 

    public DGCSDefiner(){ 
     try{ this.Loader.load(); } 
     catch(IOException e){ throw new RuntimeException(e); } 
    } 

    /** 
    * Get the ColorSettings defined by the control. 
    * @return Defined Color Settings. 
    */ 
    public ColorSettings getColorSettings(){ 
     if (this.cbxColorStyle.getSelectionModel().getSelectedIndex() < 0) 
      return null; 
     switch(this.cbxColorStyle.getValue()){ 
      case SOLID: 
       return new ColorSettings(this.cpSolidColor.getValue()); 
      case LINEAR: 
       return new ColorSettings(
        this.cpFirstLinearColor.getValue(), 
        this.cpSecondLinearColor.getValue(), 
        this.cbxLinearAngle.getValue() 
       ); 
      case RADIAL: 
       return new ColorSettings(
        this.cpFirstRadialColor.getValue(), 
        this.cpSecondRadialColor.getValue(), 
        (int)this.sliderRadius.getValue(), 
        (int)this.sliderHPos.getValue(), 
        (int)this.sliderVPos.getValue() 
       ); 
     } 
     return null; //This should never happen. 
    } 
    /** 
    * Load defined color settings. 
    * @param cs Predefined color settings. 
    */ 
    public void setColorSettings(ColorSettings cs){ 
     this.cbxColorStyle.setValue(cs.Style); 
     switch(cs.Style){ 
      case SOLID: 
       this.cpSolidColor.setValue(cs.clrPrimary); 
       break; 
      case LINEAR: 
       this.cbxLinearAngle.setValue(cs.intAngle); 
       this.cpFirstLinearColor.setValue(cs.clrPrimary); 
       this.cpSecondLinearColor.setValue(cs.clrSecondary); 
       break; 
      case RADIAL: 
       this.sliderRadius.setValue(cs.intSize); 
       this.sliderHPos.setValue(cs.intHPos); 
       this.sliderVPos.setValue(cs.intVPos); 
       this.cpFirstRadialColor.setValue(cs.clrPrimary); 
       this.cpSecondRadialColor.setValue(cs.clrSecondary); 
     } 
    } 
} 

E poi questo ultimo file, il cui scopo mi sfugge:

/* 
* 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. 
*/ 

package DGCSDefiner; 

import java.net.URL; 
import java.util.ResourceBundle; 
import javafx.fxml.Initializable; 

/** 
* 
* @author Will 
*/ 
public class DGCSDefinerController implements Initializable { 
    @Override 
    public void initialize(URL location, ResourceBundle resources) { 

    } 
} 

E 'possibile che qualcuno mi spieghi lo scopo di questo ultimo file? Qual è la sua funzione? Riesco a vedere dal codice di esempio con cui sono stato fornito che è stato impostato come controller FXML ma che non mi dice ancora nulla. Non ho mai nemmeno impostato un controller FXML, dato che di solito lo faccio in codice, quindi è esplicitamente lo scopo di rendere questo controllo importabile in Scene Builder?

MODIFICA 2 OK. Ho avuto un'intuizione e si è rivelata corretta ma non ha aiutato. Ho rimosso il riferimento al foglio di stile CSS di controllo e mi ha permesso di aggiungere il controllo, nessun problema.

Tuttavia quando ho lasciato cadere in questo era quello che è successo nel file FXML:

E 'andato da questa (quota di competenza mostrata solo):

<Tab fx:id="tabBGStyle" closable="false" text="Background" /> 

a questo:

<Tab fx:id="tabBGStyle" closable="false" text="Background"> 
    <content> 
     <GridPane alignment="CENTER" hgap="5.0" styleClass="root" vgap="5.0"> 
      <children> 
       <ComboBox fx:id="cbxColorStyle" maxHeight="1.7976931348623157E308" maxWidth="1.7976931348623157E308" prefWidth="150.0" promptText="Select Background Color Style" /> 
       <ColorPicker fx:id="cpSolidColor" maxHeight="1.7976931348623157E308" maxWidth="1.7976931348623157E308" prefHeight="32.0" prefWidth="283.0" visible="false" GridPane.rowIndex="1" /> 
       <StackPane fx:id="spSettings" styleClass="Group" GridPane.rowIndex="2" GridPane.vgrow="NEVER"> 
        <children> 
         <GridPane fx:id="gpLinearSettings" hgap="5.0" styleClass="Group" vgap="20.0" visible="false"> 
          <children> 
           <Label text="Angle" GridPane.halignment="RIGHT" GridPane.valignment="CENTER"> 
            <font> 
             <Font name="Arial" size="12.0" /> 
            </font> 
           </Label> 
           <ComboBox fx:id="cbxLinearAngle" maxHeight="1.7976931348623157E308" maxWidth="1.7976931348623157E308" prefWidth="150.0" GridPane.columnIndex="1" GridPane.halignment="CENTER" GridPane.valignment="CENTER" /> 
           <Label text="1st Color" GridPane.halignment="RIGHT" GridPane.rowIndex="1" /> 
           <ColorPicker fx:id="cpFirstLinearColor" maxHeight="1.7976931348623157E308" maxWidth="1.7976931348623157E308" GridPane.columnIndex="1" GridPane.halignment="CENTER" GridPane.rowIndex="1" GridPane.valignment="CENTER" /> 
           <Label text="2nd Color" GridPane.halignment="RIGHT" GridPane.rowIndex="2" /> 
           <ColorPicker fx:id="cpSecondLinearColor" maxHeight="1.7976931348623157E308" maxWidth="1.7976931348623157E308" GridPane.columnIndex="1" GridPane.halignment="CENTER" GridPane.hgrow="ALWAYS" GridPane.rowIndex="2" GridPane.valignment="CENTER" GridPane.vgrow="ALWAYS" /> 
          </children> 
          <columnConstraints> 
           <ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" /> 
           <ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" /> 
          </columnConstraints> 
          <rowConstraints> 
           <RowConstraints minHeight="10.0" vgrow="NEVER" /> 
           <RowConstraints minHeight="10.0" vgrow="NEVER" /> 
           <RowConstraints minHeight="10.0" vgrow="NEVER" /> 
          </rowConstraints> 
         </GridPane> 
         <TabPane fx:id="tabRadialSettings" styleClass="Group" tabClosingPolicy="UNAVAILABLE" visible="false"> 
          <tabs> 
           <Tab closable="false" text="Colors"> 
            <content> 
             <GridPane hgap="5.0" styleClass="Group" vgap="5.0"> 
              <children> 
               <Label maxHeight="1.7976931348623157E308" text="1st Color" GridPane.vgrow="NEVER" /> 
               <ColorPicker fx:id="cpFirstRadialColor" maxHeight="1.7976931348623157E308" maxWidth="1.7976931348623157E308" GridPane.columnIndex="1" GridPane.vgrow="NEVER" /> 
               <Label maxHeight="1.7976931348623157E308" text="2nd Color" GridPane.rowIndex="1" GridPane.vgrow="NEVER" /> 
               <ColorPicker fx:id="cpSecondRadialColor" maxHeight="1.7976931348623157E308" maxWidth="1.7976931348623157E308" GridPane.columnIndex="1" GridPane.rowIndex="1" GridPane.vgrow="NEVER" /> 
              </children> 
              <columnConstraints> 
               <ColumnConstraints hgrow="NEVER" minWidth="10.0" /> 
               <ColumnConstraints hgrow="SOMETIMES" minWidth="10.0"/> 
              </columnConstraints> 
              <rowConstraints> 
               <RowConstraints minHeight="10.0" vgrow="SOMETIMES" /> 
               <RowConstraints minHeight="10.0" vgrow="SOMETIMES" /> 
              </rowConstraints> 
             </GridPane> 
            </content> 
           </Tab> 
           <Tab closable="false" text="Size and Position"> 
            <content> 
             <GridPane hgap="5.0" styleClass="Group" vgap="5.0"> 
              <children> 
               <Label text="H Position" /> 
               <Label text="V Position" GridPane.rowIndex="1" /> 
               <Label text="Radius" GridPane.rowIndex="2" /> 
               <Slider fx:id="sliderHPos" maxHeight="1.7976931348623157E308" maxWidth="1.7976931348623157E308" min="1.0" showTickMarks="true" GridPane.columnIndex="1" /> 
               <Slider fx:id="sliderVPos" maxHeight="1.7976931348623157E308" maxWidth="1.7976931348623157E308" min="1.0" showTickMarks="true" value="1.0" GridPane.columnIndex="1" GridPane.rowIndex="1" /> 
               <Slider fx:id="sliderRadius" maxHeight="1.7976931348623157E308" maxWidth="1.7976931348623157E308" min="1.0" showTickMarks="true" value="1.0" GridPane.columnIndex="1" GridPane.rowIndex="2" /> 
              </children> 
              <columnConstraints> 
               <ColumnConstraints hgrow="NEVER" minWidth="10.0" /> 
               <ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" /> 
              </columnConstraints> 
              <rowConstraints> 
               <RowConstraints minHeight="10.0" vgrow="SOMETIMES" /> 
               <RowConstraints minHeight="10.0" vgrow="SOMETIMES" /> 
               <RowConstraints minHeight="10.0" vgrow="SOMETIMES" /> 
              </rowConstraints> 
             </GridPane> 
            </content> 
           </Tab> 
          </tabs> 
         </TabPane> 
        </children> 
       </StackPane> 
      </children> 
      <columnConstraints> 
       <ColumnConstraints halignment="CENTER" hgrow="SOMETIMES" minWidth="10.0" /> 
      </columnConstraints> 
      <rowConstraints> 
       <RowConstraints minHeight="10.0" vgrow="SOMETIMES" /> 
       <RowConstraints minHeight="10.0" vgrow="SOMETIMES" /> 
       <RowConstraints minHeight="10.0" vgrow="ALWAYS" /> 
      </rowConstraints> 
     </GridPane> 
    </content> 
</Tab> 

che è esattamente ciò che io NON VOGLIO.

Quello che mi piacerebbe vedere è qualcosa per l'effetto di questo:

<Tab fx:id="tabBGStyle" closable="false" text="Background"> 
    <content> 
     <DGCSDefiner/> 
    </content> 
</Tab> 

nel codice FXML dopo che ho trascinare e rilasciare il controllo personalizzato nel design. È possibile? Devo compilarlo in un barattolo?

Edit 3 per renderlo un po 'più chiaro, this è esattamente quello che voglio vedere accadere. Questo sembra buono, ma il problema è che non ci sono informazioni su come importare un controllo personalizzato in Scene Builder in modo tale che quando lo trascino sull'area di disegno, ottengo solo da qualche parte nelle vicinanze di una singola riga di codice, contro il libro e mezzo è la scrittura (che è semplicemente sciocco. Se volessi potrei (e lo farei) farlo da solo).

risposta

5

Non è necessario il file .jar per farlo. Puoi semplicemente creare un nuovo file FXML con quello che ti serve ex. casella combinata. Crea un file di classe con l'estensione di casella combinata, controller e aggiungi controller nel file FXML (nel generatore di scene).

Trova "Importa dal file JAR/FXML" nella casella combinata vicino alla casella di ricerca a sinistra nel generatore di scenari e quindi seleziona il file. Ora hai un nuovo riquadro del titolo nella fisarmonica sinistra con il nome Personalizzato. Lì puoi trovare i tuoi componenti.

@edit Ci sono file.

MyGridPane.fxml

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

<?import java.lang.*?> 
<?import javafx.scene.layout.*?> 

<fx:root type="javafx.scene.layout.GridPane" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="600.0" xmlns:fx="http://javafx.com/fxml/1" xmlns="http://javafx.com/javafx/8" fx:controller="MyGridPane.MyGridPaneController"> 
    <columnConstraints> 
    <ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" /> 
    <ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" /> 
    </columnConstraints> 
    <rowConstraints> 
    <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" /> 
    <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" /> 
    <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" /> 
    </rowConstraints> 
</fx:root> 

MyGridPane.java

package MyGridPane; 

import javafx.fxml.FXMLLoader; 
import java.io.IOException; 

/** 
* Created by Marcin on 2014-09-01. 
*/ 
public class MyGridPane { 
    MyGridPane(){ 
     FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("MyGridPane.fxml")); 
     fxmlLoader.setRoot(this); fxmlLoader.setController(this); 
     try { 
      fxmlLoader.load(); 
     } catch (IOException exception) { 
      throw new RuntimeException(exception); 
     } 
    } 
} 

MyGridPaneController.java

package MyGridPane; 

import javafx.fxml.Initializable; 

import java.net.URL; 
import java.util.ResourceBundle; 

/** 
* Created by Marcin on 2014-09-01. 
*/ 
public class MyGridPaneController implements Initializable{ 
    @Override 
    public void initialize(URL location, ResourceBundle resources) { 

    } 
} 

passo successivo è aggiungere alla scena Builder

enter image description here

ed è possibile aggiungere questo componente.

enter image description here

+0

Provato. Ho ricevuto un messaggio che diceva "Gli oggetti non possono essere aggiunti alla Libreria perché non sono autosufficienti". – Will

+0

prova codice aggiunto;) –

+0

Tranne che il controllo è eccessivamente semplificato rispetto a quello con cui sto lavorando. Non so che funzionerebbe. Il mio controllo è effettivamente un insieme di componenti organizzati insieme che voglio essere in grado di riutilizzare ancora e ancora, e quello che vedo è solo un riquadro della griglia. Mettere i controlli in GridPane lo rende impossibile, o fallirebbe del tutto? – Will

Problemi correlati