如何使按钮从 TextArea JavaFX 中删除单个字符

问题描述 投票:0回答:0

找到这个简单的部分完成的 ATM 代码。想为其添加新功能并完成它。我一直在练习 JavaFx 和 Scene Builder,并且在过去一个小时左右遇到了这个问题。我试图让 clearButton 基本上“退格”或“删除”上一个按钮条目。我试过使用 focusProperty() 但无法正确实现它和

textarea.setText(textarea.getText(0, textarea.getLength()-1));
的变体。 clearButton 也会在按下时在 TextArea 中显示其自身的名称。我的主要重点只是让那个 clearButton 工作,但如果有一种方法可以防止它删除已经显示在 TextArea 中的文本,那也会有帮助。

    package atm.atm_fx;
    
    import javafx.application.Application;
    import javafx.fxml.FXMLLoader;
    import javafx.scene.Parent;
    import javafx.scene.Scene;
    import javafx.stage.Stage;
    import java.io.IOException;
    
    public class Main extends Application {
    
        private static Stage stg;
    
        @Override
        public void start(Stage stage) throws IOException {
            stg = stage;
            stage.setResizable(false);
            FXMLLoader fxmlLoader = new FXMLLoader(Main.class.getResource("ATM.fxml"));
            Scene scene = new Scene(fxmlLoader.load(), 638, 450);
            stage.setTitle("JAVA ATM");
            stage.setScene(scene);
            stage.show();
        }
    
        public void changeScene(String fxml) throws IOException {
            Parent pane = FXMLLoader.load(getClass().getResource(fxml));
            stg.getScene().setRoot(pane);
        }
    
        public static void main(String[] args) {
            launch();
        }
    }// Main

ATM image in FXML

package atm.atm_fx;
    
    import javafx.event.ActionEvent;
    import javafx.event.EventHandler;
    import javafx.fxml.FXML;
    import javafx.scene.control.Button;
    import javafx.scene.control.TextArea;
    
    import java.io.IOException;
    
    public class AppController {
    
        @FXML
        private TextArea displayTextArea;
        @FXML
        private Button zeroButton;
        @FXML
        private Button oneButton;
        @FXML
        private Button twoButton;
        @FXML
        private Button threeButton;
        @FXML
        private Button fourButton;
        @FXML
        private Button fiveButton;
        @FXML
        private Button sixButton;
        @FXML
        private Button sevenButton;
        @FXML
        private Button eightButton;
        @FXML
        private Button nineButton;
        @FXML
        private Button clearButton;
        @FXML
        private Button cancelButton;
    
        private final ATM atm = new ATM();
        private String numbersEntered = "";
        private int selectedAccountId = 0;
    
        private EventHandler<ActionEvent> keyboardListener = new EventHandler<ActionEvent>() {
            @Override
            public void handle(ActionEvent actionEvent) {
                Button sourceComponent = (Button)actionEvent.getSource();
                String number = sourceComponent.getText();
                boolean showBalanceSelected = number.equals("1") && selectedAccountId != 0;
                if(showBalanceSelected) {
                   float balance = atm.showBalance(selectedAccountId);
                   displayTextArea.clear();
                   displayTextArea.setText("YOUR ACCOUNT BALANCE IS: " + balance);
                   numbersEntered = "";
    
                }
                numbersEntered += number;
                displayTextArea.appendText(number);
            }
        };
    
        @FXML
        public void initialize() {
            displayWelcomeMessage();
            zeroButton.setOnAction(keyboardListener);
            oneButton.setOnAction(keyboardListener);
            twoButton.setOnAction(keyboardListener);
            threeButton.setOnAction(keyboardListener);
            fourButton.setOnAction(keyboardListener);
            fiveButton.setOnAction(keyboardListener);
            sixButton.setOnAction(keyboardListener);
            sevenButton.setOnAction(keyboardListener);
            eightButton.setOnAction(keyboardListener);
            nineButton.setOnAction(keyboardListener);
            clearButton.setOnAction(keyboardListener);
        }
    
        public void okButtonListener() throws IOException {
            int accountID = Integer.parseInt(numbersEntered);
            if (atm.isBankAccountIdValid(accountID)) {
                Main m = new Main();
                m.changeScene("bankUI.fxml");
                displayTextArea.clear();
                displayBankInterface();
            } else if (atm.isAccountValid(accountID)) {
                selectedAccountId = accountID;
                displayMenu();
            } else {
                displayError();
            }
        }
        // DELETES LAST CHARACTER ENTERED
        public void clearButtonListener() throws IOException {
    
        }
    
        public void cancelButtonListener() throws IOException {
            numbersEntered = "";
            selectedAccountId = 0;
            displayTextArea.clear();
            displayWelcomeMessage();
        }
        private void displayError() {
            displayTextArea.clear();
            displayTextArea.setText("ERROR: ACCOUNT INVALID! PRESS CANCEL TO TRY AGAIN.");
        }
        private void displayMenu() {
            displayTextArea.clear();
            displayTextArea.setText("       MENU        \n" +
                                    "   1. SHOW BALANCE \n" +
                                    "   2. WITHDRAW     \n");
        }
        private void displayWelcomeMessage() {
            displayTextArea.setText("WELCOME TO JAVA ATM! \n" +
                                    "PLEASE ENTER YOUR ACCOUNT ID: ");
        }
        private void displayBankInterface() {
            displayTextArea.clear();
            displayTextArea.setText("ENTER 1 - SET UP NEW ACCOUNT" +
                                    "ENTER 2 - CHANGE ACCOUNT DETAILS" +
                                    "ENTER 3 - DELETE ACCOUNT");
        }
    }
