0

ウィンドウ内のボックスの色を変更できる簡単な色操作プログラムを作成しようとしています。いくつかのプリセットカラーを、ファイルからそれらの値を含むように特別に設定したクラスに読み込むことで使用しています。配列を使用してすべてのプリセット値を含めていますが、その配列の個々の要素にアクセスしようとすると、nullpointer例外が発生し続けます。Javaを使うのはこれが初めてなので、骨の折れる間違いを犯していると思います。これが私のコードです:

package color.sampler;
import java.io.*;
import javax.swing.*;
import javax.swing.event.*;


public class ColorSampler extends JFrame
{
protected ColorFrame sampler;
public JList colorList;
protected colors [] listOfColors;

/**
 * @param args the command line arguments
 */
public static void main(String[] args) throws IOException 
{
    new ColorSampler("ColorSampler");
}
public ColorSampler(String title) throws IOException
{
    super(title);
    setBounds(100,100,300,300);
    addWindowListener(new WindowDestroyer());


    sampler = new ColorFrame();

    getContentPane().setLayout(null);

    getContentPane().add(sampler);

    sampler.setBounds(10,10,270,200);
    FileInputStream stream = new FileInputStream("C:\\java input\\input.txt");
    InputStreamReader reader;
    reader = new InputStreamReader(stream);
    StreamTokenizer tokens = new StreamTokenizer(reader);
    int numColors, counter;
    numColors = 11;
    counter = 0;
    listOfColors = new colors[numColors];
    while(tokens.nextToken() != tokens.TT_EOF)
    {
        listOfColors[counter].name = (String)tokens.sval; 
        tokens.nextToken();
        listOfColors[counter].r = (int)tokens.nval;
        System.out.println(listOfColors[counter].r);
        tokens.nextToken();
        listOfColors[counter].g = (int)tokens.nval;
        tokens.nextToken();
        listOfColors[counter].b = (int)tokens.nval;
        counter++;
    }
    stream.close();
    colorList = new JList();
    colorList.addListSelectionListener(new ListHandler());
    String colorString[];
    colorString = new String[numColors];
    for(counter = 0; counter < numColors; counter++)
    {
        colorString[counter] = listOfColors[counter].name;
    }
    colorList.setListData(colorString);
    getContentPane().add(colorList);
    setVisible(true);
    // TODO code application logic here
}
private class ListHandler implements ListSelectionListener
{

    @Override
    public void valueChanged(ListSelectionEvent e) 
    {
        if(e.getSource() == colorList)
        {
            if(!e.getValueIsAdjusting())
            {
                int i = colorList.getSelectedIndex();
                String s = (String) colorList.getSelectedValue();
                System.out.println("Position " + i + " selected: " + s);
            }
        }
    }

}
}

値を格納するために使用しているクラス:

public class colors 
{
public int r, g, b;
public String name;
public colors()
{
    r = 0;
    g = 0;
    b = 0;
    name = "bob";
}

}

では、配列の最初の要素の名前にアクセスしようとしたときに発生する問題をどのように修正すればよいでしょうか。

4

2 に答える 2

2

あなたがこれをするという理由だけで:

listOfColors = new colors[numColors];

配列に何かが含まれているという意味ではありません。実際、この時点では、これはnull値の配列です。名前と色の値を設定する前に、要素ごとに色オブジェクトを作成する必要があります。

ちなみに、色のクラス名は大文字で始める必要があります:色。

于 2012-12-10T05:35:26.650 に答える
2

listOfColors配列の各オブジェクトも初期化する必要があると思いますが、whileループを...に変更してください。

counter = 0;
listOfColors = new colors[numColors];
while(tokens.nextToken() != tokens.TT_EOF)
{
    listOfColors[counter] = new Colors();
    listOfColors[counter].name = (String)tokens.sval; 
    tokens.nextToken();
    listOfColors[counter].r = (int)tokens.nval;
    System.out.println(listOfColors[counter].r);
    tokens.nextToken();
    listOfColors[counter].g = (int)tokens.nval;
    tokens.nextToken();
    listOfColors[counter].b = (int)tokens.nval;
    counter++;
}
于 2012-12-10T05:35:33.327 に答える