Comment créer des onglets de façon dynamique dans JavaFX à l'aide de FXML?

Comment voulez-vous créer un nouvel onglet à l'aide de JavaFX/FXML? J'ai créé un tabpane dans mon FXML mais je veux cliquer sur un bouton qui provoque un nouvel onglet à venir.

Voici mon FXML:

<?import javafx.scene.effect.*?>
<?import javafx.scene.text.*?>
<?import javafx.scene.layout.*?>
<?import java.lang.*?>
<?import javafx.scene.control.*?>
<BorderPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="sample.Controller">
<top>
<MenuBar BorderPane.alignment="CENTER">
<menus>
<Menu mnemonicParsing="false" text="File">
<items>
<MenuItem mnemonicParsing="false" text="New..." onAction="#btnNew"/>
<MenuItem mnemonicParsing="false" text="Save..." />
<MenuItem mnemonicParsing="false" text="Save As..." />
<MenuItem mnemonicParsing="false" text="Open..." />
<MenuItem mnemonicParsing="false" text="Close" />
</items>
</Menu>
<Menu mnemonicParsing="false" text="Help">
<items>
<MenuItem mnemonicParsing="false" text="About Blank"  onAction="#btnAbout"/>
</items>
</Menu>
</menus>
</MenuBar>
</top>
<center>
<TabPane prefHeight="200.0" prefWidth="200.0" tabClosingPolicy="UNAVAILABLE" BorderPane.alignment="CENTER" fx:id="tabPane">
<tabs>
<Tab text="Untitled Tab 1">
<content>
<AnchorPane>
<children>
<TextFlow maxHeight="1.7976931348623157E308" maxWidth="1.7976931348623157E308" minHeight="-Infinity" minWidth="-Infinity" />
</children>
</AnchorPane>
</content>
</Tab>
</tabs>
</TabPane>

Voici mon code que j'essaie en ce moment dans mon controller:

package sample;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.*;
import java.net.URL;
import java.util.ResourceBundle;
public class Controller implements Initializable {
@FXML
private Button btnAbout;
@FXML
private Button btnNew;
@FXML
private TabPane tabPane;
//tab array
int intTabs = 0;
Tab[] openTabs;
@FXML
private void btnNew(ActionEvent event){
try{
intTabs++;
openTabs = new Tab[intTabs];
//System.out.println(openTabs.length);
tabAdder(intTabs, openTabs);
}catch(Exception e){
e.printStackTrace();
}
}
private TabPane tabAdder(int tabNum, Tab[] tabs){
//System.out.println(tabNum);
tabPane.getTabs().add(tabs[tabNum]);
return tabPane;
}
@FXML
private void btnAbout(ActionEvent event){
Alert alert = new Alert(Alert.AlertType.INFORMATION);
alert.setTitle("Blank: Information");
alert.setHeaderText(null);
alert.setContentText("This is Blank, a simple and soon to be elegant cross platform text editor.");
alert.showAndWait();
}
public void initialize(URL url, ResourceBundle rb){
//tabPane.getTabs().add
}

}

Je ne suis pas vraiment sûr de ce que le problème est que j'ai été en passant par un tas de ressources et je sais comment ajouter un onglet standard.

Je sais que si je fais un onglet comme ceci:

Tab fapTab = new Tab();

Je peux l'ajouter comme ceci:

tabPane.getTabs().add(fapTab);

Mais je veux créer dynamiquement car je ne sais pas combien d'onglets de mon utilisateur voudrait. Donc, mon approche a été de créer un tableau d'onglets qui s'agrandit à chaque fois qu'un utilisateur clique sur "nouveau" et ensuite une fonction qui ajoute que le nouvel onglet de l'interface graphique. Il ne fonctionne pas bien et j'ai essayé plusieurs approches différentes, l'adaptation des gens du code de mon propre.

Donc ma question c'est est-ce que quelqu'un sait ce que je fais mal?

Voici quelques-unes de ces sources:
javafx ouvrir un nouveau fichier fxml dans un nouvel onglet de façon dynamique
http://javafx-albert-af77.blogspot.com/2012/06/tabs-fxml.html
https://www.youtube.com/watch?v=NhoiSMk3f5U

  • Quel est le problème avec les autres solution que vous avez suggéré, c'est à dire Tab newTab = new Tab(); tabPane.getTabs().add(newTab);? Il suffit d'exécuter ce code dans le gestionnaire d'événements. Vous n'avez pas besoin de garder une liste (ou un tableau) des onglets, vous pouvez toujours obtenir la liste actuelle avec tabPane.getTabs().
  • Parce qu'il crée un seul onglet et seulement ajouter un onglet pour chaque onglet objet que je crée. J'ai besoin d'elle pour être dynamique afin que si mon utilisateur a fou quantités de ram et veut avoir 200 onglets ouverts, ils peuvent le faire sans avoir à me coder en dur dans.
  • Ce qui est de l'INTERFACE utilisateur, l'ajout d'un grand nombre d'onglets? Ils entrent dans le nombre qu'ils veulent ajouter dans un champ de texte et appuyez sur un bouton? Je ne suis pas sûr de comprendre ce que vous essayez d'atteindre.
  • Ainsi, lorsque l'utilisateur clique sur Fichier -> Nouveau... ils vont obtenir un nouvel onglet. Finalement, je vais trouver un moyen d'ajouter une zone de texte ou quelque chose, mais pour le moment je suis juste essayer d'obtenir ce triées, comment créer plusieurs onglets. Un peu comme dans NotePad++, vous pouvez avoir autant d'onglets que vous le souhaitez, vous savez?
  • Donc juste la façon dont vous le dit (comme dans mon premier commentaire). Qui permettra d'ajouter un nouvel onglet à chaque fois que le gestionnaire d'événements est appelé. Pourquoi ne pas travailler?
  • Un autre exemple, c'est comme n'importe quel navigateur web, ils ont tous l'adresse de plusieurs onglets? Que'swhat je veux mettre en œuvre, mais je ne peux pas comprendre comment le faire de façon dynamique donc je n'ai pas de créer 100 onglet objets à la limite de mes utilisateurs à 100 onglets.
  • Où est la limite en venir? Pourquoi êtes-vous de la création de la matrice à tous? Il suffit d'ajouter un nouvel onglet dans le gestionnaire d'événement: c'est tout là est à lui.
  • Cela ne fonctionne pas car il m'oblige à coder en dur chaque onglet objet. Donc, je dois faire de l'Onglet tab1 = new Tab(), Tab tab2 = new Tab(), Onglet tab3 = nouvel Onglet(), etc etc.

InformationsquelleAutor user3505901 | 2015-04-06