package atm.atm_fx;
    
    public class Account {
        private int accountId;
        private float balance;
        public Account(int accountId, float balance) {
            this.accountId = accountId;
            this.balance = balance;
        }
        public int getAccountId() {
            return accountId;
        }
        public float getBalance() {
            return balance;
        }
    }
package atm.atm_fx;
    
    import java.util.HashMap;
    import java.util.Map;
    
    public class ATM {
        private Map<Integer, Account> accounts;
        private final Bank bankCode;
        public ATM() {
            accounts = new HashMap<>();
            bankCode = new Bank(987654321);
            Account account1 = new Account(1111, 1000);
            accounts.put(account1.getAccountId(), account1);
            Account account2 = new Account(2222, 2000);
            accounts.put(account2.getAccountId(), account1);
        }
        public boolean isAccountValid(int accountId) {
            Account account = accounts.get(accountId);
            if (account == null) {
                return false;
            } else {
                return true;
            }
        }
        public float showBalance(int accountId) {
            Account account = accounts.get(accountId);
            if (account != null) {
                return account.getBalance();
            } else {
                return -1;
            }
        }
        public boolean isBankAccountIdValid(int accountId) {
            if (accountId == 987654321) {
                return true;
            } else {
                return false;
            }
        }
        // TODO create functionality for new accounts
        private void addNewAccount(int accountId, float balance) {
            Account account = new Account(accountId, balance);
            accounts.put(account.getAccountId(),account);
        }
    }
