找到这个简单的部分完成的 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
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>