2013-07-31 2 views
0

Я пытаюсь нарисовать прямоугольник к JPanel, используя следующий код:Использование графики на JPanel

JPanel background = new JPanel(); 
Graphics2D g = null; 
Graphics2D g2d = (Graphics2D) g; 
g2d.setColor(Color.BLACK); 
g2d.drawRect(0, 0, 800, 600); 

Когда я пытаюсь скомпилировать я получаю ошибку

java.lang.NullPointerException на заданной цветовой линии.

Я также попытался это, но я получаю ту же ошибку

JPanel background = new JPanel(); 
Graphics bg = background.getGraphics(); 
bg.setColor(Color.BLACK); 
bg.drawRect(0, 0, 800, 600); 

может кто-нибудь помочь мне исправить эту ошибку?

+0

В первом случае г устанавливается равным нулю и, следовательно, g2d также нуль -> NPE в g2d.setColor –

+0

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

ответ

5

Чтобы нарисовать на JPanel, вам необходимо переопределить paintComponent(). Вы можете изменить его на лету следующим образом или создать подкласс:

JPanel background = new JPanel() 
{ 
    @Override 
    public void paintComponent(Graphics g) 
    { 
     super.paintComponent(g); 
     Graphics2D g2d = (Graphics2D) g; 
     g2d.setColor(Color.BLACK); 
     g2d.drawRect(0, 0, 800, 600); 
    } 
}; 
+4

super.paintComponent MadProgrammer

+1

@MadProgrammer Исправлено. Спасибо :) –

+0

Еще что-то не хватает, но основы там;) +1 – MadProgrammer

4

Создайте подкласс JPanel и переопределите метод paintComponent(Graphics g). Только краска из этого метода, с помощью Graphics, переданного в качестве аргумента метода, который можно смело бросить в Graphics2D:

JPanel background = new JPanel() { 
    @Override 
    protected void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     Graphics2D g2d = (Graphics2D) g; 
     g2d.setColor(Color.BLACK); 
     g2d.drawRect(0, 0, 800, 600); 
    } 
} 
3

Пользовательские картины в свинг обычно делается путем переопределения метода paintComponent любого класса, которые проходят JComponent. Если вам не нужно делать иначе, рекомендуется, чтобы вы расширились от чего-то вроде JPanel.

public class MyPanel exends JPanel { 
    protected void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     g.setColor(Color.BLACK); 
     g.drawRect(0, 0, 800, 600); 
    } 

    public Dimension getPreferredSize() { 
     return new Dimension(800, 600); 
    } 
} 

Взгляните на Performing custom painting и 2D Graphics для получения более подробной информации

+0

+1 Для переопределения 'getPreferredSize()'. Теперь 'pack()' может изменить размер JFrame, чтобы показать прямоугольник;) –

+0

@ Eng.Fouad Это единственная причина, по которой я опубликовал (за исключением первых двух ответов отсутствовал «super.paintComponent» в то время;)) – MadProgrammer

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