Символ JavaFX не найден, ссылаясь на класс

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

Вот код:

Внешний класс

package dataget;

import java.io.*;

public class ReadWrite {

    public void ReadFileContents(String fileName) {
        try {
            BufferedReader in = new BufferedReader(new FileReader(fileName));
            int lineNumber = 0;
            int currentLine;
            String lines[];

            while (in.readLine() != null) {
                lineNumber++;
            }
            in.close();

            lines = new String[lineNumber];
            BufferedReader inLines = new BufferedReader(new FileReader(fileName));

            for (currentLine = 0; currentLine < lineNumber;) {
                lines[currentLine] = inLines.readLine();
                txtareaOutput.appendText(lines[currentLine]);
                currentLine++;
            }

            inLines.close();

            txtareaStatus.appendText("Lines in File: " + lineNumber);



        } catch (IOException ioe) {
            System.out.println("File not found!");
        }
    }

А теперь класс контроллера:

public class MainController implements Initializable {

    @FXML
    private TextField txtName;
    @FXML
    private TextField txtAge;
    @FXML
    private ComboBox comboGender;
    @FXML
    private Button btnRead;
    @FXML
    private Button btnWrite;
    @FXML
    private TextArea txtareaStatus;
    @FXML
    private TextArea txtareaOutput;

    @FXML
    public void clickRead(){
        ReadWrite read = new ReadWrite();
        read.ReadFileContents("data/dylans/data.txt");
    }
}

Я пропустил несколько строк, поскольку они не имеют значения (все они находятся в одном пакете DataGet).

И я продолжаю получать «ошибка: не могу найти символ»:

Compiling 2 source files to C:\Apps\NetBeans 7.3.1\Dylans Projects\DataGet\build\classes
C:\Apps\NetBeans 7.3.1\Dylans Projects\DataGet\src\dataget\ReadWrite.java:28:
error: cannot find symbol txtareaOutput.appendText(lines[currentLine]);
symbol: variable txtareaOutput
location: class ReadWrite
C:\Apps\NetBeans 7.3.1\Dylans Projects\DataGet\src\dataget\ReadWrite.java:34:
error: cannot find symbol txtareaStatus.appendText("Lines in File: " + lineNumber);
symbol: variable txtareaStatus
location: class ReadWrite 2 errors 

Должен ли я объявлять текстовое поле в исходном файле класса, из которого создается объект?

Спасибо.


person Dylan Benton    schedule 26.08.2013    source источник
comment
я постоянно получаю сообщение об ошибке: не могу найти символ. =› когда, как, где? При компиляции? На какой линии? и т.п.   -  person assylias    schedule 26.08.2013
comment
Это вывод Exact Error: - Компиляция 2 исходных файлов в C:\Apps\NetBeans 7.3.1\Dylan Projects\DataGet\build\classes C:\Apps\NetBeans 7.3.1\Dylan Projects\DataGet\src\dataget\ ReadWrite.java:28: ошибка: не удается найти символ txtareaOutput.appendText(lines[currentLine]); символ: переменная txtareaOutput расположение: класс ReadWrite C:\Apps\NetBeans 7.3.1\Dylan Projects\DataGet\src\dataget\ReadWrite.java:34: ошибка: не удается найти символ txtareaStatus.appendText(строки в файле: + lineNumber); символ: переменная txtareaStatus местоположение: класс ReadWrite 2 ошибки   -  person Dylan Benton    schedule 26.08.2013
comment
Пожалуйста, постарайтесь включить всю необходимую информацию непосредственно в свой вопрос. Я добавил детали.   -  person assylias    schedule 26.08.2013


Ответы (1)


Вы не можете просто получить доступ к MainController полю txtareaStatus в ReadWrite. Если вы действительно хотите это сделать (что является плохой идеей), вам необходимо:

  • сделать txtareaStatus общедоступным или предоставить общедоступный геттер.
  • создайте экземпляр MainController и получите txtareaStatus.

В качестве предложения вы должны отделить процесс получения текста от процесса обновления UI (TextArea), обратите внимание, что я читаю файл в другом потоке, чем JavaFX Thread, чтобы избежать проблем с живучестью в случае большого текстового файла. .

Во-первых, вам нужно разработать класс File Reader, который будет возвращать список строк (String)

public class TextFileReader {

        @SuppressWarnings("NestedAssignment")
        public List<String> read(File file) {
            List<String> lines = new ArrayList<String>();
            String line;
            try {
                BufferedReader br = new BufferedReader(new FileReader(file));

                while ((line = br.readLine()) != null) {
                    lines.add(line);
                }
                br.close();
            } catch (IOException ex) {
                Logger.getLogger(TextFileReader.class.getName()).log(Level.SEVERE, null, ex);
            }

            return lines;
        }

В контроллере FXML, который ссылается на TextArea и Button для его обновления:

public class ViewController implements Initializable {

        @FXML
        private TextField urlTextField;
        @FXML 

        private TextArea linesTextArea;
        private static final Logger LOG = Logger.getLogger(ViewController.class.getName());
        private Future<List<String>> future;
        private ExecutorService executorService = Executors.newSingleThreadExecutor();
        private TextFileReader reader = new TextFileReader();

        public void initialize(URL url, ResourceBundle rb) {
        }

        @FXML
        @SuppressWarnings("NestedAssignment")
        public void showFileLines() throws InterruptedException, ExecutionException {

            future = executorService.submit(new Callable<List<String>>() {
                public List<String> call() throws Exception {
                    return reader.read(new File(ViewController.this.urlTextField.getText()));
                }
            });

            List<String> lines = future.get();
                executorService.shutdownNow();
            linesTextArea.clear();
            for (String line : lines ) {
                linesTextArea.appendText(line + "\n");
            }  

        }
    }

Вы можете получить доступ к полному исходному коду в этом списке.

введите здесь описание изображения

person Salah Eddine Taouririt    schedule 26.08.2013
comment
Спасибо, я смотрю на JAVAFX всего несколько дней, так что простите мое невежество. Как я могу вывести возвращаемые строки из объекта в компоненты пользовательского интерфейса, такие как TextArea? - person Dylan Benton; 26.08.2013
comment
Инкапсуляция @DylanBenton Не рекомендуется обновлять компоненты пользовательского интерфейса в файле, отличном от контроллера, поскольку это может вызвать серьезные проблемы с задержкой (я узнал об этом на собственном опыте). Вот почему tarrsalah здесь показывает, что вы должны установить информацию в TextArea из контроллера, а не из вашего класса читателя. - person Dominic; 11.08.2016