Java 7 for mac不重新绘制

Java 7 for mac不重新绘制,java,macos,swing,repaint,Java,Macos,Swing,Repaint,我正在尝试创建一个简单的绘制程序,但每次调用myDrawingPanel2.repaint(),该程序都会删除绘制的旧点,并在新位置用一个点替换它。我在MacOSX10.8上运行这个程序,使用最新版本的JavaJDK(u15)和最新版本的Netbeans。我希望程序继续绘制点而不删除上一个点 这是我申请表的代码: private void myDrawingPanel2MouseClicked(java.awt.event.MouseEvent evt) {

我正在尝试创建一个简单的绘制程序,但每次调用myDrawingPanel2.repaint(),该程序都会删除绘制的旧点,并在新位置用一个点替换它。我在MacOSX10.8上运行这个程序,使用最新版本的JavaJDK(u15)和最新版本的Netbeans。我希望程序继续绘制点而不删除上一个点

这是我申请表的代码:

private void myDrawingPanel2MouseClicked(java.awt.event.MouseEvent evt) {                                             
    myDrawingPanel2.setxC(evt.getX());
    myDrawingPanel2.setyC(evt.getY());

    myDrawingPanel2.repaint();
}                                            

private void myDrawingPanel2MouseDragged(java.awt.event.MouseEvent evt) {                                             
    myDrawingPanel2.setxC(evt.getX());
    myDrawingPanel2.setyC(evt.getY());

    myDrawingPanel2.repaint();
}                                            

private void upActionPerformed(java.awt.event.ActionEvent evt) {                                   
    myDrawingPanel2.setyC(myDrawingPanel2.getyC()-5);

    myDrawingPanel2.repaint();
}                                  

private void downActionPerformed(java.awt.event.ActionEvent evt) {                                     
    myDrawingPanel2.setyC(myDrawingPanel2.getyC()+5);

    myDrawingPanel2.repaint();
}                                    

private void leftActionPerformed(java.awt.event.ActionEvent evt) {                                     
    myDrawingPanel2.setxC(myDrawingPanel2.getxC()-5);

    myDrawingPanel2.repaint();
}                                    

private void rightActionPerformed(java.awt.event.ActionEvent evt) {                                      
    myDrawingPanel2.setxC(myDrawingPanel2.getxC()+5);

    myDrawingPanel2.repaint();
}                                     

private void upKeyPressed(java.awt.event.KeyEvent evt) {                              
    if(evt.getKeyCode() == 38) {
        myDrawingPanel2.setyC(myDrawingPanel2.getyC()-5);
    }
    if(evt.getKeyCode() == 40) {
        myDrawingPanel2.setyC(myDrawingPanel2.getyC()+5);
    }
    if(evt.getKeyCode() == 39) {
        myDrawingPanel2.setxC(myDrawingPanel2.getxC()+5);
    }
    if(evt.getKeyCode() == 37) {
        myDrawingPanel2.setxC(myDrawingPanel2.getxC()-5);
    }
    myDrawingPanel2.repaint();
}                             

private void leftKeyPressed(java.awt.event.KeyEvent evt) {                                
    if(evt.getKeyCode() == 38) {
        myDrawingPanel2.setyC(myDrawingPanel2.getyC()-5);
    }
    if(evt.getKeyCode() == 40) {
        myDrawingPanel2.setyC(myDrawingPanel2.getyC()+5);
    }
    if(evt.getKeyCode() == 39) {
        myDrawingPanel2.setxC(myDrawingPanel2.getxC()+5);
    }
    if(evt.getKeyCode() == 37) {
        myDrawingPanel2.setxC(myDrawingPanel2.getxC()-5);
    }
    myDrawingPanel2.repaint();
}                               

private void downKeyPressed(java.awt.event.KeyEvent evt) {                                
    if(evt.getKeyCode() == 38) {
        myDrawingPanel2.setyC(myDrawingPanel2.getyC()-5);
    }
    if(evt.getKeyCode() == 40) {
        myDrawingPanel2.setyC(myDrawingPanel2.getyC()+5);
    }
    if(evt.getKeyCode() == 39) {
        myDrawingPanel2.setxC(myDrawingPanel2.getxC()+5);
    }
    if(evt.getKeyCode() == 37) {
        myDrawingPanel2.setxC(myDrawingPanel2.getxC()-5);
    }
    myDrawingPanel2.repaint();
}                               

private void rightKeyPressed(java.awt.event.KeyEvent evt) {                                 
    if(evt.getKeyCode() == 38) {
        myDrawingPanel2.setyC(myDrawingPanel2.getyC()-5);
    }
    if(evt.getKeyCode() == 40) {
        myDrawingPanel2.setyC(myDrawingPanel2.getyC()+5);
    }
    if(evt.getKeyCode() == 39) {
        myDrawingPanel2.setxC(myDrawingPanel2.getxC()+5);
    }
    if(evt.getKeyCode() == 37) {
        myDrawingPanel2.setxC(myDrawingPanel2.getxC()-5);
    }
    myDrawingPanel2.repaint();
} 
以下是我的JPanel的代码:

package drawingdemo;

import java.awt.Color;
import java.awt.Graphics;
import javax.swing.JPanel;


public class MyDrawingPanel extends JPanel{

int xC = 150;
int yC = 100;
int diameter = 25;

public int getxC() {
    return xC;
}

public void setxC(int xC) {
    this.xC = xC;
}

public int getyC() {
    return yC;
}

public void setyC(int yC) {
    this.yC = yC;
}

public int getDiameter() {
    return diameter;
}

public void setDiameter(int diameter) {
    this.diameter = diameter;
}

@Override
public void paintComponent(Graphics g){

    //super.paintComponent(g);

    g.setColor(Color.RED);
    g.fillOval(xC - (diameter/2), yC - (diameter/2), diameter, diameter);

}

}

该程序按照您的要求执行。
paintComponent
用于绘制整个组件,而您的实现只绘制一个点。如果您希望您的组件显示多个点,您可以提供绘制多个点的
paintComponent
实现。这意味着您必须记住所有点的位置


有一些技巧可以迫使Swing不清除背景,但由于没有实现正确的语义,这些技巧可能会很困难。屏幕上的可见状态可能随时丢失,例如,当另一个窗口与您的窗口重叠时,或者如果用户最小化并恢复窗口或显示设置更改时。因此,您必须提供一个
paintComponent
实现,该实现无论如何都能够恢复整个预期的显示内容。

要更快获得更好的帮助,请发布一个。顺便说一句-
//super.paintComponent(g)
删除
/
部分。这是因为
g
变量作用域,每次调用都会调用并创建该作用域。您可以使用
MyDrawingPanel
创建g并为每次调用绘制,或者保留(跟踪)每次绘制调用。请参阅引用的示例。我如何发布SSCCE?您能否给我一些示例代码,让我可以将每个对象保存在数组列表中?这样我可以在屏幕外渲染阵列中的对象,然后将它们推到屏幕上