2013-10-24 3 views
0

Я пытаюсь рисовать внутри своего JPanel, но каждый раз, когда я нажимаю, фон моего JPanel исчезает. Он рисует линию, где находится мышь. Я думаю, что это имеет какое-то отношение к 2D-графике. Может кто-нибудь помочь?Swing - цвет фона JPanel исчезает

public Brush() { 

addMouseListener(this); 
    addMouseMotionListener(this); 
    setBackground(Color.white); 


} 
    @Override 
    public void paintComponent(Graphics g) { 

     Graphics2D g2; 
     // super.paintComponent(g); 

     g2 = (Graphics2D) g; 

     g2.setColor(brushColor); 
     g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); 
     g2.setStroke(new BasicStroke(8, BasicStroke.CAP_ROUND, BasicStroke.JOIN_BEVEL)); 
     //Ellipse2D.Double circle = new Ellipse2D.Double(p1.x,p1.y,20,20); 

     g2.fillOval(p1.x,p1.y,20,20); 

     } 


     @Override 
     public void mousePressed(MouseEvent e) { 
      dragging = true; 
      p1 = e.getPoint(); 
      repaint(); 
     } 
     @Override 
     public void mouseReleased(MouseEvent e) { 
      dragging = false; 
      p1 = e.getPoint(); 
      repaint(); 
     } 

     @Override 
     public void mouseDragged(MouseEvent e) { 
      if (dragging) { 
       p1 = e.getPoint(); 
       repaint(); 
      } 
     } 

ответ

4

Всегда вызывайте метод super.paintComponent(g) внутри вашего переопределения.

Тогда вы рисуете неправильно. Если вы хотите сделать кучу овалов, то либо

  • создать коллекцию из них и сделать их для цикла в paintComponent или
  • обратить их в BufferedImage, который затем обращается в методе paintComponent ,
  • Если я хочу нарисовать кривую с помощью мыши, я обычно создаю ArrayList<Point> и рисую линии между смежными точками либо в paintComponent, либо в BufferedImage.

Опять же, ваш код написан рисовать только одна точка (овал на самом деле) в paintComponent. Если правильно закодировано, это все, что он сделает.

я полагаю, проще всего сделать, это:

  • дать вам класс ArrayList<Point>
  • Добавление точек при нажатии мыши и вызвать перекрашивать
  • В paintComponent, вызывается вышестоящий метод, а затем используйте цикл for для итерации через ArrayList.
  • Запустите цикл в точке в позиции 1, а не 0, а затем нарисуйте линию между предыдущей точкой и текущей точкой.
  • Чтобы получить более привлекательный, вы можете иметь ArrayList<ArrayList<Point>>, где вы начинаете новый ArrayList<Point> с каждым нажатием мыши, заканчиваете его с каждой версией и добавляете в общую коллекцию. Это позволит сделать несколько строк.

Почему бы не дать это по своему усмотрению?

+0

Но когда я это делаю, вычерченные овалы исчезают? –

+0

@RafVandelaer: вы ошибаетесь. См. Править. –

+0

Я не понимаю, у вас есть пример? Я также хочу, чтобы точки были нарисованы напрямую, поэтому не после того, как вы отпустили кнопку мыши –

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