0

スキャナーに問題があります。ボタンをクリックすると、2 番目のファイルのテキストが表示されます。ボタンは機能しましたが、プログラムは新しいテキストファイルの最後の行に直接スキップします。ロード時間が遅いため、最初のスキャナーを閉じることができないためだと思います。一度に 1 つずつ読み込まれるテキスト ファイルがたくさんあるので、私のレイアウトはそれほど重要ではないと思いますが、2 番目のクラスを内部クラスとして記述すると、事態がさら​​に複雑になるようです。

2 番目のクラスのスキャナを最初のクラスからアクセスできるようにするにはどうすればよいですか (つまり、 を使用しますreader.close())。プログラムを起動するためにネストされた/内部クラスを使用する必要がありますか? プログラムを開始し、その後のアクションのためにスキャナーを準備するためのよりクリーンな方法はありますか?

最後に、私は SSCCE に準拠しようとしてきましたが、近いですか? ご協力いただきありがとうございます

import declarations
public class MihatteFrame extends JFrame implements ActionListener{
....
public MihatteFrame() {
    area
    textfield
    button  
}
displayText method
checkTextFieldText method

public void actionPerformed(ActionEvent e) {
    try {
        if (textField.getText().equals("proceed to the entrance")) {
            Scanner.close();
            Scanner reader2 = new Scanner(new File("(Start) Front Gate.txt"));
            while (reader2.hasNextLine()) {
                String line = reader2.nextLine();
                displayText(line);
                try {
                    if(!line.trim().equals("")){
                                Thread.sleep(1000);
                        }
                    } catch (InterruptedException e) {
                    }   
            }
        } else {
            while (textField.getText() == null) {
                displayText("I`m sorry, could you say that again?");
            }
        }
    } catch (IOException ioe) {
    }
}

バツ

import declarations
class ShowIntro {
public static void main(String args[]) throws IOException {
MihatteFrame mf = new MihatteFrame();
Scanner reader = new Scanner(new File("(Start) Introduction.txt"));

while (reader.hasNextLine()) {
    String line = reader.nextLine();
    mf.displayText(line);
    try {
        if(!line.trim().equals("")){
        Thread.sleep(1000);
            }
    } catch (InterruptedException e) {
    }       
}
4

1 に答える 1

2

GUI スレッドは、呼び出されたイベントから戻ったときにのみアクションを実行します。これは、多くのアクションを実行すると、これらのアクションの累積のみが表示され、何らかの理由で一時停止すると、GUI が一時停止することを意味します。

GUI スレッドが画面を更新できるように、別のスレッドでアクションを実行する必要があります。SwingUtils.invokeLater() を使用して、2 番目のスレッドから GUI を更新する必要もあります。

于 2013-01-14T10:30:41.723 に答える