JavaFX - Как динамически изменять GUI на входе MIDI? - PullRequest
0 голосов
/ 11 марта 2019

Я пытаюсь создать приложение, в котором таймер запускается при нажатии определенной клавиши на моем DJ MIDI-контроллере.

Для этого я реализовал класс Receiver следующим образом:

public class MidiInputReceiver implements Receiver {
    public String name;
    public static ArrayList<byte[]> midiMessageArrayList = new ArrayList<>();
    public String deckA = "";
    public String deckB = "";
    boolean checkFirstTime = true;

    public MidiInputReceiver(String name) {
        this.name = name;
    }

    @Override
    public void send(MidiMessage msg, long timeStamp) {
        if (checkFirstTime == true) {
            Properties mainProperties = new Properties();
            FileInputStream fileInStream;
            String path = "./properties/midi_keys.properties";
            try {
                File file = new File("./properties/midi_keys.properties");
                if (file.exists() == true) {
                    fileInStream = new FileInputStream(file);
                    mainProperties.load(fileInStream);
                    fileInStream.close();
                    deckA = mainProperties.getProperty("KEY_A_DECK");
                    deckB = mainProperties.getProperty("KEY_B_DECK");
                    checkFirstTime = false;
                }
            } 
            catch (FileNotFoundException  ex) {
                ex.printStackTrace();
            } 
            catch (IOException ex) {
                ex.printStackTrace();
            }
        }

        byte[] aMsg = msg.getMessage();
        midiMessageArrayList.add(aMsg);

        if (!deckA.equals("") && !deckB.equals("")) {
            int msgKey = aMsg[1];
            int msgAction = aMsg[2];
            if(msgKey == Integer.parseInt(deckA) && msgAction == 127) {
                MainFXMLController.HandleTimer();     
            }
        }         
    }

    public static ArrayList getArrayMessage() {
        return midiMessageArrayList;
    }

    @Override
    public void close() {}
}

Но когда я пытаюсь вызвать метод HandleTimer (), который находится в классе MainFXMLController (класс, который управляет основным графическим интерфейсом и таймером), я получаю сообщение об ошибке, потому что «нестатический метод HandleTimer () не можетбыть ссылкой из статического контекста ".

Можно ли каким-либо образом вызвать метод HandleTimer () и запустить таймер, не создавая новый экземпляр класса MainFXMLController?

Спасибо всем заранее!

...