Issue
Hi everyone I need to create an ActionEvent from a button and put the button name on a TextField. What i have is a kind of calculator but when I press a button doesn't fills the TextField. As an example what I want: I have the numer one on a button and when I press it the number one appears on the TextField. This is what I have until now:
AppCalculator class:
package appcalculator;
import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;
public class AppCalculator extends Application {
@Override
public void start(Stage stage) throws Exception {
Parent root = FXMLLoader.load(getClass().getResource("FXMLDocument.fxml"));
Scene scene = new Scene(root);
stage.setScene(scene);
stage.show();
}
public static void main(String[] args) {
launch(args);
}
}
FXMLDocumentController:
package appcalculadora;
import java.net.URL;
import java.util.ResourceBundle;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.TextField;
public class FXMLDocumentController implements Initializable {
TextField texto = new TextField();
@FXML
private void btnOne(ActionEvent event) {
texto.setText("1");
}
@FXML
private void btnTwo(ActionEvent event) {
texto.setText("2");
}
@FXML
private void btnThree(ActionEvent event) {
texto.setText("3");
}
@FXML
private void btnFour(ActionEvent event) {
texto.setText("4");
}
@FXML
private void btnFive(ActionEvent event) {
texto.setText("5");
}
@FXML
private void btnSix(ActionEvent event) {
texto.setText("6");
}
@FXML
private void btnSevent(ActionEvent event) {
texto.setText("7");
}
@FXML
private void btnEight(ActionEvent event) {
texto.setText("8");
}
@FXML
private void btnNine(ActionEvent event) {
texto.setText("9");
}
@FXML
private void btnZero(ActionEvent event) {
texto.setText("0");
}
@FXML
private void btnPoint(ActionEvent event) {
texto.setText(".");
}
@FXML
private void btnPlus(ActionEvent event) {
texto.setText("+");
}
@FXML
private void btnMinus(ActionEvent event) {
texto.setText("-");
}
@FXML
private void btnBy(ActionEvent event) {
texto.setText("*");
}
@FXML
private void btnDivided(ActionEvent event) {
texto.setText("/");
}
@FXML
private void btnErrase(ActionEvent event){
texto.deletePreviousChar();
}
@FXML
private void btnTotal(ActionEvent event){
texto.getText();
}
@Override
public void initialize(URL url, ResourceBundle rb) {
// TODO
}
}
And my respective FXML document
Solution
This may help you with your answer. Like @James_D you are missing '@FXML private TextField texto;.' Also, you could probably get rid of most of your methods.
Here is a sample program:
Main:
import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;
/**
*
* @author blj0011
*/
public class JavaFXApplication58 extends Application
{
@Override
public void start(Stage stage) throws Exception
{
Parent root = FXMLLoader.load(getClass().getResource("FXMLDocument.fxml"));
Scene scene = new Scene(root);
stage.setScene(scene);
stage.show();
}
/**
* @param args the command line arguments
*/
public static void main(String[] args)
{
launch(args);
}
}
Controller:
import java.net.URL;
import java.util.ResourceBundle;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.*;
/**
*
* @author blj0011
*/
public class FXMLDocumentController implements Initializable
{
@FXML
private TextField texto;
//Use this approach to replace most of your private button handlers!
@FXML
private void handleButtonAction(ActionEvent event)
{
Button button = (Button)event.getSource();
texto.appendText(button.getText());
}
@Override
public void initialize(URL url, ResourceBundle rb)
{
// TODO
}
}
FXML:
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.control.Button?>
<?import javafx.scene.control.TextField?>
<?import javafx.scene.layout.AnchorPane?>
<AnchorPane id="AnchorPane" prefHeight="200" prefWidth="320" xmlns:fx="http://javafx.com/fxml/1" xmlns="http://javafx.com/javafx/8.0.111" fx:controller="javafxapplication58.FXMLDocumentController">
<children>
<Button fx:id="btnOne" layoutX="126" layoutY="90" onAction="#handleButtonAction" text="1" />
<Button fx:id="btnTwo" layoutX="172.0" layoutY="90.0" onAction="#handleButtonAction" text="2" />
<TextField fx:id="texto" layoutX="86.0" layoutY="43.0" />
</children>
</AnchorPane>
Answered By - Sedrick