Глобальная таблица под TabPane - JavaFX - PullRequest
0 голосов
/ 05 февраля 2020

Я изучаю учебник Oracle с таблицами и внедрил в этот код свою собственную панель tabPane. Я хочу, чтобы таблица была глобальной таблицей, поэтому, когда я go на вкладке 2, она точно такая же, как на вкладке 1, только я могу редактировать определенные столбцы на вкладке 2 по сравнению с редактированием. все это на вкладке 1.

В любом случае это можно сделать вместо дублирования кода и создания второй таблицы, что я считаю утомительным, поскольку мне не нужны две таблицы, мне нужна одна глобальная таблица.

public class TableSample extends Application {

    private TableView<Person> table = new TableView<Person>();
    private final ObservableList<Person> data =
            FXCollections.observableArrayList(
            new Person("Jacob", "Smith", "jacob.smith@example.com"),
            new Person("Isabella", "Johnson", "isabella.johnson@example.com"));

    public static void main(String[] args) {
        launch(args);
    }

    private TableView table = new TableView();

    public void start(Stage stage) {
        Scene scene = new Scene(new Group());

        TabPane tabPane = new TabPane();

        Tab tab1 = new Tab("Tab 1");
        tabPane.getTabs().add(tab1);

        Tab tab2 = new Tab("Tab 2");
        tabPane.getTabs().add(tab2);

        table.setEditable(true);

        TableColumn firstNameCol = new TableColumn("First Name");
        firstNameCol.setCellValueFactory(
                new PropertyValueFactory<Person, String>("firstName"));
        firstNameCol.setCellFactory(TextFieldTableCell.forTableColumn());
        firstNameCol.setOnEditCommit(
            new EventHandler<CellEditEvent<Person, String>>() {
                @Override
                public void handle(CellEditEvent<Person, String> t) {
                    ((Person) t.getTableView().getItems().get(
                            t.getTablePosition().getRow())
                            ).setFirstName(t.getNewValue());
                }
            }
        );

        TableColumn lastNameCol = new TableColumn("Last Name");
        lastNameCol.setCellValueFactory(
                new PropertyValueFactory<Person, String>("lastName"));
        lastNameCol.setCellFactory(TextFieldTableCell.forTableColumn());
        lastNameCol.setOnEditCommit(
            new EventHandler<CellEditEvent<Person, String>>() {
                @Override
                public void handle(CellEditEvent<Person, String> t) {
                    ((Person) t.getTableView().getItems().get(
                        t.getTablePosition().getRow())
                        ).setLastName(t.getNewValue());
                }
            }
        );

        TableColumn emailCol = new TableColumn("Email");
        emailCol.setCellValueFactory(
                new PropertyValueFactory<Person, String>("email"));
        emailCol.setCellFactory(TextFieldTableCell.forTableColumn());
        emailCol.setOnEditCommit(
            new EventHandler<CellEditEvent<Person, String>>() {
                @Override
                public void handle(CellEditEvent<Person, String> t) {
                    ((Person) t.getTableView().getItems().get(
                        t.getTablePosition().getRow())
                        ).setEmail(t.getNewValue());
                }
            }
        );

        table.setItems(data);
        table.getColumns().addAll(firstNameCol, lastNameCol, emailCol);

        final VBox vbox = new VBox();
        vbox.getChildren().addAll(tabPane, 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 Person(String fName, String lName, String email) {
            this.firstName = new SimpleStringProperty(fName);
            this.lastName = new SimpleStringProperty(lName);
            this.email = new SimpleStringProperty(email);
        }

        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);
        }
    }
} 

1 Ответ

0 голосов
/ 05 февраля 2020

Ваша структура кода уже настроена правильно. Вам просто нужно добавить Nodes к другому Tabs

Код ключа: Вам нужно добавить root узел к каждому Tab. Каждый узел root будет содержать другие узлы, которые придают каждому Tab вид.

    Tab tab1 = new Tab("Tab 1");
    Label tab1Label = new Label("Use tab1Root to add nodes for tab1!");
    StackPane tab1Root = new StackPane(tab1Label);
    tab1Root.setPrefSize(500, 500);
    tab1.setContent(tab1Root);
    tabPane.getTabs().add(tab1);

    Tab tab2 = new Tab("Tab 2");
    Button tab2Button = new Button("Press Me!");
    tab2Button.setOnAction((event) -> {
        System.out.println("Use tab2Root to add nodes for tab2!");
    });
    StackPane tab2Root = new StackPane(tab2Button);
    tab2Root.setPrefSize(500, 500);
    tab2.setContent(tab2Root);
    tabPane.getTabs().add(tab2);

