-3

I have problem incrementing this by one per click.

class window extends JPanel implements MouseListener{

int a=0;

public void paint(Graphics g){
    super.paint();
    g.drawLine(5, 5, 200, 200); // TEST draw

}

@Override
public void mousePressed(MouseEvent e) {
    a++; // increment by one
    System.out.println(a);// print out 
}

@Override
public void mouseReleased(MouseEvent e) {
    // TODO Auto-generated method stub

}

}


class drawSpline_frame extends JFrame {
public drawSpline_frame(){
    setSize(500,500);
    setTitle("Spline");

    Container cp =  this.getContentPane(); // EDITED
    cp.add(window, BorderLayout.CENTER );
            window.addMouseListener(window);
}

}

class drawSpline{
public static void main(String[] args) {
    JFrame frame = new drawSpline_frame();
    frame.setVisible(true);

    }
}
4

2 回答 2

1

至少有问题,

  1. 您已覆盖paint且未调用super.paint
  2. 每次paint调用您都会添加一个鼠标侦听器。 paint当它决定需要重新绘制 UI 时,绘制子系统会调用它,这意味着每次 UI 都会更新,您正在向组件添加另一个鼠标侦听器。

相反,可能在构造函数中添加一次鼠标侦听器。而不是扩展paint,您应该扩展paintComponent并确保您正在调用super.paintComponent

于 2013-10-12T20:32:48.457 回答
1
public void paint(Graphics g){
    addMouseListener(this);
    g.drawLine(5, 5, 200, 200); // TEST draw

}

在您的代码中,您正在paint(Graphics g)函数中添加侦听器!两件事情:

  1. 覆盖paintComponent()而不是paint()并且不要忘记调用该super.paintComponent(g)方法。
  2. 在构造函数或创建它的块中将事件侦听器添加到组件。

您的代码drawSpline_frame()不完整,但content pane's布局JFrame默认为BorderLayout()。你可以这样做:

jFrame.getContentPane().add(windowPan, BorderLayout.Center);

最后建议MouseListener使用添加事件MouseAdapter,您不需要扩展它:

  jPanel1.addMouseListener(new MouseAdapter() {
    public void mouseClicked(MouseEvent evt) {
        jPanel1MouseClicked(evt);
    }
  });
于 2013-10-12T20:33:01.310 回答