Jovane Rocha
Jovane Rocha

Reputation: 101

Button won't work javafx

I'm a total beginner in programming. I've been trying to create a simple program that gets two values from the user (two grades from 0 to 10) and returns the average between them. I've done it with Swing and JOptionPane but using javafx I got nothing. Here goes the code.

package fxcalcmedia;
import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;


public class FXCalcMedia 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();
        stage.setTitle("CALCULADORA DE MÉDIA");

    }

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        launch(args);
    }

}
package fxcalcmedia;

import java.net.URL; 
import java.util.ResourceBundle;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.text.Text;



public class FXMLDocumentController implements Initializable {

    @FXML
    private Label lblMedia;
    private Button btnCalc;
    private Text txtMedia;
    private Text txtNota1;
    private Text txtNota2;


    @FXML
    private void clicouBotao(ActionEvent event) {

       double nota1 = Double.parseDouble(txtNota1.getText());

       double nota2 = Double.parseDouble(txtNota2.getText());

       double media = (nota1+nota2)/2;

       txtMedia.setText(Double.toString(media));


      }

    @Override
    public void initialize(URL url, ResourceBundle rb) {

    }


}
<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.scene.text.*?>
<?import java.lang.*?>
<?import java.util.*?>
<?import javafx.scene.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>

<AnchorPane id="AnchorPane" prefHeight="155.0" prefWidth="303.0" 
xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" 
fx:controller="fxcalcmedia.FXMLDocumentController">
   <children>
      <Label fx:id="lblMedia" layoutX="30.0" layoutY="119.0" 
      text="Média" />
      <Label layoutX="28.0" layoutY="33.0" text="Nota 1" />
      <Label layoutX="28.0" layoutY="76.0" text="Nota 2" />
      <Button fx:id="btnCalc" layoutX="212.0" layoutY="71.0" 
      mnemonicParsing="false" onAction="#clicouBotao" text="Calcular" 
      />
      <TextField fx:id="txtNota1" layoutX="90.0" layoutY="28.0" 
      prefHeight="25.0" prefWidth="78.0" />
      <TextField fx:id="txtNota2" layoutX="90.0" layoutY="71.0" 
      prefHeight="25.0" prefWidth="78.0" />
      <TextField fx:id="txtMedia" layoutX="90.0" layoutY="114.0" 
      onAction="#clicouBotao" prefHeight="25.0" prefWidth="78.0" />
   </children>
</AnchorPane>

So... the window appears, I insert the grades but when I click on the button to get the average grade, nothing happens. I've tried a lot of things, I've searched a lot... I hope somebody can help. Thanks again.

Upvotes: 0

Views: 1112

Answers (2)

TM00
TM00

Reputation: 1390

As an extension to @MBec's answer. A very nice tool for creating GUIs for javaFX is JavaFX Scene Builder. It provides you with drag & drop functionality and also gives templates for each fxml file's Controller class.

Upvotes: 0

MBec
MBec

Reputation: 2210

You need to place @FXML annotation on each Node that have fx:id="" in fxml file. It is necessary for FXMLLoader to create correct instances and inject them to controller.

Another problem is components type in fxml file. In fxml you use TextField

<TextField fx:id="txtNota1" layoutX="90.0" layoutY="28.0" 
prefHeight="25.0" prefWidth="78.0" />
<TextField fx:id="txtNota2" layoutX="90.0" layoutY="71.0" 
prefHeight="25.0" prefWidth="78.0" />
<TextField fx:id="txtMedia" layoutX="90.0" layoutY="114.0" 
onAction="#clicouBotao" prefHeight="25.0" prefWidth="78.0" />

but in cotntroller you use Text:

private Text txtMedia;
private Text txtNota1;
private Text txtNota2;

Solution:

@FXML
private Label lblMedia;
@FXML
private Button btnCalc;
@FXML
private TextField txtMedia;
@FXML
private TextField txtNota1;
@FXML
private TextField txtNota2;

Upvotes: 3

Related Questions