2013-06-03 101 views
0

我有一个使用自定义JPanel绘制的Java绘画程序。当点击JPanel画一个小椭圆形(或者如果你愿意的话),每当你点击另一个地方时椭圆消失。坐标也得到更新,但椭圆形不留,它移动到任何地方的用户点击一个... ... 这里有一个自定义的JPanel代码:为什么这个Java绘画程序不能绘制多个椭圆形?

int xCord, yCord; 

    public class PaintPanel extends JPanel implements MouseListener { 
     // default serial whatever... 
     private static final long serialVersionUID = -6514297510194472060L; 

     // initial values 
     int xCord = -10; 
     int yCord = -10; 

     public PaintPanel() { 
      addMouseListener(this); 
     } 

     @Override 
     public void paintComponent(Graphics g) { 
      super.paintComponent(g); 
      g.setColor(ProgramUI.currentColor); 
      g.fillOval(xCord, yCord, 8, 8); 
      repaint(); 
     } 

     @Override 
     public void mouseClicked(MouseEvent m) { 
     } 

     @Override 
     public void mouseEntered(MouseEvent m) { 
     } 

     @Override 
     public void mouseExited(MouseEvent m) { 
     } 

     @Override 
     public void mousePressed(MouseEvent m) { 
      if (paintPanel.contains(m.getPoint())) { 
       xCord = m.getX(); 
       yCord = m.getY(); 
       System.out.println("x: " + xCord + " y: " + yCord); 
      } 
     } 

     @Override 
     public void mouseReleased(MouseEvent m) { 
     } 

    } 

我需要鼠标的召开,不断作画一个椭圆直到放开鼠标按钮。这里唯一的问题是鼠标椭圆更新,但不保存它的原始位置。我该如何解决?

回答

5

只有一个椭圆形被画成只有一个fillOval声明绘制在paintComponent方法单一的椭圆形,因此声明

super.paintComponent(g); 

导致任何以前的绘画被清除一次repaint被调用。

作画多个椭圆形,如Custom Painting Approaches

概述不要从paintComponent中调用repaint可以绘制从List<Point>组件。这会造成无限循环并降低性能。如果需要定期更新,请从ActionListener调用repaint代替Swing Timer

0

,这是因为该组件重绘本身,以使更改永久,你应该采取的JPanel的图像,并将其设置为背景,一旦你完成每一次绘制...

0

你只画最后每次点击用户点击。相反,您需要收集过去的点击并且每次都进行绘制。

该代码会做你想要什么:

package com.sandbox; 

import javax.swing.*; 
import java.awt.*; 
import java.awt.event.MouseEvent; 
import java.awt.event.MouseListener; 
import java.util.ArrayList; 

public class SwingSandbox { 


    public static void main(String[] args) { 

     JFrame frame = buildFrame(); 
     frame.add(new PaintPanel()); 
    } 

    public static class PaintPanel extends JPanel implements MouseListener { 
     // default serial whatever... 
     private static final long serialVersionUID = -6514297510194472060L; 

     ArrayList<Point> points = new ArrayList<Point>(); 

     public PaintPanel() { 
      addMouseListener(this); 
     } 

     @Override 
     public void paintComponent(Graphics g) { 
      super.paintComponent(g); 
      g.setColor(new Color(250)); 
      for (Point point : points) { 
       g.fillOval(point.x, point.y, 8, 8); 
      } 
      repaint(); 
     } 

     @Override 
     public void mouseClicked(MouseEvent m) { 
     } 

     @Override 
     public void mouseEntered(MouseEvent m) { 
     } 

     @Override 
     public void mouseExited(MouseEvent m) { 
     } 

     @Override 
     public void mousePressed(MouseEvent m) { 
      if (this.contains(m.getPoint())) { 
       points.add(m.getPoint()); 
      } 
     } 

     @Override 
     public void mouseReleased(MouseEvent m) { 
     } 

    } 


    private static JFrame buildFrame() { 
     JFrame frame = new JFrame(); 
     frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 
     frame.setSize(200, 200); 
     frame.setVisible(true); 
     return frame; 
    } 


}