2

テストファイルから名前を読み取る次のコードがあり、正常に動作します

public class Names {

    Scanner scan;
    static String Firstname;
    static String Surname;
    static String Fullname;

    public void OpenFile()
    {
        try
        {
            scan = new Scanner(new File("test.txt"));
            System.out.println("File found!");
        }

        catch(Exception e)
        {
            System.out.println("File not found");
        }
    }

    public void ReadFile()
    {
        while(scan.hasNext())
        {
            Firstname = scan.next();
            Surname = scan.next();
            Fullname =  Firstname + " " + Surname;

            System.out.println(Fullname);
        }
    }

    public void CloseFile()
    {
        scan.close();
    }
}

次に、Names クラスを呼び出すこのメイン クラスがあります。テストファイルの姓のみを表示することを除けば、問題なく動作します。

public class NameSwing implements ActionListener {

    private JTextArea tf = new JTextArea(20,20);
    private JFrame f = new JFrame("names");
    private JButton b = new JButton("view");

    static String fullName;

    public NameSwing(){
        f.add(new JLabel("Name"));
        tf.setEditable(true);
        f.add(tf);

        b.addActionListener(this);
        f.add(b);

        f.setLayout(new FlowLayout());
        f.setSize(300,100);
        f.setVisible(true);

    }

    @Override
    public void actionPerformed(ActionEvent e)
    {
        if(e.getSource()==b)
        {
            tf.setText(fullName);
        }
    }       

    public static void main(String[] args) throws FileNotFoundException, IOException {
        NameSwing nameSwing = new NameSwing();

        Names t = new Names();
        t.OpenFile();
        t.ReadFile();
        t.CloseFile();

        fullName = Names.Fullname;   
    }

}

これはテスト ファイルの内容です。

ニック・ハリス

オリー・ディーン

エマ・サモンズ

ヘンリー・ブラックウェル

姓だけでなく、リーダーからのすべての名前を表示するようにテキストエリアを取得するにはどうすればよいですか?

4

4 に答える 4

4

Names クラスはあまり役に立たず、静的フィールドを使いすぎて不利益になるため、破棄します。私の考えでは、最善の解決策は次のとおりです。

  • テキストファイルを保持するファイルを作成します
  • このファイルで FileReader オブジェクトを作成します
  • これを使用して BufferedReader オブジェクトを作成します
  • read(...)BufferedReader を渡して JTextArea のメソッドを呼び出す
  • そして、あなたの完了。

つまり、実行中:

BufferedRead buffReader = null;
try {
  File file = new File("test.txt");
  FileReader fileReader = new FileReader(file);
  buffReader = new BufferedReader(fileReader);
  tf.read(buffReader, "file.txt");
}  catch (WhateverExceptionsNeedToBeCaught e) {
  e.printStackTrace();
} finally {
  // close your BufferedReader
}
于 2012-12-08T13:47:29.953 に答える
2
  • 正当な理由もなく、あまりにも多くの静的フィールドを使用しています。クラスをファクトリ クラスにする場合は、常に静的フィールドを使用しますが、この場合は適切ではありません。
  • public Access Specifier各メソッドに, を必要とせずに提供することで、カプセル化の基本的なルールを破っています。
  • を呼び出す代わりにsetSize()、単純pack()に を使用できます。これにより、指定した任意の値よりもはるかに優れた方法でコンテナの寸法を決定できます。
  • Concurrency in Swingについて読んでください。あなたの知識はその面で少し不足しているようです。
  • Java命名規則を学んでください。
  • さらに、単純にStringBuilderクラスを使用して、このことを行うことができます。あなたの変更されたコードを見てください。わからないことは何でもお尋ねください。喜んでお手伝いさせていただきます。

変更されたコード:

