JavaFX table - comment ajouter des composants?
J'ai un swing de projet qui utilise de nombreux JTables pour afficher toutes sortes de choses à partir du texte de panneaux pour un mélange de boutons et cases à cocher. J'ai été en mesure de le faire, par l'écrasement de la table de rendu de cellule pour revenir générique JComponents. Ma question est peut une table semblable à être fait à l'aide de JavaFx?
Je veux mettre à jour tous mes tableaux dans le projet d'utiliser JavaFx à l'appui de gestes pour la plupart. Il semble que TableView est le JavaFx composant à utiliser et j'ai essayé d'ajouter des boutons, mais lors de l'affichage il montre la chaîne de valeur de la touche, pas le bouton lui-même. Il semble que j'ai remplacer la ligne de l'usine ou de la cellule de l'usine pour faire ce que je veux, mais il n'y a pas beaucoup d'exemples. Voici le code que j'ai utilisé comme un exemple qui affiche le bouton comme une chaîne de caractères.
import javax.swing.JButton;
import javafx.application.Application;
import javafx.beans.property.SimpleStringProperty;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.geometry.Insets;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.scene.control.TextField;
import javafx.scene.control.cell.PropertyValueFactory;
import javafx.scene.layout.VBox;
import javafx.scene.text.Font;
import javafx.stage.Stage;
public class GestureEvents extends Application {
private TableView<Person> table = new TableView<Person>();
private final ObservableList<Person> data =
FXCollections.observableArrayList(
new Person("Jacob", "Smith", "[email protected]","The Button"),
new Person("Isabella", "Johnson", "[email protected]","The Button"),
new Person("Ethan", "Williams", "[email protected]","The Button"),
new Person("Emma", "Jones", "[email protected]","The Button"),
new Person("Michael", "Brown", "[email protected]","The Button")
);
public static void main(String[] args) {
launch(args);
}
@Override
public void start(Stage stage) {
Scene scene = new Scene(new Group());
stage.setTitle("Table View Sample");
stage.setWidth(450);
stage.setHeight(500);
final Label label = new Label("Address Book");
label.setFont(new Font("Arial", 20));
table.setEditable(true);
TableColumn firstNameCol = new TableColumn("First Name");
firstNameCol.setMinWidth(100);
firstNameCol.setCellValueFactory(
new PropertyValueFactory<Person, String>("firstName"));
TableColumn lastNameCol = new TableColumn("Last Name");
lastNameCol.setMinWidth(100);
lastNameCol.setCellValueFactory(
new PropertyValueFactory<Person, String>("lastName"));
TableColumn emailCol = new TableColumn("Email");
emailCol.setMinWidth(200);
emailCol.setCellValueFactory(
new PropertyValueFactory<Person, String>("email"));
TableColumn btnCol = new TableColumn("Buttons");
btnCol.setMinWidth(100);
btnCol.setCellValueFactory(
new PropertyValueFactory<Person, String>("btn"));
table.setItems(data);
table.getColumns().addAll(firstNameCol, lastNameCol, emailCol, btnCol);
final VBox vbox = new VBox();
vbox.setSpacing(5);
vbox.setPadding(new Insets(10, 0, 0, 10));
vbox.getChildren().addAll(label, table);
((Group) scene.getRoot()).getChildren().addAll(vbox);
stage.setScene(scene);
stage.show();
}
public static class Person {
private final SimpleStringProperty firstName;
private final SimpleStringProperty lastName;
private final SimpleStringProperty email;
private final JButton btn;
private Person(String fName, String lName, String email, String btn) {
this.firstName = new SimpleStringProperty(fName);
this.lastName = new SimpleStringProperty(lName);
this.email = new SimpleStringProperty(email);
this.btn = new JButton(btn);
}
public String getFirstName() {
return firstName.get();
}
public void setFirstName(String fName) {
firstName.set(fName);
}
public String getLastName() {
return lastName.get();
}
public void setLastName(String fName) {
lastName.set(fName);
}
public String getEmail() {
return email.get();
}
public void setEmail(String fName) {
email.set(fName);
}
public JButton getBtn(){
return btn;
}
public void setBtn(String btn){
}
}
public static class ButtonPerson{
private final JButton btn;
private ButtonPerson(){
btn = new JButton("The Button");
}
public JButton getButton(){
return btn;
}
}
}
Edit: Après avoir étudié plus loin j'ai trouvé des exemples qui remplacent les cellules des graphiques en utilisant les types de cellules, comme du texte et les contrôles. Il n'est pas clair si un médicament générique jfx composant peut être placé dans une cellule comme un JFXPanel. C'est différent de la JTable, car l'utilisation d'un JTable je peux placer quoi que ce soit qui hérite de JComponent aussi longtemps que je le programme d'installation le rendre classe correctement. Si quelqu'un sait comment (ou si c'est encore possible) pour mettre un JFXPanel dans une cellule ou d'un autre générique JFx composant comme un Bouton qui serait très utile.
Vous devez vous connecter pour publier un commentaire.
Des problèmes avec votre mise en Œuvre
Vous pouvez incorporer JavaFX composants dans des applications Swing (en plaçant le JavaFX composant dans un JFXPanel). Mais vous ne pouvez pas incorporer un composant Swing en JavaFX (sauf si vous utilisez JavaFX 8+).
JavaFX a son propre bouton de mise en œuvre de toute façon, il n'y a aucune raison pour incorporer un
javax.swing.JButton
sur un JavaFX scene, même si vous avez été à l'aide de Java8 et cela fonctionne.Mais qui ne va pas résoudre tous vos problèmes. Vous fournissez la valeur d'une cellule d'usine de votre bouton de la colonne pour la fourniture de boutons, mais pas la fourniture d'une cellule personnalisé rendu usine. La table par défaut de la cellule de rendu de l'usine rend le
toString
de sortie sur la valeur de la cellule, qui est pourquoi vous venez de voir la représentation de chaîne de bouton dans votre tableau de mise en œuvre.Vous de mettre des boutons de votre
Person
objet. Ne pas le faire - ils ne devraient pas y figurer. Au lieu de cela, générer dynamiquement un bouton dans la cellule rendu usine. Cela vous permet de profiter d'une table virtuelle de flux de technologie avec laquelle il crée seulement visuelle des nœuds pour ce que vous pouvez voir sur l'écran, et pas pour chaque élément de la table de données de sauvegarde magasin. Par exemple, si il y a 10 lignes visibles à l'écran et 10000 éléments dans le tableau, à seulement 10 boutons seront créés plutôt que de 10000.Comment résoudre le problème
javax.swing.JButton
.Corriger Un Exemple De Code
Ce code intègre les corrections suggérées et quelques améliorations.
Sur l'Utilisation de Composants Swing dans JavaFX
Un JFXPanel est pour intégrer un JavaFX composant Swing pas un composant Swing en JavaFX, par conséquent, il serait absolument aucun sens d'essayer de placer un
JFXPanel
dans un JavaFXTableView
. C'est pourquoi vous ne trouvez pas les exemples de la part de quiconque de tenter une telle chose.Un JavaFX
TableView
est similaire à un SwingJTable
à cet égard. Au lieu d'unJComponent
, un Nœud est le bloc de construction de base pour JavaFX - ils sont semblables, mais différents. Vous pouvez rendre n'importe quelNode
dans un JavaFXTableView
aussi longtemps que vous offre la cellule de l'usine pour elle.Dans Java 8, il y a un
SwingNode
qui peut contenir un SwingJComponent
. UnSwingNode
permet de rendre n'importe quel composant Swing à l'intérieur d'un JavaFX TableView.Le code pour utiliser un
SwingNode
est très simple:Alternative De Mise En Œuvre
Bien que Java 8 devrait vous permettre de vous obtenir exactement ce que vous voulez, si vous préférez utiliser une ancienne version de Java, vous pouvez utiliser la Balançoire en fonction Multitouch pour Java (MT4J) système pour ce lieu de JavaFX.