Java 标签无理由添加到JPanel中

Java 标签无理由添加到JPanel中,java,swing,jframe,jpanel,Java,Swing,Jframe,Jpanel,我想做一个简单的绘画应用。我有一个主要方法,它设置一个JFrame,然后使用flowlayout添加一个JPanel和一个JLabel。JLabel用于计算点击次数 panel类实现了mouselistener和mousemotionlistener 问题是当我画一些东西或点击面板时,它也会将标签添加到JPanel中,并且根据我点击的位置,它会将标签添加到面板中两次,这让我很生气。我只是不明白为什么它被添加到JPanel中 此外,JPanel被边框包围,当我单击或绘制某个东西时,它会在面板上的某

我想做一个简单的绘画应用。我有一个主要方法,它设置一个JFrame,然后使用flowlayout添加一个JPanel和一个JLabel。JLabel用于计算点击次数

panel类实现了mouselistener和mousemotionlistener

问题是当我画一些东西或点击面板时,它也会将标签添加到JPanel中,并且根据我点击的位置,它会将标签添加到面板中两次,这让我很生气。我只是不明白为什么它被添加到JPanel中

此外,JPanel被边框包围,当我单击或绘制某个东西时,它会在面板上的某个位置添加一条新的垂直边框,每次都是随机的

两个类的代码:

public class mainepanel extends JPanel implements  MouseMotionListener, MouseListener{

Graphics globalGraphics;
int clickCount = 0;

public mainepanel(){
    setBorder(BorderFactory.createLineBorder(Color.black));
    setPreferredSize(new DimensionUIResource(200,200));
    addMouseMotionListener(this);
    addMouseListener(this);
    validate();
    setFocusable(true);
}

public void paintComponent(Graphics g){
    globalGraphics = g.create();
}

@Override
public void mouseDragged(MouseEvent e) {
    globalGraphics.fillOval(e.getX(), e.getY(), 10,10);
    repaint();
}

@Override
public void mouseClicked(MouseEvent e) {
    clickCount ++;
    maine.setLabel(clickCount);
    globalGraphics.fillOval(e.getX(), e.getY(), 10,10);
    repaint();
}
缅因州
执行
paintComponent
中的所有绘图(并确保调用
super.paintComponent
)-
MouseListener
/
MouseMotionListener
只需更改数据模型(如有必要,调用
repaint
,以便UI反映更改)

下面是一个简单的示例,使用鼠标单击创建一个圆,并拖动鼠标移动该圆:

Point center = null;
...
@Override
public void mouseClicked(MouseEvent e){
    center = e.getPoint();
    repaint();
}
@Override
public void mouseDragged(MouseEvent e){
    center = e.getPoint();
    repaint();
}
@Override
protected void paintComponent(Graphics g){
    super.paintComponent(g);
    if ( center != null ){
        g.fillOval(center.getX(), center.getY(), 10, 10);
    }
}

执行
paintComponent
中的所有绘图(并确保调用
super.paintComponent
)-
MouseListener
/
MouseMotionListener
只需更改数据模型(如有必要,调用
repaint
,以便UI反映更改)

下面是一个简单的示例,使用鼠标单击创建一个圆,并拖动鼠标移动该圆:

Point center = null;
...
@Override
public void mouseClicked(MouseEvent e){
    center = e.getPoint();
    repaint();
}
@Override
public void mouseDragged(MouseEvent e){
    center = e.getPoint();
    repaint();
}
@Override
protected void paintComponent(Graphics g){
    super.paintComponent(g);
    if ( center != null ){
        g.fillOval(center.getX(), center.getY(), 10, 10);
    }
}

执行
paintComponent
中的所有绘图(并确保调用
super.paintComponent
)-
MouseListener
/
MouseMotionListener
只需更改数据模型(如有必要,调用
repaint
,以便UI反映更改)

下面是一个简单的示例,使用鼠标单击创建一个圆,并拖动鼠标移动该圆:

Point center = null;
...
@Override
public void mouseClicked(MouseEvent e){
    center = e.getPoint();
    repaint();
}
@Override
public void mouseDragged(MouseEvent e){
    center = e.getPoint();
    repaint();
}
@Override
protected void paintComponent(Graphics g){
    super.paintComponent(g);
    if ( center != null ){
        g.fillOval(center.getX(), center.getY(), 10, 10);
    }
}

执行
paintComponent
中的所有绘图(并确保调用
super.paintComponent
)-
MouseListener
/
MouseMotionListener
只需更改数据模型(如有必要,调用
repaint
,以便UI反映更改)

下面是一个简单的示例,使用鼠标单击创建一个圆,并拖动鼠标移动该圆:

Point center = null;
...
@Override
public void mouseClicked(MouseEvent e){
    center = e.getPoint();
    repaint();
}
@Override
public void mouseDragged(MouseEvent e){
    center = e.getPoint();
    repaint();
}
@Override
protected void paintComponent(Graphics g){
    super.paintComponent(g);
    if ( center != null ){
        g.fillOval(center.getX(), center.getY(), 10, 10);
    }
}

public void paintComponent(Graphics g){globalGraphics=g.create();}
为什么这个被重写的方法什么都不做?我只使用它来捕获图形对象,所以我不必从该方法进行绘制。但这在这个场景中并不重要,如果我使用paintComponent方法绘制,仍然会出现错误。您应该只从
paintComponent
方法中绘制。让用户驱动的事件更改某种数据模型,然后调用绘制该模型的
repaint
super.paintComponent
丢失
public void paintComponent(Graphics g){globalGraphics=g.create();}
为什么这个被重写的方法什么都不做?我只是用它来捕获图形对象,所以我不必用那种方法作画。但这在这个场景中并不重要,如果我使用paintComponent方法绘制,仍然会出现错误。您应该只从
paintComponent
方法中绘制。让用户驱动的事件更改某种数据模型,然后调用绘制该模型的
repaint
super.paintComponent
丢失
public void paintComponent(Graphics g){globalGraphics=g.create();}
为什么这个被重写的方法什么都不做?我只是用它来捕获图形对象,所以我不必用那种方法作画。但这在这个场景中并不重要,如果我使用paintComponent方法绘制,仍然会出现错误。您应该只从
paintComponent
方法中绘制。让用户驱动的事件更改某种数据模型,然后调用绘制该模型的
repaint
super.paintComponent
丢失
public void paintComponent(Graphics g){globalGraphics=g.create();}
为什么这个被重写的方法什么都不做?我只是用它来捕获图形对象,所以我不必用那种方法作画。但这在这个场景中并不重要,如果我使用paintComponent方法绘制,仍然会出现错误。您应该只从
paintComponent
方法中绘制。让用户驱动的事件更改某种类型的数据模型,然后调用绘制该模型的
repaint