0

这可能是一个愚蠢的问题,但是当我运行程序时,我试图通过控制器从我的新 Gui 访问一个文本区域,该控制器使用它自己的类(尽管它们很简单),但它会出现未定义的符号。我不确定我哪里出错了。

这是代码:

外部类

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 

我是否必须在创建对象的原始类文件中声明文本区域?

谢谢。

4

1 回答 1

0

您不能简单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引用TextAreaButton更新它的控制器中:

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");
            }  

        }
    }

您可以在此gist中访问完整的源代码。

在此处输入图像描述

于 2013-08-26T10:25:47.323 回答