import java.io.*;
import java.util.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class NameSwing implements ActionListener {

    private Names t;
    private JTextArea tf = new JTextArea(20,20);
    private JFrame f = new JFrame("names");
    private JButton b = new JButton("view");

    public NameSwing(){

        performFileRelatedTask();
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JPanel contentPane = new JPanel();
        contentPane.setLayout(new BorderLayout(5, 5));

        JScrollPane scroller = new JScrollPane();
        scroller.setBorder(BorderFactory.createLineBorder(Color.BLUE.darker(), 5));

        JPanel centerPanel = new JPanel();
        centerPanel.setLayout(new BorderLayout(5, 5));
        centerPanel.add(new JLabel("Name", JLabel.CENTER), BorderLayout.PAGE_START);        
        tf.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
        tf.setEditable(true);
        centerPanel.add(tf, BorderLayout.CENTER);
        scroller.setViewportView(centerPanel);

        JPanel footerPanel = new JPanel();
        b.addActionListener(this);
        footerPanel.add(b);

        contentPane.add(scroller, BorderLayout.CENTER);
        contentPane.add(footerPanel, BorderLayout.PAGE_END);

        f.setContentPane(contentPane);
        f.pack();
        f.setLocationByPlatform(true);
        f.setVisible(true);
    }

    private void performFileRelatedTask()
    {
        t = new Names();
    }

    @Override
    public void actionPerformed(ActionEvent e)
    {
        if(e.getSource()==b)
        {
            tf.setText(t.getFullNames().toString());
        }
    }       

    public static void main(String[] args) throws FileNotFoundException, IOException {

        SwingUtilities.invokeLater(new Runnable()
        {
            @Override
            public void run()
            {
                new NameSwing();
            }
        });                
    }

}

class Names {

    private Scanner scan;
    private String firstname;
    private String surname;
    private StringBuilder fullnames;

    public Names()
    {
        fullnames = new StringBuilder();
        openFile();
        readFile();
        closeFile();
    }

    public StringBuilder getFullNames()
    {
        return fullnames;
    }

    private void openFile()
    {
        try
        {
            scan = new Scanner(new File("test.txt"));
            System.out.println("File found!");
        }

        catch(Exception e)
        {
            System.out.println("File not found");
        }
    }

    private void readFile()
    {
        while(scan.hasNext())
        {
            firstname = scan.next();
            surname = scan.next();
            fullnames.append(firstname + " " + surname + "\n");
        }
    }

    private void closeFile()
    {
        scan.close();
    }
}
于 2012-12-08T16:07:52.157 に答える
1

ここで変更が必要です

 while(scan.hasNext())
        {
            Firstname = scan.next();
            Surname = scan.next();
            //Assigning each time instead of append
            Fullname =  Firstname + " " + Surname;
        }

完全な修正は次のとおりです。

public class NameSwing implements ActionListener {

    private JTextArea textArea = new JTextArea(20, 20);
    private JFrame frame = new JFrame("Names");
    private JButton btnView = new JButton("View");
    private Scanner scanner;
    private String firstName;
    private String surName;
    private String fullName;

    public NameSwing() {
        frame.add(new JLabel("Name"));
        textArea.setEditable(true);
        frame.add(textArea);

        btnView.addActionListener(this);
        frame.add(btnView);

        frame.setLayout(new FlowLayout());
        frame.setSize(300, 100);
        frame.setVisible(true);

    }

    public void OpenFile() {
        try {
            scanner = new Scanner(new File("test.txt"));
            System.out.println("File found!");
        } catch (Exception e) {
            System.out.println("File not found");
        }
    }

    public void ReadFile() {
        while (scanner.hasNext()) {
            firstName = scanner.next();
            surName = scanner.next();
            // assign first time
            if( fullName == null ) {
                fullName = firstName + " " + surName;
            } else {
                fullName = fullName + "\n" + firstName + " " + surName;
            }

            System.out.println(fullName);
        }
    }

    public void CloseFile() {
        scanner.close();
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        if (e.getSource() == btnView) {
            textArea.setText(fullName);
        }
    }

    public static void main(String[] args) throws FileNotFoundException, IOException {
        NameSwing nameSwing = new NameSwing();
        nameSwing.OpenFile();
        nameSwing.ReadFile();
        nameSwing.CloseFile();
    }
}
于 2012-12-08T13:51:05.260 に答える
1

問題はラインにあります

Fullname = Firstname + " " + Surname;.

成功する

Fullname += Firstname + " " + Surname; + "\n"

あなたの問題は解決されました:)

于 2012-12-08T13:56:33.343 に答える