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 ReaderStringクラスを設計する必要があります ( )

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

および aを参照して更新するコントローラー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 に答える