按钮不起作用javafx

时间:2018-02-05 11:07:01

标签: button javafx textfield

我是编程的初学者。我一直在尝试创建一个简单的程序,从用户获取两个值(两个等级从0到10)并返回它们之间的平均值。我用Swing和JOptionPane完成了它,但是使用javafx我什么也没得到。这是代码。

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>

所以...窗口出现,我插入成绩但是当我点击按钮获得平均成绩时,没有任何反应。我尝试了很多东西,我搜索了很多...我希望有人可以提供帮助。再次感谢。

2 个答案:

答案 0 :(得分:3)

您需要在fxml文件中@FXML的每个Node上放置fx:id=""注释。 FXMLLoader必须创建正确的实例并将它们注入控制器。

另一个问题是fxml文件中的组件类型。在fxml中,您使用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" />

但是在cotntroller中你使用Text

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

解决方案:

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

答案 1 :(得分:0)

作为@ MBec答案的延伸。用于为javaFX创建GUI的一个非常好的工具是layouts/setVisible。它为您提供了拖拽和放大器。删除功能,并为每个fxml文件的Controller类提供模板。