Tôi có một dự án xoay sử dụng nhiều JTables để hiển thị tất cả mọi thứ từ văn bản đến bảng điều khiển cho đến khi kết hợp các nút và hộp kiểm. Tôi đã có thể thực hiện điều này bằng cách ghi đè lên trình kết xuất ô của bảng để trả về các JComponents chung. Câu hỏi của tôi là một bảng tương tự có thể được thực hiện bằng cách sử dụng JavaFx?Bảng JavaFX - cách thêm thành phần?
Tôi muốn cập nhật tất cả các bảng trong dự án để sử dụng JavaFx để hỗ trợ hầu hết các cử chỉ. Có vẻ như TableView là thành phần JavaFx để sử dụng và tôi đã thử thêm các nút vào nó nhưng khi được hiển thị nó sẽ hiển thị giá trị chuỗi của nút, chứ không phải chính nút đó. Có vẻ như tôi phải ghi đè lên nhà máy sản xuất hàng hoặc nhà máy di động để làm những gì tôi muốn nhưng không có nhiều ví dụ. Đây là mã tôi sử dụng làm ví dụ hiển thị nút dưới dạng chuỗi.
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;
}
}
}
Chỉnh sửa: Sau khi điều tra thêm, tôi đã tìm thấy các ví dụ ghi đè lên các loại ô được xác định trước như văn bản và séc. Nó không phải là rõ ràng nếu bất kỳ thành phần jfx chung có thể được đặt trong một tế bào giống như một JFXPanel. Điều này là không giống như JTable, kể từ khi sử dụng một JTable tôi có thể đặt bất cứ điều gì mà kế thừa từ JComponent miễn là tôi thiết lập các lớp render một cách chính xác. Nếu ai đó biết làm thế nào (hoặc nếu nó thậm chí có thể) để đặt một JFXPanel trong một tế bào hoặc một thành phần JFx chung khác như một nút đó sẽ rất hữu ích.
Cảm ơn bạn rất nhiều vì ví dụ. Nhưng như bạn nói tôi không thể nhúng các thành phần swing trong javafx. Vì vậy, tất cả các thành phần mà tôi hiện đang đặt trên jtables của tôi sẽ phải được viết lại. Âm thanh chính xác? Trong trường hợp đó tôi không nghĩ rằng javafx xem bảng sẽ làm việc cho tôi. Về cơ bản những gì tôi đang cố gắng làm là thêm hỗ trợ di chuyển cử chỉ vào dự án java của tôi để người dùng có thể 'vuốt' qua các bảng và tab và tôi nghĩ vì javafx có hỗ trợ đó nên là một ý tưởng hay để nâng cấp dự án đến javafx. Nhưng có vẻ như điều đó là không thể nếu không viết lại nhiều thành phần. – Mark
Giả định của bạn không chính xác. Tôi đã cập nhật câu trả lời của mình để giúp làm rõ quan điểm của tôi về vấn đề này. – jewelsea
Cảm ơn ... cho công thức nấu ăn của bạn –