2015-01-23 5 views
0

Я хочу нарисовать прямоугольник в Java в приложении Swing, но я не знаю, как это сделать. Я посмотрел на подобные вопросы, ни один из которых не содержит ответа, который мне нужен. Я попытался следующие:Рисовать прямоугольник в Java

private void paintComponent(Graphics graphics, Rectangle rect, Color color) { 
    contentPane.paintComponents(graphics); 
    Graphics2D graphics2D = (Graphics2D) graphics; 
    graphics2D.setColor(color); 
    graphics2D.draw(rect); 
} 

Я называю это нравится:

contentPane = new JPanel(); 
contentPane.setBorder(new EmptyBorder(5, 5, 5, 5)); 
contentPane.setLayout(null); 
paintComponent(contentPane.getGraphics(), new Rectangle(0, 0, 50, 50), Color.WHITE); 

Но бросает NullPointerException на этой линии:

graphics2D.setColor(color); 

Я подозреваю, что это graphics2D быть null. Как я могу это исправить?

+0

'getGraphics' равно нулю, пока компонент не будет виден. – Veluria

+0

В этом случае просто проверьте графики для нулевого и просто верните, если это так. – Frecklefoot

+0

Никогда не используйте getGraphics, вы не контролируете процесс рисования, это сделано для вас, вам просто нужно подключиться к нему, чтобы получать уведомление, когда требуется обновление ... – MadProgrammer

ответ

3

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

import javax.swing.*; 
import java.awt.*; 

public class Test extends JPanel { 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       JFrame frame = new JFrame(); 
       frame.add(new Test()); 
       frame.setVisible(true); 
       frame.pack(); 
      } 
     }); 
    } 

    public Dimension getPreferrdSize() { 
     return new Dimension(200, 200); 
    } 

    public void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     g.drawRect(10, 10, 150, 40); 
    } 
} 
+1

С помощью диспетчера компоновки вызов Test #setSize не имеет значения, лучше переопределить getPreferredSize. Вы также должны создавать свой пользовательский интерфейс из содержимого потока Диспетчер событий – MadProgrammer

+0

Да, я знаю. Я просто пытался продемонстрировать концепцию. –

+0

Это круто, тогда вы также должны попытаться продемонстрировать правильный способ достижения всего результата, иначе вы просто заманиваете более плохой код, а Интернет полон этим ... – MadProgrammer

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