<?xml version="1.0" encoding="UTF-8"?>
    
    <?import javafx.geometry.Insets?>
    <?import javafx.scene.control.Button?>
    <?import javafx.scene.control.Menu?>
    <?import javafx.scene.control.MenuBar?>
    <?import javafx.scene.control.MenuItem?>
    <?import javafx.scene.control.TextArea?>
    <?import javafx.scene.image.Image?>
    <?import javafx.scene.image.ImageView?>
    <?import javafx.scene.layout.AnchorPane?>
    <?import javafx.scene.layout.ColumnConstraints?>
    <?import javafx.scene.layout.GridPane?>
    <?import javafx.scene.layout.HBox?>
    <?import javafx.scene.layout.RowConstraints?>
    <?import javafx.scene.layout.VBox?>
    <?import javafx.scene.text.Font?>
    
    <VBox prefHeight="400.0" prefWidth="640.0" xmlns="http://javafx.com/javafx/19" xmlns:fx="http://javafx.com/fxml/1" fx:controller="atm.atm_fx.AppController">
        <children>
            <MenuBar VBox.vgrow="NEVER">
                <menus>
                    <Menu mnemonicParsing="false" text="File">
                        <items>
                            <MenuItem mnemonicParsing="false" text="Quit" />
                        </items>
                    </Menu>
                </menus>
            </MenuBar>
            <AnchorPane maxHeight="-1.0" maxWidth="-1.0" prefHeight="-1.0" prefWidth="-1.0" VBox.vgrow="ALWAYS">
                <children>
                    <VBox layoutX="-1.0" layoutY="-4.0" prefHeight="428.0" prefWidth="640.0" style="-fx-background-color: #bdbdbd#bdbdbd #bdbdbd#bdbdbd;">
                        <children>
                            <TextArea fx:id="displayTextArea" editable="false" prefHeight="171.0" prefWidth="555.0" style="-fx-font-alignment: center;-fx-border-color: #000000;-fx-control-inner-background:#099934; -fx-font-size:25">
                                <VBox.margin>
                                    <Insets bottom="15.0" left="15.0" right="15.0" top="15.0" />
                                </VBox.margin>
                            </TextArea>
                            <HBox alignment="CENTER" prefHeight="229.0" prefWidth="640.0">
                                <children>
                                    <VBox prefHeight="215.0" prefWidth="229.0">
                                        <children>
                                            <GridPane alignment="CENTER" prefHeight="165.0" prefWidth="209.0">
                                                <columnConstraints>
                                                    <ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" />
                                                    <ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" />
                                                    <ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" />
                                                </columnConstraints>
                                                <rowConstraints>
                                                    <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
                                                    <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
                                                    <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
                                                </rowConstraints>
                                                <children>
                                                    <Button fx:id="oneButton" alignment="CENTER" contentDisplay="CENTER" mnemonicParsing="false" style="-fx-font-size: 25;" text="1" GridPane.halignment="CENTER" GridPane.valignment="CENTER" />
                                                    <Button fx:id="twoButton" mnemonicParsing="false" style="-fx-font-size: 25;" text="2" GridPane.columnIndex="1" GridPane.halignment="CENTER" GridPane.valignment="CENTER" />
                                                    <Button fx:id="threeButton" mnemonicParsing="false" style="-fx-font-size: 25;" text="3" GridPane.columnIndex="2" GridPane.halignment="CENTER" GridPane.valignment="CENTER" />
                                                    <Button fx:id="fourButton" mnemonicParsing="false" style="-fx-font-size: 25;" text="4" GridPane.halignment="CENTER" GridPane.rowIndex="1" GridPane.valignment="CENTER" />
                                                    <Button fx:id="fiveButton" mnemonicParsing="false" style="-fx-font-size: 25;" text="5" GridPane.columnIndex="1" GridPane.halignment="CENTER" GridPane.rowIndex="1" GridPane.valignment="CENTER" />
                                                    <Button fx:id="sixButton" mnemonicParsing="false" style="-fx-font-size: 25;" text="6" GridPane.columnIndex="2" GridPane.halignment="CENTER" GridPane.rowIndex="1" GridPane.valignment="CENTER" />
                                                    <Button fx:id="sevenButton" mnemonicParsing="false" style="-fx-font-size: 25;" text="7" GridPane.halignment="CENTER" GridPane.rowIndex="2" GridPane.valignment="CENTER" />
                                                    <Button fx:id="eightButton" mnemonicParsing="false" style="-fx-font-size: 25;" text="8" GridPane.columnIndex="1" GridPane.halignment="CENTER" GridPane.rowIndex="2" GridPane.valignment="CENTER" />
                                                    <Button fx:id="nineButton" mnemonicParsing="false" style="-fx-font-size: 25;" text="9" GridPane.columnIndex="2" GridPane.halignment="CENTER" GridPane.rowIndex="2" GridPane.valignment="CENTER" />
                                                </children>
                                            </GridPane>
                                            <HBox alignment="BOTTOM_CENTER" prefHeight="54.0" prefWidth="209.0">
                                                <children>
                                                    <Button fx:id="zeroButton" alignment="CENTER" mnemonicParsing="false" style="-fx-font-size: 25;" text="0">
                                                        <HBox.margin>
                                                            <Insets />
                                                        </HBox.margin>
                                                    </Button>
                                                    <Button fx:id="okButton" alignment="CENTER" mnemonicParsing="false" onMouseClicked="#okButtonListener" prefHeight="47.0" prefWidth="49.0" style="-fx-background-color: #4b974d#4b974d;" text="OK" textAlignment="CENTER">
                                                        <HBox.margin>
                                                            <Insets />
                                                        </HBox.margin>
                                                        <font>
                                                            <Font name="System Bold" size="15.0" />
                                                        </font>
                                                    </Button>
                                                    <Button fx:id="clearButton" alignment="CENTER" mnemonicParsing="false" onMouseClicked="#clearButtonListener" prefHeight="48.0" prefWidth="50.0" style="-fx-background-color: #fffb28#fffb28;" text="CLEAR" textAlignment="CENTER">
                                                        <font>
                                                            <Font name="System Bold" size="10.0" />
                                                        </font>
                                                    </Button>
                                                    <Button fx:id="cancelButton" mnemonicParsing="false" onMouseClicked="#cancelButtonListener" prefHeight="47.0" prefWidth="60.0" style="-fx-background-color: #ff0000#ff0000;" text="CANCEL">
                                                        <font>
                                                            <Font size="11.0" />
                                                        </font>
                                                    </Button>
                                                </children>
                                            </HBox>
                                        </children>
                                    </VBox>
                                    <ImageView fx:id="cashImageView" fitHeight="167.0" fitWidth="401.0" pickOnBounds="true" preserveRatio="true">
                                        <image>
                                            <Image url="@../../atm-empty.png" />
                                        </image>
                                    </ImageView>
                                </children>
                                <VBox.margin>
                                    <Insets />
                                </VBox.margin>
                                <padding>
                                    <Insets bottom="15.0" left="15.0" right="15.0" top="15.0" />
                                </padding>
                            </HBox>
                        </children>
                    </VBox>
                </children>
            </AnchorPane>
        </children>
    </VBox>
button javafx event-handling textarea actionevent
© www.soinside.com 2019 - 2024. All rights reserved.