Nano Hash - криптовалюты, майнинг, программирование

fxml: Как обрабатывать действие кнопки в контроллере?

У меня есть минимальный пример: контроллер, основной файл fxml с одной кнопкой и двумя текстовыми областями, один ввод, другой вывод. Когда кнопка нажата, ввод печатается на выходе. Когда я вставляю действие кнопки внутри fxml (onAction="#printOutput"), все работает нормально. Я хочу знать, как (и почему бы и нет) я могу выполнить то же самое действие в контроллере БЕЗ необходимости иметь дело с fxml. Примечание. Я исхожу из Android, где я избегаю реализации того же в xml, поскольку его очень сложно отлаживать, а также он не обеспечивает гибкости. Файлы следующие:

Контроллер

public class FxFXMLController {
    @FXML private TextField inputText;
    @FXML private TextArea outputText;
    @FXML private Button okBtn;

    //Do I connect here an okBtn.setAction() with printOutput? if not, where?
    public FxFXMLController() {
        // Nothing
    }

    @FXML
    private void printOutput() {
        // insert this into outputText in fxml file: onAction="#printOutput"
        outputText.setText(inputText.getText());
    }
}

Главная

public class FxFXMLExample3 extends Application {
    public static void main(String[] args) {
        Application.launch(args);
    }

    @Override
    public void start(Stage stage) throws IOException {
        FXMLLoader loader = new FXMLLoader();
        VBox root = (VBox) loader.load((getClass().getResource("FxFXMLExample3.fxml")));
        Scene scene = new Scene(root);
        stage.setScene(scene);
        stage.setTitle("A FXML Example with a Controller");
        stage.show();
    }
}

FXML

<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>

<VBox fx:id="vbox" layoutX="10.0" layoutY="10.0" prefHeight="250.0" prefWidth="300.0" spacing="10" xmlns="http://javafx.com/javafx/10.0.2-internal" xmlns:fx="http://javafx.com/fxml/1" fx:controller="sample.FxFXMLController">
    <style>
        -fx-padding: 10;
        -fx-border-style: solid inside;
        -fx-border-width: 2;
        -fx-border-insets: 5;
        -fx-border-radius: 5;
        -fx-border-color: blue;
    </style>

    <Label fx:id="inputLbl" alignment="CENTER_LEFT" cache="true" cacheHint="SCALE" prefHeight="30.0" prefWidth="200.0" text="Please insert Your Input here:" textAlignment="LEFT" />
    <TextField fx:id="inputText" prefWidth="100.0" />
    <Button fx:id="okBtn" alignment="CENTER_RIGHT" contentDisplay="CENTER" mnemonicParsing="false" text="OK" textAlignment="CENTER" />
    <Label fx:id="outputLbl" alignment="CENTER_LEFT" cache="true" cacheHint="SCALE" prefHeight="30.0" prefWidth="200.0" text="Your Input:" textAlignment="LEFT" />
    <TextArea fx:id="outputText" prefHeight="100.0" prefWidth="200.0" wrapText="true" />
</VBox>
17.12.2019

  • Вы можете использовать метод Initialize method. С внутренней стороны сделайте okBtn.setOnaction(t->{outputText.setText(inputText.getText());}); 17.12.2019
  • Спасибо, понял. Философский вопрос: каковы плюсы и минусы работы с элементами графического интерфейса в контроллере и в основном? 17.12.2019
  • Что главное? Если это класс приложения, то минусы работы с элементами графического интерфейса заключаются в том, что у вас нет легкого доступа к ним; контроллер дает вам прямой доступ ко всем необходимым элементам графического интерфейса. 17.12.2019

Ответы:


1

Вы можете использовать функцию инициализации, чтобы зарегистрировать новый прослушиватель событий на своей кнопке, а затем делать в этом прослушивателе все, что хотите. Это код:

public class FxFXMLController {
    @FXML private TextField inputText;
    @FXML private TextArea outputText;
    @FXML private Button okBtn;

    @FXML
    public void initialize() {
       okBtn.setOnAction(event -> {
        this.printOutput();
      });
    }

    public FxFXMLController() {
        // Nothing
    }

    @FXML
    private void printOutput() {
        // insert this into outputText in fxml file: onAction="#printOutput"
        outputText.setText(inputText.getText());
    }
}
17.12.2019
  • Я бы удалил @FXML в методе printOutput. 17.12.2019
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..