Search code examples
variablesjavafxbooleanfxmltogglebutton

Using FXML and JavaFX, how do I set a boolean variable using toggle button?


I am a new hobbyist coder. I can't figure this one out and searches have been futile so far. I am using two toggle buttons from an FXML file and when clicked, I would like to define a boolean variable. Then I would like to use that variable to later drive the path I travel down for executing some code. I can't figure out how to define the variable. Any guidance is welcome. I'll post the two sources of code below:

The FXML file code (created by Scene Builder):

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

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

<GridPane alignment="CENTER" hgap="10" styleClass="root" vgap="10" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="bmi.calculator.BMICalculatorController">   

<padding><Insets bottom="10" left="25" right="25" top="25" /></padding>
    <children>


    <Text id="header-text" text="BMI Calculator" GridPane.columnIndex="0" GridPane.columnSpan="3" GridPane.rowIndex="0" />

    <Label text="Please enter your age:" GridPane.columnIndex="0" GridPane.rowIndex="1" />

    <TextField fx:id="ageBox" GridPane.columnIndex="1" GridPane.columnSpan="2" GridPane.rowIndex="1" />

    <Label text="Enter your height in inches:" GridPane.columnIndex="0" GridPane.rowIndex="2" />

    <TextField fx:id="heightBox" GridPane.columnIndex="1" GridPane.columnSpan="2" GridPane.rowIndex="2" />  

    <Label text="Enter your weight in pounds:" GridPane.columnIndex="0" GridPane.rowIndex="3" />

    <TextField fx:id="weightBox" GridPane.columnIndex="1" GridPane.columnSpan="2" GridPane.rowIndex="3" />  

    <Label text="Do you use tobbaco?" GridPane.columnIndex="0" GridPane.rowIndex="4" />  

    <ToggleButton onAction="#handleToggleYesAction" mnemonicParsing="false" prefHeight="31.0" prefWidth="85.0" text="Yes" GridPane.columnIndex="1" GridPane.rowIndex="4" />
    <ToggleButton onAction="#handleToggleNoAction" mnemonicParsing="false" prefHeight="31.0" prefWidth="85.0" text="No" GridPane.columnIndex="2" GridPane.rowIndex="4" />

    <HBox alignment="BOTTOM_RIGHT" spacing="10" GridPane.columnIndex="1" GridPane.columnSpan="2" GridPane.rowIndex="6">
        <children>
           <Button onAction="#handleCalculateButtonAction" text="Calculate" />
        </children>
    </HBox>

    <Text fx:id="outputText1" wrappingWidth="211.0" GridPane.columnIndex="1" GridPane.rowIndex="8" />

    </children>

    <stylesheets>
        <URL value="@Login.css" />
    </stylesheets>
    <columnConstraints>
        <ColumnConstraints maxWidth="200.0" minWidth="180.0" prefWidth="200.0" />
        <ColumnConstraints maxWidth="100.0" minWidth="35.0" prefWidth="85.0" />
        <ColumnConstraints maxWidth="100.0" minWidth="25.0" prefWidth="85.0" />
    </columnConstraints>
    <rowConstraints>
    <RowConstraints />
        <RowConstraints />
        <RowConstraints />
        <RowConstraints />
        <RowConstraints />
        <RowConstraints />
        <RowConstraints />
        <RowConstraints />
        <RowConstraints />
    </rowConstraints>

</GridPane>

and the Controller:

package bmi.calculator;

import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.scene.control.TextField;
import javafx.scene.control.ToggleGroup;
import javafx.scene.text.Text;

public class BMICalculatorController {
    @FXML private Text outputText1;
    @FXML private TextField ageBox;
    @FXML private TextField heightBox;
    @FXML private TextField weightBox;

    @FXML protected void handleToggleYesAction(ActionEvent t) {
        boolean tobaccoToggle = true;
    }

    @FXML protected void handleToggleNoAction(ActionEvent t) {
        boolean tobaccoToggle = false;
    }

