Java Swing NullPointerException при рисовании
Я использую пользовательский 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 ответа
Вы должны использовать 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
из этих объектов ничего не значит
Переменная g2, вероятно, равна нулю, потому что вы устанавливаете ее в конструкторе, а не при рисовании. Вместо этого используйте "g", который был передан.
Вы можете получить только допустимую графику от компонента, который в данный момент рисуется. В противном случае это не действует. В тот момент, когда вы запрашиваете его, MyCustomPanel() не отображается и не является тестовой панелью.