Задать вопрос
@kb_s_fs

Как обратиться к переменным из Controller(javafx) из других классов?

Первый класс:
package sample;

import java.net.URL;
import java.util.ResourceBundle;
import javafx.fxml.FXML;
import javafx.scene.control.*;
import sample.Task1.Main;

public class Controller {

    @FXML
    private ResourceBundle resources;

    @FXML
    private URL location;

    @FXML
    private Tab mainTab = new Tab();

    @FXML
    private Tab task1 = new Tab();

    @FXML
    private TextField lineOfNumbers = new TextField();

    @FXML
    private Button addInfo1 = new Button();

    @FXML
    public static TextArea sortedNumbers = new TextArea();

    @FXML
    private Tab task2;

    @FXML
    private TextField numberOfObjects;

    @FXML
    private Button addInfo2;

    @FXML
    private TextArea resultOfMethods;

    @FXML
    private Tab task3;

    @FXML
    private TextField numberOfParcels;

    @FXML
    private TextArea resultOfParcels;

    @FXML
    private Button addInfo3;

    @FXML
    private Tab task4;

    @FXML
    private TextField numberOfWorkers;

    @FXML
    private TextField numberOfDetails;

    @FXML
    private TextArea resultOfWork;

    @FXML
    private Button addInfo4;

    @FXML
    private Button addInfo5;

    private static String[] args;
    @FXML
    void initialize() {
        addInfo1.setOnAction(e -> {
            sortedNumbers.setText("");
            args = new String[1];
            args[0] = lineOfNumbers.getText();
            Main.main(args);
        });

    }
}


Второй класс:
package sample.Task1;
import sample.Controller;

public class Main {
    static public void main(String[] args) {

        if (args[0].length() == 0) {
            Controller.sortedNumbers.appendText("You should write one parameter!");
            return;
        }

        try {
            char[] symbols = args[0].toCharArray();
            for (int i = 0; i < symbols.length; i++) {
                if (symbols[i] == ' ') {
                    Controller.sortedNumbers.appendText("You should write one parameter!");
                    return;
                }
            }
            String[] num_array = new String[symbols.length];
            boolean flag = false;
            boolean minus = false;
            int num = 0;
            int index = 0;

            for (int i = 0; i < symbols.length; i++)
                num_array[i] = "";

            for (int i = 0; i < (symbols.length - 1); i++) {
                if (((symbols[i + 1] >= '0') && (symbols[i + 1] <= '9')) && (symbols[i] == '-')) {
                    minus = true;
                }

                if (!((symbols[i + 1] >= '0') && (symbols[i + 1] <= '9')) && (symbols[i] == '-')) {
                    minus = false;
                }

                if (!((symbols[i] >= '0') && (symbols[i] <= '9')) && !(symbols[i] == '-')) {
                    minus = false;
                }

                if ((symbols[i] >= '0') && (symbols[i] <= '9') && !(minus)) {
                    flag = true;
                    num_array[index] += symbols[i];
                    if ((i == (symbols.length - 2)) && ((symbols[i + 1] >= '0') && (symbols[i + 1] <= '9'))) {
                        num = 1;
                    }
                } else {
                    if (flag) {
                        index++;
                        flag = false;
                    } else {
                        continue;
                    }
                }
            }

            index++;

            if (num == 1) {
                num_array[index - 1] += symbols[symbols.length - 1];
            } else {
                if ((symbols[symbols.length - 1] >= '0') && (symbols[symbols.length - 1] <= '9') && (minus == false)) {
                    num_array[index - 1] = "0" + symbols[symbols.length - 1];
                }
            }

            if ((index == 1) && (num_array[index - 1] == "")) {
                Controller.sortedNumbers.appendText("There aren't non-positive numbers!\n");
                return;
            }

            if ((index == 2) && (num_array[index - 1] == "")) {
                index--;
            }

            if (num_array[index - 1] == "") {
                index--;
            }
            int numbers[] = new int[index];

            for (int i = 0; i < index; i++) {
                numbers[i] = Integer.parseInt(num_array[i]);
            }

            int temp;
            for (int i = 0; i < index; i++) {
                for (int j = 0; j < index; j++)
                    if (numbers[i] < numbers[j]) {
                        temp = numbers[i];
                        numbers[i] = numbers[j];
                        numbers[j] = temp;
                    }
            }

            //Controller.sortedNumbers.appendText("String as the paramater - " + args[0] + "\n");

            Controller.sortedNumbers.appendText("Numbers founded in this string: \n");
            for (int i = 0; i < index; i++) {
                System.out.println(((i + 1) + ": " + num_array[i]) + "\n");
            }


            Controller.sortedNumbers.appendText("Sorted numbers: \n");
            for (int i = 0; i < index; i++) {
                Controller.sortedNumbers.appendText(((i + 1) + ": " + numbers[i]) + "\n");
            }

        }
        catch(NumberFormatException err) {
            Controller.sortedNumbers.appendText("NumberFormatException: " + err.getMessage());
        }
    }
}

Если я вывожу данные в sortedNumbers, ничего не получается. Если вывожу в консоли, то все работает. Как мне сделать так, чтобы выводилось в TextArea(то есть в sortedNumbers)?
  • Вопрос задан
  • 889 просмотров
Подписаться 1 Средний Комментировать
Пригласить эксперта
Ответы на вопрос 1
notAquarius
@notAquarius
3 метра под уровнем грунта
Идея проста, ты должен получить экземпляр класса Controller

FXMLLoader fxmlLoader = new FXMLLoader(бла бла бла бла);
Controller controller = (Controller) fxmlLoader.getController();


Ведь твой контроллер - это по сути обычный класс, плюс он работает в другом потоке.
Теперь у тебя есть объект класса Controller
Далее в контроллере создай метод, который отвечает за то, чтобы изменять твой TextArea;
(имя метода может быть любое)

public void setTextInTextArea(String string){
//Далее ты можешь вызывать этот метод, но т.к. он вызывается из другого потока , в твоем //
//случае главного , ты должен написать так:
Platform.runLater(()->{
//Здесь уже изменяй свой TextArea
});}


Это ты уже меняешь текст в TextArea из своего метода Main
contrloller.setTextInTextArea("Твой текст");

@FXML
private TextField lineOfNumbers = new TextField();

@FXML
private Button addInfo1 = new Button();

@FXML
public static TextArea sortedNumbers = new TextArea();

Это не правильно!

@FXML
private TextField lineOfNumbers ;

@FXML
private Button addInfo1 ;

@FXML
public TextArea sortedNumbers;

Это правильно!

Эти переменные уже неявно проинициализированы, тебе не нужно их инициализировать, нужно лишь объявить, не нужно вешать Static на них -это плохо и некрасиво и вообще фу..

UPD: Я мог допустить синтаксические ошибки кода, поэтому Sorry, под рукой нет Пк, пишу в дороге. Ну и не переписывай код бездумно, а попробуй вникнуть в суть. Прочитай про многопоточность в JavaFx, как работает FXMLLoader, про @FXML переменные в контроллере. Удачи.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы