Не удается получить доступ к кнопке / текстовой области в событии дескриптора - PullRequest
0 голосов
/ 05 апреля 2019

Я только начал использовать JavaFX и пытался добавить событие, которое добавит текст в текстовую область и очистит текстовое поле при нажатии кнопки «Отправить». Однако я не могу проверить источник события в методе handle.

Я пытался найти решение, но другие, похоже, не сталкивались с той же проблемой - либо это, либо я упускаю что-то очевидное.

import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Menu;
import javafx.scene.control.MenuBar;
import javafx.scene.control.TextArea;
import javafx.scene.control.TextField;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.HBox;
import javafx.scene.layout.Priority;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;

public class ApplicationMain extends Application implements EventHandler<ActionEvent>{

    Stage window;

    // Main Method
    public static void main(String[] args) {
        launch(args);
    }

    // Scene Method
    @SuppressWarnings("static-access")
    @Override
    public void start(Stage primaryStage) {

        // Window Stuff
        window = primaryStage;
        window.setTitle("Chat Application");

        // Setup Grid Layout
        GridPane grid = new GridPane();
        grid.setAlignment(Pos.TOP_LEFT);
        grid.setHgap(10);
        grid.setStyle("-fx-background-color: #272828;");

        // MenuBar
        MenuBar menu = new MenuBar();

        menu.setPrefWidth(1000);
        menu.setPrefHeight(20);

        // Creation of File + Help
        Menu file = new Menu("File");
        Menu help = new Menu("Help");

        // Add the Menus to the MenuBar
        menu.getMenus().add(file);
        menu.getMenus().add(help);

        // Add MenuBar to Scene
        menu.setVisible(true);
        grid.add(menu, 0, 0);

        // Text Area Stuff
        TextArea area = new TextArea();

        area.setPrefWidth(1000);
        area.setPrefHeight(700);
        area.setEditable(false);
        area.setStyle("-fx-control-inner-background: #313233;");

        // Add Text Area to Grid
        grid.add(area, 0, 1);

        // Text Field
        TextField enter = new TextField();

        enter.setPromptText("Type here...");
        enter.setMaxWidth(920);
        enter.setMaxHeight(30);
        enter.setStyle("-fx-padding: 5px;");

        // Button
        Button send = new Button("Send!");

        // Set the Handler for the Send Button Event
        send.setOnAction(this);

        // Use of HBox to Space out Text Field & Send Button
        HBox row = new HBox();

        row.setSpacing(10);
        row.setHgrow(enter, Priority.ALWAYS);
        row.getChildren().addAll(enter, send);

        // Use of VBox to Space out Text Field
        VBox box = new VBox();
        box.setSpacing(10);
        box.setPadding(new Insets(10));
        box.getChildren().add(row);

        // Add HBox in VBox to Grid
        grid.add(box, 0, 2);

        // Scene Stuff
        Scene scene = new Scene(grid, 1000, 750);
        window.setScene(scene);

        // Display the Window
        window.show();
    }

    // Event Handler
    @Override
    public void handle(ActionEvent event) {

        if (event.getSource() == send) {

        }
    }
}

Всякий раз, когда я пытаюсь проверить, была ли источником кнопка «Отправить», она не отображается - как если бы она была недоступна методом. Я не уверен, как это исправить.

Ответы [ 2 ]

3 голосов
/ 05 апреля 2019

В этом коде есть несколько ошибок, но мы можем это исправить без проблем.

Сначала изучите соглашения об именах и придерживайтесь их, как @kleopatra говорит, что если вы используете соглашения об именах Google, вы будете перегружены многими результатами, прочитайте несколько

Далее вам не следует вызывать Stage a window, уже есть другой объект с таким именем, поэтому он может сбить с толку других, но если это только для вас, то все в порядке, я думаю

Я бы не стал @SuppressWarnings("static-access"), как вы сделали, если бы вы исправили ошибку, не игнорируйте ее

send.setOnAction(this); - это не способ обработки событий. Удалите implements EventHandler<ActionEvent>. Вы можете использовать обработчик событий, установив его так:

send.setOnAction(event -> sendToTextArea(enter.getText(), area));

И вот как должен вызываться метод, который вы вызываете

private void sendToTextArea(String string, TextArea textArea){
    //textArea.setText(string);Use setText if you want to set the whole area to something
    textArea.appendText(string+"\n");//Use appendText to append add new line because chat app
}

Здесь все хорошо выглядит, вот как должен выглядеть ваш конечный продукт

public class Main extends Application {

    private Stage stage;

    @Override
    public void start(Stage primaryStage) {
        // stage Stuff
        stage = primaryStage;
        stage.setTitle("Chat Application");

        // Setup Grid Layout
        GridPane grid = new GridPane();
        grid.setAlignment(Pos.TOP_LEFT);
        grid.setHgap(10);
        grid.setStyle("-fx-background-color: #272828;");

        // MenuBar
        MenuBar menu = new MenuBar();

        menu.setPrefWidth(1000);
        menu.setPrefHeight(20);

        // Creation of File + Help
        Menu file = new Menu("File");
        Menu help = new Menu("Help");

        // Add the Menus to the MenuBar
        menu.getMenus().add(file);
        menu.getMenus().add(help);

        // Add MenuBar to Scene
        menu.setVisible(true);
        grid.add(menu, 0, 0);

        // Text Area Stuff
        TextArea area = new TextArea();

        area.setPrefWidth(1000);
        area.setPrefHeight(700);
        area.setEditable(false);
        area.setStyle("-fx-control-inner-background: #313233;");

        // Add Text Area to Grid
        grid.add(area, 0, 1);

        // Text Field
        TextField enter = new TextField();

        enter.setPromptText("Type here...");
        enter.setMaxWidth(920);
        enter.setMaxHeight(30);
        enter.setStyle("-fx-padding: 5px;");

        // Button
        Button send = new Button("Send!");

        // Set the Handler for the Send Button Event
        send.setOnAction(event -> sendToTextArea(enter, area));

        // Use of HBox to Space out Text Field & Send Button
        HBox row = new HBox();

        row.setSpacing(10);
        row.setHgrow(enter, Priority.ALWAYS);
        row.getChildren().addAll(enter, send);

        // Use of VBox to Space out Text Field
        VBox box = new VBox();
        box.setSpacing(10);
        box.setPadding(new Insets(10));
        box.getChildren().add(row);

        // Add HBox in VBox to Grid
        grid.add(box, 0, 2);

        // Scene Stuff
        Scene scene = new Scene(grid, 1000, 750);
        stage.setScene(scene);

        // Display the stage
        stage.show();
    }

    private void sendToTextArea(TextField textField, TextArea textArea){
        //textArea.setText(string);Use setText if you want to set the whole area to something
        //textArea.clear();and .clear to clear all text from the TextArea
        textArea.appendText(textField.getText()+"\n");//Use appendText to append add new line because chat app
        textField.clear();
    }

    public static void main(String[] args) { launch(args); }
}
0 голосов
/ 05 апреля 2019

Сделайте ваши TextArea и TextField переменные класса:

private TextArea area;
private TextField enter;

Измените их инициализацию:

// Text Area Stuff
area = new TextArea();
// Text Field
enter = new TextField();

И ваш обработчик событий:

// Event Handler
@Override
public void handle(ActionEvent event) {
    area.setText(enter.getText());
}

Если какое-либо из этих изменений неясно, не стесняйтесь спрашивать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...