Java repaint()删除以前绘制的点

Java repaint()删除以前绘制的点,java,repaint,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 { /** Cre

我试图在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                   

}
import java.awt.*;
导入java.awt.event.*;
导入javax.swing.*;
导入java.math.*;
导入java.util.*;
/**
*
*@作者埃米尔
*/
公共类GuiForTsp扩展了javax.swing.JFrame{
/**创建新表单GuiForTsp*/
类MousePanelA扩展JPanel实现MouseListener{
公共鼠标垫(){
超级();
addMouseListener(这个);
System.out.println(“构建鼠标垫”);
}
int x;
int-y;
整数计数=0;
ArrayList xlist=新的ArrayList();
ArrayList ylist=新的ArrayList();
/*公共空间更新(图g)
{
组分(g);
System.out.println(“hi”);
}*/
公共组件(图形g){
超级组件(g);
g、 fillRect(x,y,5,5);
System.out.println(“填充矩形”);
//重新油漆();
}
public void mouseClicked(MouseEvent鼠标){
System.out.println(“鼠标点击”);
计数++;
x=mouse.getX();
y=mouse.getY();
xlist.add(x);
添加(y);
System.out.println(“x”+xlist);
System.out.println(“y”+ylist);
System.out.println(“x”+x);
系统输出打印项次(“y”+y);
//g、 fillRect(x,y,5,5);
重新油漆();
}
public void mouseEntered(MouseEvent mouse){}
public void mouseExited(MouseEvent mouse){}
public void mousePressed(MouseEvent mouse){}
public void mouseereleased(MouseEvent mouse){}
}
JButton jButton1;
鼠帕尼拉jPanel1;
公共GuiForTsp(){
初始化组件();
}
/**此方法从构造函数中调用,以
*初始化表单。
*警告:请勿修改此代码。此方法的内容为
*始终由表单编辑器重新生成。
*/
@抑制警告(“未选中”)
//                           
私有组件(){
jButton1=newjavax.swing.JButton();
jPanel1=新鼠标垫();
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
挫折背景(新java.awt.Color(30157164));
jButton1.setText(“生成”);
setBackground(新java.awt.Color(67152,46));
javax.swing.GroupLayout jPanel1Layout=新的javax.swing.GroupLayout(jPanel1);
setLayout(jPanel1Layout);
jPanel1Layout.setHorizontalGroup(
jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGap(0,287,短。最大值)
);
jPanel1Layout.setVerticalGroup(
jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGap(0,283,短.MAX_值)
);
javax.swing.GroupLayout=newjavax.swing.GroupLayout(getContentPane());
getContentPane().setLayout(布局);
layout.setHorizontalGroup(
createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING,layout.createSequentialGroup()
.addContainerGap()
.addComponent(jPanel1,javax.swing.GroupLayout.DEFAULT\u SIZE,javax.swing.GroupLayout.DEFAULT\u SIZE,Short.MAX\u值)
.addGap(18,18,18)
.addComponent(jButton1)
.addGap(25,25,25))
);
layout.setVerticalGroup(
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\u SIZE,javax.swing.GroupLayout.DEFAULT\u SIZE,Short.MAX\u VALUE)))
.addContainerGap(23,简称最大值))
);
包装();
}//                         
/**
*@param指定命令行参数
*/
公共静态void main(字符串参数[]){
invokeLater(new Runnable()){
公开募捐{
新的GuiForTsp().setVisible(true);
}
});
}
//变量声明-不修改
//变量结束声明
}

请告诉我如何修改程序,以便在单击新点时,它与以前的点一起显示。我需要知道除了存储单击的点的值并在每次单击新点时重新绘制所有值之外,是否有其他简单的方法来执行此操作。如果您能提供代码片段,这将是非常值得欣赏的。

首先,您应该将此图形复制到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();
    }
公共组件(图形g){
超级组件(g);
Graphics2D g2d=(Graphics2D)g.create();
对于(int i=0;i

也可以考虑使用一个列表,而不是两个列表

,你应该把点坐标存储在一个集合中(我建议一个链接列表),然后你会解析这个列表(对于你喜欢的每一个或任何其他循环)并再次画每个点。 问题是,每次调用“repaint()”时都需要这样做,但是(我认为)在调整windo的大小时会调用它