repaint()删除先前绘制的点

时间:2011-04-05 14:18:43

标签: java repaint

我正在尝试绘制用户在JPanel上点击的点数。能够识别坐标,但是当调用repaint()时,之前的点将被覆盖。

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.math.*;
import java.util.*;


/**
 *
 * @author emil
 */
public class GuiForTsp extends javax.swing.JFrame {

    /** Creates new form GuiForTsp */
    class MousePanelA extends JPanel implements MouseListener{
    public MousePanelA(){
        super();
        addMouseListener(this);
        System.out.println("constructing MousePanelA");
    }

    int x;
    int y;
    int count = 0;
    ArrayList xlist = new ArrayList();
    ArrayList ylist = new ArrayList();



    /*  public void update(Graphics g)
    {
        paintComponent(g);
        System.out.println("hi");
        }*/

    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.fillRect(x,y,5,5);
        System.out.println("filling rectangle");
        //repaint();
    }

    public void mouseClicked(MouseEvent mouse){
        System.out.println("Mouse clicked"); 
        count++;   
        x = mouse.getX();
        y = mouse.getY();
        xlist.add(x);
        ylist.add(y);
        System.out.println("x " + xlist);
        System.out.println("y " + ylist);

        System.out.println("x " + x);
        System.out.println("y " + y);
        //g.fillRect(x,y,5,5);
        repaint();
    }

    public void mouseEntered(MouseEvent mouse){ }   
    public void mouseExited(MouseEvent mouse){ }
    public void mousePressed(MouseEvent mouse){ }
    public void mouseReleased(MouseEvent mouse){ }
    }

    JButton jButton1;
    MousePanelA jPanel1;

    public GuiForTsp() {
    initComponents();
    }

    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">                          
    private void initComponents() {

        jButton1 = new javax.swing.JButton();
        jPanel1 = new MousePanelA();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        setBackground(new java.awt.Color(30, 157, 164));


        jButton1.setText("Generate ");

        jPanel1.setBackground(new java.awt.Color(67, 152, 46));

        javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1);
        jPanel1.setLayout(jPanel1Layout);
        jPanel1Layout.setHorizontalGroup(
            jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 287, Short.MAX_VALUE)
        );
        jPanel1Layout.setVerticalGroup(
            jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 283, Short.MAX_VALUE)
        );

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                .addGap(18, 18, 18)
                .addComponent(jButton1)
                .addGap(25, 25, 25))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(layout.createSequentialGroup()
                        .addGap(56, 56, 56)
                        .addComponent(jButton1))
                    .addGroup(layout.createSequentialGroup()
                        .addGap(22, 22, 22)
                        .addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)))
                .addContainerGap(23, Short.MAX_VALUE))
        );

        pack();
    }// </editor-fold>                        

    /**
    * @param args the command line arguments
    */
    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new GuiForTsp().setVisible(true);
            }
        });
    }

    // Variables declaration - do not modify                     

    // End of variables declaration                   

}

请告诉我如何修改程序,以便在点击新点时显示该程序以及之前的点。我需要知道是否有任何简单的方法来执行此操作,除了存储单击的点值并在每次单击新点时重绘所有这些值。如果您能提供代码片段,那将是值得注意的。

3 个答案:

答案 0 :(得分:2)

首先,您应该将此图形复制到Graphics2D中。

其次,每次重绘都会再次绘制所有屏幕,你需要每次都在这个方法上绘制所有点。

那些列表xList和yList有前面的几点,为什么不绘制它们呢?

 public void paintComponent(Graphics g) {
    super.paintComponent(g);
    Graphics2D g2d = (Graphics2D) g.create();
    for(int i = 0; i < xList.size(); i ++)
      g2d.fillRect(xList.get(i), yList.get(i), 5, 5);
    g2d.dispose();
    }

另外,请考虑使用List,而不是两个List

答案 1 :(得分:0)

您应该将点坐标存储在集合中(我建议使用LinkedList),然后您将解析该列表(对于您喜欢的每个或任何其他循环)并再次绘制每个点。

问题是,每次调用'repaint()'时都需要这样做,但是(我认为)在调整窗口大小时调用它,例如,你不能覆盖这个方法。我知道你必须将这段代码放在一个特定的方法中,但我忘了哪一个(可能在更新(图形g)?)。

希望即使我没有提供完美答案,这也会有所帮助。

答案 2 :(得分:0)

Custom Painting Approaches显示了两种方法。