Мой проект JavaFX останавливает выполнение кода в EventHandler - PullRequest
0 голосов
/ 23 апреля 2020

У меня есть домашнее задание. Я работал, пока я не добавил FX к нему. Теперь появится всплывающее окно с областью заголовка и надписями, но фактическая функция кода в окне не отображается. Код перестает работать в EventHandler, и я не понимаю, почему или как это исправить. Это текстовый анализатор, который считает слова вхождения и отображает слово со счетчиком. Если кто-то может указать, где и почему код неправильный и как его исправить, я был бы признателен.

package application;
/**
 * <h1>Word Occurrences</h1>
 * The program counts the number of a times words
 * appears in the text.
 * 
 * 
 * @author 
 * @version 3.0
 * @since 4/1/2020
 */

import java.net.MalformedURLException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;

import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.geometry.Pos;
import javafx.stage.Stage;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.ButtonBase;
import javafx.scene.control.Label;
import javafx.scene.control.Labeled;
import javafx.scene.control.TextArea;
import javafx.scene.control.TextField;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.TilePane;
import javafx.scene.text.Text;
import javafx.scene.text.*;


public class TextAnalyzer extends Application {

     /**
     * Override method to produce the output     * 
     * @param s first parameter in the start method 
     * @return Output
     */
    //public TextAnalyzer() {    }

    @Override
    public void start(Stage s) {

        // title for the stage
        s.setTitle("Text Analyzer");

        // create a tile pane
        TilePane title = new TilePane();

        // create a label
        Label l = new Label("Word          :          Count");


        // Read in the file
        URLReader obj = new URLReader();

        // run
        EventHandler event = new EventHandler<ActionEvent>() {

            private Labeled TextLine;

            public void handle(ActionEvent e) {

                // variables
                String inputString = null;

                // Read in the file
                URLReader obj = new URLReader();

                // string from URLReader
                try {
                    inputString = obj.reader();
                } catch (MalformedURLException e2) {
                    // TODO Auto-generated catch block
                    e2.printStackTrace();
                    }
                // word array
                String[] wordsArray = inputString.split("\\s+");

                // mapping the array
                Map<String, Integer> map = new HashMap<>();

                String[] var10 = wordsArray;
                int var9 = wordsArray.length;
            // count words
                //for (String word : wordsArray) {
                for(int var8 = 0; var8 < var9; ++var8) {
                    String word = var10[var8];
                    if (map.containsKey(word)) {
                        int count = map.get(word);
                        map.put(word, count + 1);
                    } else {
                        map.put(word, 1);
                    }
                }

                // output

                Iterator var13 = map.entrySet().iterator();

                while(var13.hasNext()) {
                    Entry<String, Integer> entry = (Entry)var13.next();
                    this.TextLine.setText((String)entry.getKey() + " : " + entry.getValue());
                }
                /*for (Map.Entry<String, Integer> entry : map.entrySet()) {
                    TextLine.setText(entry.getKey() + " : " + entry.getValue());


                }*/

            }
        };


        title.getChildren().add(l);

        Scene scene = new Scene(title, 400, 400);

        s.setScene(scene);
        s.show();


    }

/**
 * This is the main method which produces the window and contents
 * from the start method
 * @param args
 */

    public static void main(String[] args) throws Exception {
        launch(args);
        //CreateTable();
    }
}
--------------------------------
package application;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.URL;

/**
 * This is the URL reader to read the URL into a string
 * for processing.
 * 
 * @return FileString
 * @exception IOException on input error 
 * @see IOException
 *
 */

public class URLReader {
    String fileString;

    //public URLReader() {    }

    public String reader() throws MalformedURLException {

        // create the URL
        URL file = new URL("http://shakespeare.mit.edu/macbeth/full.html");

        // Open the URL stream and create readers convert to string
        BufferedReader reader = null;
        try {
            reader = new BufferedReader(new InputStreamReader(file.openStream()));

            // write the output
            StringBuilder response = new StringBuilder();
            String inputLine;
            while ((inputLine = reader.readLine()) != null)
                response.append(inputLine);

            // close reader
            reader.close();         
            fileString = response.toString();

        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            System.out.println("error");
        }
        return fileString.toString();
    }
}

1 Ответ

0 голосов
/ 23 апреля 2020

Как указано выше, установите действие на startButton, которое необходимо создать, и после этого установите действие, как это:

startButton.setOnAction((event) -> {
     System.out.println(„Start Button pressed!“);
     // variables
     String inputString = null;

     // Read in the file
     URLReader obj = new URLReader();

     // string from URLReader
     try {
          inputString = obj.reader();
          } catch (MalformedURLException e2) {
            // TODO Auto-generated catch block
            e2.printStackTrace();
      }
      // word array
      String[] wordsArray = inputString.split("\\s+");

      // mapping the array
      Map<String, Integer> map = new HashMap<>();

      String[] var10 = wordsArray;
      int var9 = wordsArray.length;
      // count words
      //for (String word : wordsArray) {
      for(int var8 = 0; var8 < var9; ++var8) {
         String word = var10[var8];
         if (map.containsKey(word)) {
            int count = map.get(word);
            map.put(word, count + 1);
         } else {
            map.put(word, 1);
         }
       }

       // output

       Iterator var13 = map.entrySet().iterator();

       while(var13.hasNext()) {
           Entry<String, Integer> entry = (Entry)var13.next();
           System.out.println((String)entry.getKey() + " : " + 
           entry.getValue());
       }
       /*for (Map.Entry<String, Integer> entry : map.entrySet()) {
         TextLine.setText(entry.getKey() + " : " + entry.getValue());}*/

});

Кроме того, создайте / определите свой Label private Labeled TextLine; за пределами setOnAction, как вы сделали с Label l.

Чем, если вы хотите обновить текст метки TextLine, обновите его внутри setOnAction

Вот Хорошая статья о Java Обработка событий FX ссылка

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

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