Символът 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
Това е точният резултат за грешка: - Компилиране на 2 изходни файла в 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: грешка: не може да се намери символ txtareaOutput.appendText(редове[currentLine]); символ: променлива txtareaOutput местоположение: клас ReadWrite C:\Apps\NetBeans 7.3.1\Dylans Projects\DataGet\src\dataget\ReadWrite.java:34: грешка: не може да се намери символ txtareaStatus.appendText(Редове във файл: + номер на ред); символ: променлива 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, за да избегна проблеми с живостта в случай на голям текстов файл .

Първо, трябва да проектирате клас Четец на файлове, който ще върне списък с редове (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
Encapsulation @DylanBenton Лоша практика е да актуализирате компоненти на потребителския интерфейс във файл, различен от контролера, тъй като може да причини някои масивни проблеми със забавяне (научих това от опит). Ето защо tarrsalah тук ви показва да зададете информацията в TextArea от контролера, а не от вашия клас читател. - person Dominic; 11.08.2016