    @FXML protected void handleCalculateButtonAction(ActionEvent event) {

        //obtains the variables we need to work with
        boolean tobacco = tobaccoToggle; //error is here
        double weight = Double.parseDouble(weightBox.getText());
        double height = Double.parseDouble(heightBox.getText());
        int age = Integer.parseInt(ageBox.getText());

        //Disregard everything else below here for now - I'll be changing it up some later.
        //performs BMI calculation
        double bmi;
        double stepOne;
        stepOne = weight/height;
        double stepTwo;
        stepTwo = stepOne/height;
        bmi = stepTwo*703;

        //round BMI to two decimal places
        double roundedbmi = bmi;
        roundedbmi = roundedbmi * 100;
        roundedbmi = Math.round(roundedbmi);
        roundedbmi = roundedbmi/100;

        //transform height to feet and inches
        int height2 = (int)Math.round(height);
        int heightFeet = height2/12;
        int heightInches = height2%12;

        //transform weight to int
        int weight2 = (int)Math.round(weight);

        outputText1.setText("Your BMI is " + roundedbmi);

        //tell the user what they enetered
        System.out.println("Your height is " + heightFeet + " feet and " + heightInches + " inches.");
        System.out.println("Your weight is " + weight2 + " pounds.");
        System.out.println("Your BMI is " + roundedbmi);
        System.out.println("Your tobacco use is " + tobacco);
    }
}

Error occurs on line 36 of controller: Cannot find symbol, symbol:tobaccoToggle


Solution

  • You must define 'tobaccoToggle' field in your class BMICalculatorController. You are getting error because of scope issue. In your code tobaccoToggle variable in 'handleToggleYesAction' created when function called and dies when function finished. And the same issue in 'handleToggleNoAction'.

    Here is the code.

    package bmi.calculator;
    
    import javafx.event.ActionEvent;
    import javafx.fxml.FXML;
    import javafx.scene.control.TextField;
    import javafx.scene.control.ToggleGroup;
    import javafx.scene.text.Text;
    
    public class BMICalculatorController {
        @FXML private Text outputText1;
        @FXML private TextField ageBox;
        @FXML private TextField heightBox;
        @FXML private TextField weightBox;
        private boolean tobaccoToggle;
    
        @FXML protected void handleToggleYesAction(ActionEvent t) {
            tobaccoToggle = true;
        }
    
        @FXML protected void handleToggleNoAction(ActionEvent t) {
            tobaccoToggle = false;
        }
    
        @FXML protected void handleCalculateButtonAction(ActionEvent event) {
    
            //obtains the variables we need to work with
            boolean tobacco = tobaccoToggle; //error is here
            double weight = Double.parseDouble(weightBox.getText());
            double height = Double.parseDouble(heightBox.getText());
            int age = Integer.parseInt(ageBox.getText());
    
            //Disregard everything else below here for now - I'll be changing it up some later.
            //performs BMI calculation
            double bmi;
            double stepOne;
            stepOne = weight/height;
            double stepTwo;
            stepTwo = stepOne/height;
            bmi = stepTwo*703;
    
            //round BMI to two decimal places
            double roundedbmi = bmi;
            roundedbmi = roundedbmi * 100;
            roundedbmi = Math.round(roundedbmi);
            roundedbmi = roundedbmi/100;
    
            //transform height to feet and inches
            int height2 = (int)Math.round(height);
            int heightFeet = height2/12;
            int heightInches = height2%12;
    
            //transform weight to int
            int weight2 = (int)Math.round(weight);
    
            outputText1.setText("Your BMI is " + roundedbmi);
    
            //tell the user what they enetered
            System.out.println("Your height is " + heightFeet + " feet and " + heightInches + " inches.");
            System.out.println("Your weight is " + weight2 + " pounds.");
            System.out.println("Your BMI is " + roundedbmi);
            System.out.println("Your tobacco use is " + tobacco);
        }
    }