簡體   English   中英

從控制器類javaFX Scene Builder內部創建類的實例

[英]Create instance of a class from inside controller class javaFX Scene Builder

我是新來的,完全是自學成才。

我有一個程序,該程序具有各種功能,這些功能可以更改數組中的值,然后通過Midi輸出。

一切都進行得如此順利,直到我決定學習Scene Builder。 這是一個簡化的版本,突出顯示了我用一個按鈕創建GUI時遇到的問題。 每次按下該按鈕時,我都需要將數組中大於零的數字的值增加一。 我的初始值是

0 1 0 1

按下按鈕增加

0 2 0 2

按下按鈕增加

0 3 0 3

按下按鈕增加

0 4 0 4等

問題在於,在控制器類中訪問主程序中的void時,它需要創建一個實例,因此,一次按下按鈕后它不能超過0 2 02。我需要將所有數組保留在主程序類中因為那是所有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("");
}

}

這是控制器

package zump;

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

public class zumpFXMLController {

    @FXML // ResourceBundle that was given to the FXMLLoader
    private ResourceBundle resources;
    @FXML // URL location of the FXML file that was given to the FXMLLoader
    private URL location;
    @FXML // fx:id="button"
    private Button button; // Value injected by FXMLLoader

    @FXML
    void handleButtonAction(ActionEvent event) {
    }

    @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'.";
        button.setOnAction((ActionEvent event) -> {
            System.out.println("That was easy, wasn't it?");
            Zump t1 = new Zump();
            t1.octaveUp();
            // Zump.octaveUp();
        });
    }
}

您不應該在每次按下按鈕時都創建一個實例,而應該只創建一次,然后在每次按下按鈕時訪問該實例。

因此,實例的創建應該在事件處理程序之外,但是創建的實例應該對事件處理程序可用。

例如,一種方法是將實例的創建移到一個級別之外:

@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在Java 8中不是必需的,但是它仍然有助於認識到這是在匿名類/ lambda表達式內部使用的變量)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM