标签被添加到JPanel,无理由摆动

时间:2015-05-31 15:12:58

标签: java swing jframe jpanel

我试图制作一个简单的绘画应用程序。我有一个设置JFrame的main方法,然后使用flowlayout添加JPanel和JLabel。 JLabel用于计算点击次数。

panel类实现了mouselistener和mousemotionlistener。

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

此外,JPanel被边框包围,当我点击或绘制某些东西时,它会在面板的某处添加一个新的垂直边线,每次都是随机的。

Picture showing what I mean.

两个类的代码:

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();
}

缅因州

public class maine extends JFrame{
static JLabel label;

public maine(){
    setSize(600,400);
    setDefaultCloseOperation(3);
    setResizable(false);

    label = new JLabel("Clicks:");
    setLayout(new FlowLayout());
    add(label);
    add(new mainepanel());
    setVisible(true);
}

public static void setLabel(int clicks){
    label.setText("Clicks: " + clicks);
}

public static void main(String[]args){
    new maine();
}
}

1 个答案:

答案 0 :(得分:3)

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);
    }
}