Полный код

import javafx.application.Application;
import javafx.beans.property.SimpleStringProperty;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.event.EventHandler;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.Tab;
import javafx.scene.control.TabPane;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.scene.control.TreeTableColumn.CellEditEvent;
import javafx.scene.control.cell.PropertyValueFactory;
import javafx.scene.control.cell.TextFieldTableCell;
import javafx.scene.layout.StackPane;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;

public class TestingGround extends Application
{
    private TableView<Person> table = new TableView<Person>();
    private final ObservableList<Person> data
            = FXCollections.observableArrayList(
                    new Person("Jacob", "Smith", "jacob.smith@example.com"),
                    new Person("Isabella", "Johnson", "isabella.johnson@example.com"));

    public static void main(String[] args)
    {
        launch(args);
    }

    public void start(Stage stage)
    {
        Scene scene = new Scene(new Group());

        TabPane tabPane = new TabPane();

        Tab tab1 = new Tab("Tab 1");
        Label tab1Label = new Label("Use tab1Root to add nodes for tab1!");
        StackPane tab1Root = new StackPane(tab1Label);
        tab1Root.setPrefSize(500, 500);
        tab1.setContent(tab1Root);
        tabPane.getTabs().add(tab1);

        Tab tab2 = new Tab("Tab 2");
        Button tab2Button = new Button("Press Me!");
        tab2Button.setOnAction((event) -> {
            System.out.println("Use tab2Root to add nodes for tab2!");
        });
        StackPane tab2Root = new StackPane(tab2Button);
        tab2Root.setPrefSize(500, 500);
        tab2.setContent(tab2Root);
        tabPane.getTabs().add(tab2);

        table.setEditable(true);

        TableColumn firstNameCol = new TableColumn("First Name");
        firstNameCol.setCellValueFactory(
                new PropertyValueFactory<Person, String>("firstName"));
        firstNameCol.setCellFactory(TextFieldTableCell.forTableColumn());
        firstNameCol.setOnEditCommit(
                new EventHandler<CellEditEvent<Person, String>>()
        {
            @Override
            public void handle(CellEditEvent<Person, String> t)
            {
//                ((Person) t.getTableView().getItems().get(
//                        t.getTablePosition().getRow())).setFirstName(t.getNewValue());
            }
        }
        );

        TableColumn lastNameCol = new TableColumn("Last Name");
        lastNameCol.setCellValueFactory(
                new PropertyValueFactory<Person, String>("lastName"));
        lastNameCol.setCellFactory(TextFieldTableCell.forTableColumn());
        lastNameCol.setOnEditCommit(
                new EventHandler<CellEditEvent<Person, String>>()
        {
            @Override
            public void handle(CellEditEvent<Person, String> t)
            {
//                ((Person) t.getTableView().getItems().get(
//                        t.getTablePosition().getRow())).setLastName(t.getNewValue());
            }
        }
        );

        TableColumn emailCol = new TableColumn("Email");
        emailCol.setCellValueFactory(
                new PropertyValueFactory<Person, String>("email"));
        emailCol.setCellFactory(TextFieldTableCell.forTableColumn());
        emailCol.setOnEditCommit(
                new EventHandler<CellEditEvent<Person, String>>()
        {
            @Override
            public void handle(CellEditEvent<Person, String> t)
            {
//                ((Person) t.getTableView().getItems().get(
//                        t.getTablePosition().getRow())).setEmail(t.getNewValue());
            }
        }
        );

        table.setItems(data);
        table.getColumns().addAll(firstNameCol, lastNameCol, emailCol);

        final VBox vbox = new VBox();
        vbox.getChildren().addAll(tabPane, 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 Person(String fName, String lName, String email)
        {
            this.firstName = new SimpleStringProperty(fName);
            this.lastName = new SimpleStringProperty(lName);
            this.email = new SimpleStringProperty(email);
        }

        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);
        }
    }
}
...