передать массив в класс компонента рисования? - PullRequest
3 голосов
/ 09 января 2012

У меня есть вопрос другого новичка, который, надеюсь, кто-то может помочь.

Я пытаюсь передать массив из одного класса в другой, чтобы использовать его для создания гистограммы. Я знаю, что могу передать массив в качестве параметра, но я получаю некоторые ошибки и в основном немного потерян. Основной код для классов для диаграммы ниже. Предположим, я хочу передать «anArray» из «AnotherClass», кто-нибудь может сказать мне, как именно я должен передать его?

Я пытался передать его в качестве параметра JBChart & chartComponent, но я думаю, мне нужно, чтобы он был в paintComponent? Поскольку у него уже есть «Графика g» в качестве параметра, я довольно запутался. Во всяком случае, любой из этих двух, и я получаю ошибки nullPointer (хотя я знаю, что я тоже могу делать что-то не так).

Вот основной код для классов диаграммы. Любые идеи очень ценятся:

public class JBChart extends JFrame {

    public JBChart()    {}

    public void buildChart()
    {   
        ChartComponent component = new ChartComponent();
        chartFrame.add(component);                           
        chartFrame.setVisible(true);
    }
}
public class ChartComponent extends JComponent {
    public ChartComponent() {}

    public void paintComponent(Graphics g)
    {
        Graphics2D g2 = (Graphics2D) g;
    }

-

-EDIT-

Это первые несколько строк одной из трассировок стека (надеюсь, этого достаточно?): -

    Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException at ChartComponent.<init>(ChartComponent.java:43) at JBChart.<init>(JBChart.java:32) 
at JavaBallGUI.displayBarChart(JavaBallGUI.java:273) 
at JavaBallGUI.actionPerformed(JavaBallGUI.java:310) 

- Линия, на которую он указывает:

for (int i = 0; i < teamObjects.length; i++) 
{ 
    if (teamObjects[i] != null) 
    { 
    teamName = teamObjects[i].getTeamName(); 
    System.out.println(teamName); 
    } 
} 

1 Ответ

3 голосов
/ 09 января 2012

Вы, вероятно, должны передать его конструктору :

public class ChartComponent extends JComponent {
    private final int[] values; // For example

    public ChartComponent(int[] values) {
        this.values = values;
    }

    public void paintComponent(Graphics g)
    {
        Graphics2D g2 = (Graphics2D) g;
    }
}

Обратите внимание, что это все еще позволит классу либо впоследствии изменить значения в массиве, поскольку они оба получили ссылку на один и тот же изменяемый объект. Есть несколько способов обойти это, в зависимости от того, что именно вы пытаетесь сделать. Вы бы тогда использовали:

ChartComponent component = new ChartComponent(array);

В качестве альтернативы, вы всегда можете создать сеттер-методы на ChartComponent и вызывать их в подходящее время. Вы не сможете изменить сигнатуру paintComponent и все равно получить желаемое поведение, поэтому вам нужно будет предоставить данные до вызова метода.

...