首页 > 解决方案 > 从 JavaFX 调用 Controller 方法时,为什么不将非静态方法更改为静态修复“无法引用非静态方法”错误?

问题描述

我的第一个问题是:为什么你不能从你的主类之外调用一些方法?例如,如果我尝试将 System.out.println 放在主类之外,它必须在方法中,但这是为什么呢?

我更紧迫的问题是:

我正在尝试在 JavaFX 中构建一个简单的计算器,我有以下代码: Main

package sample;

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

public class Main extends Application {

    @Override
    public void start(Stage primaryStage) throws Exception{
    Parent root = 
        FXMLLoader.load(getClass().getResource("/fxml/sample.fxml"));
    primaryStage.setTitle("Hello World");
    primaryStage.setScene(new Scene(root, 300, 450));
    primaryStage.setResizable(false);
    Controller.disableDisplay(); // This is essentially what id like to do
    primaryStage.show();
}


public static void main(String[] args) {
    launch(args);
}
}

控制器

package sample;

import javafx.fxml.FXML;
import javafx.scene.control.Button;
import javafx.scene.control.TextField;

public class Controller {
@FXML
private TextField display;
@FXML
private Button AC;
@FXML
private Button plusMinus;
@FXML
private Button percent;
@FXML
private Button divide;
@FXML
private Button seven;
@FXML
private Button eight;
@FXML
private Button nine;
@FXML
private Button times;
@FXML
private Button four;
@FXML
private Button five;
@FXML
private Button six;
@FXML
private Button minus;
@FXML
private Button one;
@FXML
private Button two;
@FXML
private Button three;
@FXML
private Button plus;
@FXML
private Button zero;
@FXML
private Button comma;
@FXML
private Button equal;

    public void disableDisplay() {
        display.setDisable(true);
    }
}

文件格式

<?import javafx.geometry.Insets?>
<?import javafx.scene.layout.GridPane?>
<?import javafx.scene.control.Button?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.text.Text?>
<?import javafx.scene.control.TextField?>
<?import javafx.scene.layout.VBox?>
<?import javafx.scene.layout.HBox?>

<GridPane fx:controller="sample.Controller"
      xmlns:fx="http://javafx.com/fxml"
      alignment="center" hgap="10" vgap="10"
      stylesheets="/css/sample.css">

<VBox>
    <TextField fx:id="display" text="0" />
    <HBox>
        <Button fx:id="AC" styleClass="button" text="AC"/>
        <Button fx:id="plusMinus" styleClass="button" text="+/-"/>
        <Button fx:id="percent" styleClass="button" text="P"/>
        <Button fx:id="divide" styleClass="button" text="/"/>
    </HBox>
    <HBox>
        <Button fx:id="seven" styleClass="button" text="7"/>
        <Button fx:id="eight" styleClass="button" text="8"/>
        <Button fx:id="nine" styleClass="button" text="9"/>
        <Button fx:id="times" styleClass="button" text="X"/>
    </HBox>
    <HBox>
        <Button fx:id="four" styleClass="button" text="4"/>
        <Button fx:id="five" styleClass="button" text="5"/>
        <Button fx:id="six" styleClass="button" text="6"/>
        <Button fx:id="minus" styleClass="button" text="-"/>
    </HBox>
    <HBox>
        <Button fx:id="one" styleClass="button" text="1"/>
        <Button fx:id="two" styleClass="button" text="2"/>
        <Button fx:id="three" styleClass="button" text="3"/>
        <Button fx:id="plus" styleClass="button" text="+"/>
    </HBox>
    <HBox>
        <Button fx:id="zero" styleClass="button" text="0"/>
        <Button fx:id="comma" styleClass="button" text=","/>
        <Button fx:id="equal" styleClass="button" text="="/>
    </HBox>
</VBox>
</GridPane>

这只是我想实现的方法的一个随机示例,但我不能这样做,因为它给出了以下消息:

不能从静态上下文引用非静态方法“disableDisplay()”。

但是将 disableDisplay 方法设为静态也不能解决问题,所以有没有一种我不知道的事实上的方法来做这样的事情,或者我是否以错误的方式处理这个问题?

标签: javajavafxmethods

解决方案


推荐阅读