从控制器类javaFX场景生成器内部创建类的实例

从控制器类javaFX场景生成器内部创建类的实例,java,Java,我是新来的,完全自学成才 我有一个程序,它有各种函数,可以改变数组中的值,然后通过Midi输出 在我决定学习Scene builder之前,一切都很顺利。 这是一个精简版,突出了我的问题 我创建了一个带有一个按钮的GUI。每次按下该按钮,我都需要将数组中大于零的数字的值增加1。我的初始值是 01101 按按钮增加 02 02 按按钮增加 0303 按按钮增加 0 4 0 4等 问题是,在控制器类中,要访问主程序中的void,它需要创建一个实例,因此在按下一个按钮后,它不能超过0 2。 我需要在主

我是新来的,完全自学成才

我有一个程序,它有各种函数,可以改变数组中的值,然后通过Midi输出

在我决定学习Scene builder之前,一切都很顺利。 这是一个精简版,突出了我的问题 我创建了一个带有一个按钮的GUI。每次按下该按钮,我都需要将数组中大于零的数字的值增加1。我的初始值是

01101

按按钮增加

02 02

按按钮增加

0303

按按钮增加

0 4 0 4等

问题是,在控制器类中,要访问主程序中的void,它需要创建一个实例,因此在按下一个按钮后,它不能超过0 2。 我需要在主程序类中保留所有数组,因为所有midi内容都在主程序类中生活和工作。 我为我的非技术性语言道歉 感谢阅读以下两个相关的代码文件

package zump;

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

public class Zump extends Application {

int[] myNoteArray = {0, 1, 0, 1};

@Override
public void start(Stage stage) throws Exception {
    Parent root = FXMLLoader.load(getClass().getResource("zumpFXML.fxml"));
    Scene scene = new Scene(root);
    stage.setScene(scene);
    stage.show();
}

public static void main(String[] args) {
    System.out.println("Main");
    launch(args);
}

void octaveUp() {
    System.out.println("Octave UP");
    for (int i = 0; i < 4; i++) {
        int fa4 = myNoteArray[i];
        if (fa4 > 0 && fa4 < 4) {
            myNoteArray[i] = fa4 + 1;
        } // eo if } 
    }// eo for
    //Print Array//
    for (int i = 0; i < 4; i++) {
        int fa6 = myNoteArray[i];
        System.out.print(fa6);
        System.out.print(" ");
    }
    System.out.println("");
}

}

你不应该每次按下按钮都创建一个实例——你应该只创建一次,然后每次按下按钮都访问一个实例

因此,实例的创建应该在事件处理程序之外,但是创建的实例应该对事件处理程序可用

例如,一种方法是将实例的创建移到一个级别之外:

@FXML // This method is called by the FXMLLoader when initialization is complete
void initialize() {
    assert button != null : "fx:id=\"button\" was not injected: check your FXML file 'zumpFXML.fxml'.";
    final Zump t1 = new Zump();
    button.setOnAction((ActionEvent event) -> {
        System.out.println("That was easy, wasn't it?");
        t1.octaveUp();
        // Zump.octaveUp();
    });
}
final
在Java8中不是必需的,但它仍然有助于识别这是匿名类/lambda表达式内部使用的变量)

@FXML // This method is called by the FXMLLoader when initialization is complete
void initialize() {
    assert button != null : "fx:id=\"button\" was not injected: check your FXML file 'zumpFXML.fxml'.";
    final Zump t1 = new Zump();
    button.setOnAction((ActionEvent event) -> {
        System.out.println("That was easy, wasn't it?");
        t1.octaveUp();
        // Zump.octaveUp();
    });
}