Java Swing NullPointerException при рисовании - PullRequest
0 голосов
/ 07 апреля 2010

Я использую пользовательский JLayeredPane. У меня есть несколько фигур, которые нужно рисовать на разных слоях в JLayeredPane.

Чтобы проверить это, я создаю JPanel и спрашиваю его графику. Затем я рисую тестовый прямоугольник на этом JPanel (подготавливая графику) и в своем методе paintComponent из JLayeredPane я наконец все рисую. Но это не удается (NullPointerException).

public class MyCustomPanel extends JLayeredPane {

// test
JPanel testpane;
Graphics g2;
// test

// constructor
public MyCustomPanel() {
    testpane = new JPanel();
    this.add(testpane, new Integer(14));
    g2 = testpane.getGraphics();
}

@Override
public void paintComponent(Graphics g) {
    super.paintComponent(g);

    g2.drawRect(10, 10, 300, 300);
}

}

// run:
//Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
//        at view.MyCustomPanel.paintComponent(MyCustomPanel.java:65)

Почему я не могу нарисовать такой JPanel из моей JLayeredPane? Я могу рисовать непосредственно на моем JLayeredPane из моего метода paintComponent, но это на панели по умолчанию из JLayeredPane. Мне нужно создать и нарисовать несколько слоев, которые добавлены в JLayeredPane.

Что я делаю не так? : S

Ответы [ 2 ]

2 голосов
/ 07 апреля 2010

Вы должны использовать g2 приведение Graphics, которое вам передано:

Graphics2D g2 = (Graphics2D)g;

Почему бы тебе не попробовать развязать вещи?

class InnerPanel extends JPanel
{
  public void paint(Graphics g)
  {
     Graphics2D g2 = (Graphics2D)g;
     g2.drawRect(....);
  }
}

class MyLayered extends JLayeredPane()
{
  MyLayered()
  {
    this.add(new InnerPanel(), 14);
  }
}

это имеет больше смысла ..

Кроме того, потому что вы пытаетесь сделать что-то, что не соответствует поведению Swing. Swing сам позаботится о том, чтобы вызывать соответствующие paint методы над вещами, которые должны отображаться, и чтобы использовать этот протокол, вы должны указать Graphics объектам, что рисовать, когда Swing запрашивает их у ваших объектов (вызывая paint) метод, а не когда вы хотите это сделать.

Таким образом, всякий раз, когда Swing хочет нарисовать ваш JLayeredPane, вы просто рисуете вещи на Graphic объекте других вещей, не считая, что Swing будет вызывать их соответствующие методы, когда это будет подходящее время.

В заключение: вы не можете нарисовать что-то на Graphic объекте, когда захотите. Вы можете сделать это только внутри методов, вызываемых Swing, потому что в противном случае Graphics этих объектов ничего не значит

1 голос
/ 07 апреля 2010

Переменная g2, вероятно, равна нулю, потому что вы устанавливаете ее в конструкторе, а не при рисовании. Вместо этого используйте переданную букву "g".

Вы можете получить законную графику только от компонента, который в данный момент рисуется. В противном случае это не действует. В тот момент, когда вы запрашиваете его, MyCustomPanel () не отображается, как и тестовая панель.

...