-2

以下のプログラムは、テキスト ファイルから整数の入力を取得し、XY グラフをプロットするために使用されます。私は JFileChooser を使用してファイルを選択しました。ファイルの完全なパスを取得しようとしています。ボタンの ActionListener メソッドを作成しました。実行すると、次のメッセージが表示されます。

Exception in thread "main" java.lang.NullPointerException
at java.io.File.<init>(Unknown Source)
at pia.main(pia.java:34)
import java.awt.event.ActionEvent;
import java.awt.event.*;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JPanel;
import org.jfree.chart.*;
import org.jfree.chart.plot.*;
import org.jfree.data.xy.*;

public class Pio {

    public static void main(String[] args) throws IOException {
        JButton but = new JButton("Open file");
        String URL = null;
        but.addActionListener(new ActionListerner()                         

    {

            public void actionPerformed(ActionEvent e) {

           JFileChooser chooser = new JFileChooser();

            int ret = chooser.showDialog(null, "Open file");

            if (ret == JFileChooser.APPROVE_OPTION) {

              File file = chooser.getSelectedFile();

             String URL = file.getPath();

          }

     });

        File f = new File(URL);
        FileReader inputF = new FileReader(f);
        BufferedReader in = new BufferedReader(inputF);

        int[] a = new int[100];
        int[] b = new int[100];
        String s = in.readLine();

        int i = 0;

        while (s != null && i < 100) { // your arrays can only hold 1000 ints
            String pair[] = s.split(" ");

            a[i] = Integer.parseInt(pair[0]);
            b[i] = Integer.parseInt(pair[1]);
            i++; // don't forget to increment

            s = in.readLine();
        }

        in.close();
        System.out.println("the output of the file is " + f);

        XYSeries data = new XYSeries("Line Graph");
        int n = a.length;

        for (int j = 0; j < n; j++) {
            data.add(a[j], b[j]);
        }

        XYDataset xY = new XYSeriesCollection(data);
        JFreeChart chart = ChartFactory.createXYLineChart("line graph", "Cycles", "Temperature", xY, PlotOrientation.VERTICAL, true, true, true);
        ChartFrame frame = new ChartFrame("Example", chart);

        JPanel panel = new JPanel();
        panel.add(but);
        frame.add(panel);
        frame.setSize(1000, 500);
        frame.setVisible(true);
    }
}
4

2 に答える 2

3

次のように、スコープがクラス全体に及ぶようにクラスフィールドを定義します。

private String filePath;

// ...

public void actionPerformed(ActionEvent e)
{
    JFileChooser chooser=new JFileChooser();
    int ret = chooser.showDialog(null, "Open file");
    if(ret == JFileChooser.APPROVE_OPTION)
    {
        File file = chooser.getSelectedFile();
        filePath = file.getPath();
    }
}

これで、次のように使用できます。

if(filePath != null) System.out.println("The file path: " + filePath);
else System.out.println("The file path is not set yet!");
于 2012-06-08T12:31:26.473 に答える
0

String URLの範囲外で宣言する必要がありActionListenerます。

于 2012-06-08T12:29:49.807 に答える