Как автоматически обновить вкладки TabPane в JavaFX после записи файла? - PullRequest
0 голосов
/ 03 марта 2020

Я пишу программу для хранения информации о клиентах для бизнеса.

Я создал функцию-кнопку для добавления нового клиента, и она отлично работает.

Однако я включаю TabPane в верхней части моего основного JavaFX BorderPane, и у меня возникают проблемы с автоматическим обновлением вкладок после записи этого файла и для этого он отображает недавно добавленного клиента в список вкладок.

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

Я попытался использовать TabPane в приложении расширяет класс приложения, но затем я не могу получить к нему доступ из мой класс меню. Переопределение метода start при создании подкласса класса Application - большая головная боль для JavaFX.

Затем я попытался переместить TabPane в собственный файл класса, и я понял, что понятия не имею, как заставить обновления вкладок обновляться. из основного приложения расширяется класс приложения ...

Как я могу это исправить?

Вот мой основной класс приложения:

public class App extends Application {
//User screen size
private Rectangle2D screenSize = Screen.getPrimary().getBounds();

//Main window and sub windows
private BorderPane mainWindow = new BorderPane();
private GridPane buttonTabPane = new GridPane();
private Menus menu = new Menus();

//Button bar
private ButtonBar buttonBar = new ButtonBar();
private Button newClient = new Button("New Client");
private Button editClient = new Button("Edit Client");
private Button findClient = new Button("Find Client");

//Client tabs
private Tabs clientTabs = new Tabs();
private TabPane clientTabPane = clientTabs.getTabPane();

//Padding
private Insets pad = new Insets(10);

@Override
public void start(Stage stage) {
    stage.setTitle("Cybernetic Tax Automation");

    //Button bar
    buttonBar.getButtons().addAll(newClient,editClient,findClient);
    buttonBar.setPadding(pad);

    //Button actions
    newClient.setOnAction(e -> {
        mainWindow.setCenter(menu.newClient());
    });

    //Combo pane for button bar and tabs
    buttonTabPane.setConstraints(buttonBar,0,0);
    buttonTabPane.setConstraints(clientTabs.getTabPane(),0,1);
    buttonTabPane.getChildren().addAll(buttonBar,clientTabs.getTabPane());

    //Find currently selected client tab
    clientTabs.getTabPane().getSelectionModel().selectedItemProperty().addListener(e -> {
        System.out.println(clientTabs.getTabPane().getSelectionModel().getSelectedItem().getText());
    });

    //Main window
    mainWindow.setTop(buttonTabPane);
    Scene scene = new Scene(mainWindow,screenSize.getMaxX(),screenSize.getMaxY());
    stage.setScene(scene);
    stage.show();
}

}

Вот мой класс Menu, который указывает на окно новой клиентской кнопки:

public class Menus {
//Menus
private GridPane gridPane = new GridPane();

//System specific home
private String home = System.getProperty("user.home");

//File paths
private String clientsFilePath = "/Desktop/Clients.txt";

//Files
private Files fileIO = new Files();
private File clientsFile = new File(home + clientsFilePath);

//Padding and gaps
private Insets pad = new Insets(10,10,10,10);
private int gap = 10;

public GridPane newClient() {
    gridPane.setPadding(pad);
    gridPane.setHgap(gap);
    gridPane.setVgap(gap);

    Label firstName = new Label("First Name:");
    TextField firstNameField = new TextField();
    gridPane.setConstraints(firstName,0,0);
    gridPane.setConstraints(firstNameField,1,0);

    Label middleName = new Label("Middle Name:");
    TextField middleNameField = new TextField();
    gridPane.setConstraints(middleName,0,1);
    gridPane.setConstraints(middleNameField,1,1);

    Label lastName = new Label("Last Name:");
    TextField lastNameField = new TextField();
    gridPane.setConstraints(lastName,0,2);
    gridPane.setConstraints(lastNameField,1,2);

    Button submit = new Button("Submit");
    gridPane.setConstraints(submit,1,3);
    submit.setOnAction(e -> {
        String fullName = "";

        for(Node node : gridPane.getChildren()) {
            if(node instanceof TextField) {
                String firstLetter = ((TextField)node).getText().substring(0,1).toUpperCase();
                String upperName = firstLetter + ((TextField)node).getText().substring(1);
                fullName += upperName + " ";
            }
        }

        fullName += "\n";

        fileIO.writeFile(clientsFile,fullName);
        firstNameField.clear();
        middleNameField.clear();
        lastNameField.clear();
    });

    gridPane.getChildren().addAll(
            firstName,
            firstNameField,
            middleName,
            middleNameField,
            lastName,
            lastNameField,
            submit
    );

    return gridPane;
}

}

Вот мой недавно созданный класс Tabs:

public class Tabs {
//System specific home
private String home = System.getProperty("user.home");

//File paths
private String clientsFilePath = "/Desktop/Clients.txt";

//Files
private File clientsFile = new File(home + clientsFilePath);

//Objects
private TabPane tabPane = new TabPane();
private Files fileIO = new Files();

public Tabs() {
    tabPane.setTabClosingPolicy(TabPane.TabClosingPolicy.UNAVAILABLE);
    tabPane.setTabMinWidth(120);

    updateTabs();
}

public TabPane getTabPane() {
    return tabPane;
}

public void updateTabs() {
    ArrayList<String> clientList = fileIO.readFile(clientsFile);
    tabPane.getTabs().removeAll();

    for(int i = 0; i < clientList.size(); i++) {
        Tab client = new Tab(clientList.get(i));
        tabPane.getTabs().add(client);
    }
}

}

1 Ответ

0 голосов
/ 04 марта 2020

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

Вы можете передать экземпляр Tabs методу newClient () и запросить обновление вкладок. когда запись в файл завершена.

Что-то вроде ...

В вашем методе start ():

newClient.setOnAction(e -> {
   mainWindow.setCenter(menu.newClient(clientTabs));
});

И в методе newClient:

// PASS THE Tabs INSTANCE TO THIS METHOD    
public GridPane newClient(Tabs clientTabs) {
        gridPane.setPadding(pad);
        ...
        ...
        submit.setOnAction(e -> {
            String fullName = "";

            for(Node node : gridPane.getChildren()) {
                if(node instanceof TextField) {
                    String firstLetter = ((TextField)node).getText().substring(0,1).toUpperCase();
                    String upperName = firstLetter + ((TextField)node).getText().substring(1);
                    fullName += upperName + " ";
                }
            }

            fullName += "\n";

            fileIO.writeFile(clientsFile,fullName);
            firstNameField.clear();
            middleNameField.clear();
            lastNameField.clear();
            // CALL THE UPDATE TABS WHEN THE FILE WRITING IS DONE
            clientTabs.updateTabs();
        });
        ...
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...