【问题标题】:JavaFX Symbol not found, referring from class未找到 JavaFX 符号,来自类
【发布时间】:2013-08-28 19:09:10
【问题描述】:

这可能是一个愚蠢的问题,但我试图通过控制器从我的新 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 

我必须在创建对象的原始类文件中声明 textarea 吗?

谢谢。

【问题讨论】:

  • “我不断收到“错误:找不到符号”。” => 何时、如何、在哪里?编译的时候?在哪条线上?等
  • 这是确切的错误输出:- 将 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(lines[currentLine]);符号:变量 txtarea 输出位置:类 ReadWrite C:\Apps\NetBeans 7.3.1\Dylans Projects\DataGet\src\dataget\ReadWrite.java:34:错误:找不到符号 txtareaStatus.appendText("文件中的行:" + lineNumber );符号:变量 txtareaStatus 位置:类 ReadWrite 2 错误
  • 请尝试在您的问题中直接包含所有相关信息。我已经添加了详细信息。

标签: java class javafx symbols


【解决方案1】:

您不能简单地访问ReadWrite 中的MainController 字段txtareaStatus。 如果您真的想这样做(这是一个坏主意),您必须:

  • txtareaStatus 公开,或提供公开的getter。
  • 实例化 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 中访问完整的源代码。

【讨论】:

  • 谢谢,我只关注 JAVAFX 几天,请原谅我的无知。如何将对象返回的字符串输出到 UI 组件,例如 TextArea?
  • 封装 @DylanBenton 在控制器以外的文件中更新 UI 组件是一种不好的做法,因为它可能会导致一些严重的延迟问题(我从经验中学到了这一点)。这就是为什么 tarrsalah 在这里向您展示如何从 Controller 而不是您的阅读器类中设置 TextArea 中的信息。
猜你喜欢
  • 1970-01-01
  • 2011-03-05
  • 2021-11-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-01
  • 1970-01-01
  • 2016-08-05
相关资源
最近更新 更多