JavaFX Tisch -, wie Sie Komponenten hinzufügen?
Habe ich ein swing-Projekt mit vielen JTables, um alle möglichen Dinge aus dem text, um Platten zu einem mix aus Schaltflächen und Kontrollkästchen. Ich war in der Lage, dies zu tun durch überschreiben der Zelle renderer zurückgeben generic JComponents. Meine Frage ist, kann eine ähnliche Tabelle gemacht mit JavaFx?
Will ich update alle meine Tabellen in das Projekt zu verwenden, JavaFx unterstützt gesten meistens. Es scheint, dass TableView ist die JavaFx-Komponente zu verwenden, und ich versuchte, hinzufügen von Schaltflächen, um es aber als angezeigt, es zeigt den string-Wert der Taste, nicht die Taste selbst. Es sieht aus wie ich haben, überschreiben Sie die Zeile, die Fabrik-oder Zell-factory zu tun, was ich will, aber es gibt nicht viele Beispiele. Hier ist der code, den ich als Beispiel benutzt, zeigt die Schaltfläche als string.
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: Nach genauer zu untersuchen habe ich festgestellt, Beispiele, überschreiben Sie die Zelle von Grafiken mit vordefinierten Zelltypen wie text und überprüft. Es ist nicht klar, ob alle generischen jfx-Komponente kann in eine Zelle wie ein JFXPanel. Dies ist im Gegensatz zu JTable, da die Verwendung einer JTable ich kann alles, was erbt von JComponent, solange ich das setup der render-Klasse richtig. Wenn jemand weiß, wie (oder ob es überhaupt möglich ist), um ein JFXPanel in eine Zelle oder eine andere generische JFx-Komponente wie einen Button, der wäre sehr hilfreich.
InformationsquelleAutor Mark | 2013-05-03
Du musst angemeldet sein, um einen Kommentar abzugeben.
Probleme mit Ihrer Umsetzung
Können Sie einbetten von JavaFX-Komponenten in Swing-Anwendungen (indem Sie die JavaFX-Komponente in einem JFXPanel). Aber Sie können nicht einbetten einer Swing-Komponente in JavaFX (es sei denn, Sie sind mit JavaFX 8+).
JavaFX hat eine eigene Taste, die Umsetzung sowieso, es gibt also keinen Grund zum einbetten einer
javax.swing.JButton
auf einer JavaFX scene, selbst, wenn Sie wurden mit Java8 und es würde funktionieren.Aber das wird nicht fix alle Ihre Fragen. Sie sind die Bereitstellung einer Zelle mit dem Wert der Fabrik für Ihre Schaltfläche Spalte zu liefern Tasten, nicht aber die Bereitstellung eines benutzerdefinierten Zelle rendering-Fabrik. Die Standard-Tabelle Zelle rendering-Fabrik rendert die
toString
Ausgang auf den jeweiligen Wert der Zelle, die ist, warum Sie sehen nur die string-Darstellung der Schaltfläche in der Tabelle Umsetzung.Sind Sie setzen buttons in der
Person
Objekt. Tun Sie das nicht - Sie don ' T gehören dort. Stattdessen generieren Sie dynamisch eine Schaltfläche in der Zelle rendering-Fabrik. Dies ermöglicht Ihnen, nutzen Sie eine Tabelle der virtuellen flow-Technologie, wobei es nur schafft visuelle Knoten für das, was Sie sehen auf dem Bildschirm, nicht für jedes element in der Tabelle sichern Daten speichern. Zum Beispiel, wenn es 10 Zeilen auf dem Bildschirm sichtbar und 10000 Elemente in der Tabelle, nur 10 werden die Schaltflächen angelegt, anstatt 10000., Wie es zu beheben
javax.swing.JButton
.Richtigen Beispielcode
Dieser code enthält die vorgeschlagene behebt und ein paar Verbesserungen.
Auf der Verwendung von Swing-Komponenten in JavaFX
Einen JFXPanel ist für das einbetten eines JavaFX-Komponente in Swing nicht eine Swing Komponente in JavaFX, daher würde es absolut keinen Sinn zu versuchen, eine
JFXPanel
in einer JavaFXTableView
. Dies ist, warum Sie finden, keine Beispiele, jeder versucht so eine Sache.Einer JavaFX
TableView
ist ähnlich wie eine SchaukelJTable
in dieser Hinsicht. Statt einerJComponent
eine Knoten ist der grundlegende Baustein für die JavaFX - Sie sind Analog, aber anders. Sie können machen jedenNode
in einer JavaFXTableView
so lange, wie Sie die Versorgung der entsprechenden Zelle Fabrik.In Java 8, es ist ein
SwingNode
enthalten kann, eine SchaukelJComponent
. EinSwingNode
erlaubt, dass Sie machen jede Swing-Komponente innerhalb eines JavaFX TableView.Den code
SwingNode
ist sehr einfach:Alternative Implementierung, Die
Obwohl Java 8 sollte Ihnen ermöglichen, zu erreichen, genau das, was Sie wollen, wenn Sie es vorziehen, verwenden Sie eine ältere Java-version, können Sie mit der Swing-basierten Multitouch for Java (MT4J) system für diese anstelle von JavaFX.
Ihre Annahmen sind nicht ganz richtig. Ich aktualisiert meine Antwort zur Klärung meiner Perspektive auf dieses.
Danke ...für deine Rezepte
Du bist ein genial!
ich möchte hinzufügen, die zwei button in ein tableView cell, die mit Ihrem code? ist es möglich?
InformationsquelleAutor jewelsea