我有一個swing項目,它使用很多JTable來顯示從文本到面板的各種各樣的東西到混合的按鈕和複選框。我可以通過覆蓋表格單元格渲染器來返回通用的JComponents。我的問題是可以使用JavaFx製作類似的表格嗎?JavaFX表 - 如何添加組件?
我想更新項目中的所有表格,以便使用JavaFx主要支持手勢。看來TableView是使用的JavaFx組件,我試着向它添加按鈕,但是當顯示時它顯示按鈕的字符串值,而不是按鈕本身。它看起來像我必須覆蓋行工廠或細胞工廠做我想做的事情,但沒有很多的例子。這裏是我用作一個例子的代碼,將按鈕顯示爲一個字符串。
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;
}
}
}
編輯:進一步調查我發現的例子重寫使用預定義的細胞類型,如文本,並檢查電池的圖形後。目前尚不清楚是否有任何通用jfx組件可以像JFXPanel一樣放置在單元中。這與JTable不同,因爲使用JTable我可以放置從JComponent繼承的任何東西,只要我正確設置渲染類。如果有人知道如何(或者甚至有可能)將JFXPanel放置在單元格或其他通用JFx組件(如Button)中,這將非常有用。
非常感謝你的例子。但正如你所說,我不能在Swing組件中嵌入javafx。因此,我現在放在我的jtables上的所有組件都將被重寫。聲音正確嗎?在這種情況下,我不認爲javafx表格視圖對我有用。 基本上我想要做的是添加手勢滾動支持到我的Java項目,所以用戶可以'輕彈'通過表和標籤,我認爲,因爲javafx有本質上的支持,這將是一個好主意,升級項目到javafx。但是如果不重寫許多組件,看起來這是不可能的。 – Mark 2013-05-07 19:54:08
你的假設並不完全正確。我更新了我的答案,以幫助澄清我對此的看法。 – jewelsea 2013-05-08 00:32:19
謝謝...你的食譜 – 2013-07-02 07:12:50