2014-10-28 3 views
0

Я расширил класс JPanel, чтобы нарисовать график. Проблема, что у меня есть, что мне нужно глобальная графический объект, чтобы вызвать его в нескольких методов ... В качестве примера, вот что я пытаюсь сделать:Java: создание глобального графического объекта

public class Graph extends JPanel { 
    private Graphics2D g2d; 

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

    public void drawGridLines(int hor, int vert){ 
    g2d.someLogicToDrawMyGridLines(someparams); 
    } 
} 

Это возвращает нулевое исключение указателя - так что мой вопрос: как создать глобальный графический объект? Какова наилучшая практика в этой ситуации?

+0

Зачем вам нужен глобальный графический объект? Почему вы не можете называть 'drawGridLines' из' paintComponent' и передавать «Graphics» в качестве параметра? – khelwood

+0

Это то, что у меня есть на данный момент - но это хорошее решение, если я буду называть drawGridlines() из другого класса? –

+0

Лучше передать объект «Graphics» в свои вспомогательные функции, чем попытаться сохранить объект «Graphics», который может быть удален и больше не может быть использован. – khelwood

ответ

5

Мое предложение было таким:

public class Graph extends JPanel { 
    public void paintComponent(Graphics g){ 
     super.paintComponent(g); 
     g2d = (Graphics2D) g; 
     drawGridLines(g2d, ......); 
    } 

    private void drawGridLines(Graphics2D g2d, int hor, int vert){ 
     g2d.someLogicToDrawMyGridLines(someparams); 
    } 
} 

т.е. сохранить все виды использования графического контекста внутри paintComponent вызова.

+0

+1 для факторинга; соответствующий подход в [tag: jfreechart] можно увидеть среди различных методов drawXxx() в реализациях ['AbstractRenderer'] (http://www.jfree.org/jfreechart/api/javadoc/org/jfree /chart/renderer/AbstractRenderer.html). – trashgod

5

Как бы я прошел через графический объект извне?

Нельзя. Графический контекст действителен только при вызове paintComponent(). Вместо этого используйте MVC pattern, обсужденный here, чтобы обновить модель, которая уведомляет любой прослушиваемый вид для рендеринга. JFreeChart - полный пример.

Смежные вопросы