使用图形2d的饼图在使用数组时遇到问题

时间:2015-09-22 23:20:53

标签: java

import javax.swing.*;

public class Main {

public static void main(String[] args) throws FileNotFoundException {
    File file = new File(args[0]);
    Scanner input = new Scanner(file);
    int i = 0;
    String names[] = null;
    int slices[] = {};
    while (input.hasNext()) {
            names[i] = input.next();
            slices[i] = input.nextInt();
            i++;
        }
    JFrame f = new JFrame("Pie chart");
    f.setSize(600, 350);
    f.setDefaultCloseOperation(
        JFrame.EXIT_ON_CLOSE);
        f.add(new PieChart());
        f.setVisible(true);     
}
}

这是我的第二个档案......

import java.awt.*;
import javax.swing.*;

public class PieChart
extends JComponent {

public void paintComponent(Graphics g) {
    Graphics2D g2 = (Graphics2D) g.create();
    Graphics2D g3 = (Graphics2D) g.create();
    g3.setColor(Color.BLACK);
    g2.setColor(Color.BLUE);
    for (int i = 0; i < 5; i = i + 1) {
        g2.fillRect(230, 20 * i + 50 , 20, 20); 
        g3.drawString("swallow", 255, 20 * i + 65); 
        g3.drawString("37.0%", 385, 20 * i + 65);           
    }
    g2.fillArc(50, 50, 150, 150, 0, 360);       
}   
}

我试图从一个文本文件读取到两个单独的数组。我想要一个数组来保存名称,然后一个数组来保存值。然后,我希望能够从第二个文件中访问数组中的值。我目前的问题是它不接受input.next();进入名称[]和切片[]的数组。我该如何解决这个问题?

以下是示例文本文件:

swallow 10
magpie 5
fairywren 7
osprey 2
fantail 3    

3 个答案:

答案 0 :(得分:0)

  

我目前的问题是它不接受input.next();进入名称[]和切片[]的数组。我该如何解决这个问题?

while (input.hasNext()) {应该是while (input.hasNextLine()) {

然后,您可能需要使用input.nextLine()来获取实际文本,并使用第二个Scanner来解析单个行

  

我试图从一个文本文件读取到两个单独的数组。我想要一个数组来保存名称,然后一个数组来保存值。然后,我希望能够从第二个文件中访问数组中的值。

您应该将数组传递给PieChart类,可能是通过构造函数。

在进行任何自定义绘画之前,您还应该调用super.paintComponent

  

它给了我一个NullPointerException错误,它说它在第16行是“names [i] = input.next();”

names永远不会被初始化(null)...

String names[] = null;
int slices[] = {};

阵列不是动态的,所以除非事先知道有多少行,否则管理员并不是特别容易。

在你的情况下,假设文件没有改变,你可以使用类似......

的东西
String names[] = new String[5];
int slices[] = new int[5];

另一种选择是使用某种ListMap,它们是动态的,所以你不需要知道手头可能需要多少元素。

有关详细信息,请参阅Collections Trail

答案 1 :(得分:0)

如果你知道在开始添加项目大小之前你应该使用数组(例如,它将有20个索引)。在这里,似乎你直到运行时才知道。因此,数组不是最好的数据结构。请考虑使用array list

ArrayList<String> names = new ArrayList()<String>;
while(...){
   names.add(input.nextLine());
}
System.out.print(names.get(3)) //prints the 4th name

答案 2 :(得分:0)

String names[] = null;

您需要先为name指定一个非空数组,然后才能为其元素赋值;否则你会得到你观察到的NullPointerException

但是,您不知道需要多少元素,因此您应该使用可调整大小的数据结构,例如ArrayList

如果您像{}一样将names分配给slices,则会得到ArrayIndexOutOfBoundsException,因为它没有元素,但您正在尝试分配第0个值。