为什么这段代码没有画线?

时间:2011-12-06 02:49:09

标签: java

我不确定为什么我的代码不起作用但它让我发疯。

这是我的班级,应该绘制按钮并创建要绘制的区域:

第二组代码是我需要制作4个画布的驱动程序,当我点击两次鼠标时,它会在两次点击之间画一条线然后重新绘制,如果我再次尝试再点击画布。

我收到以下错误: 错误:方法声明无效;需要返回类型     addMouseListener将(本);     ^  错误:非法启动类型     addMouseListener将(本);                      ^

public class Scribble extends JPanel implements MouseListener
{
addMouseListener(this);
int x, x1, y, y1;
boolean flag = false;

protected void paintComponent(Graphics g) {
    super.paintComponent(g);

    g.drawLine(x, y, x1, y1);
}


public void mouseReleased(MouseEvent e)
{

    if (!flag){
        x = e.getX();
        y = e.getY();
        flag = true;
    }
    else{
        x1 = e.getX();
        y1 = e.getY();
        flag = false;
        repaint();
}
}



public void mouseExited(MouseEvent e){}
public void mouseClicked(MouseEvent e){}
public void mousePressed(MouseEvent e){}
public void mouseMoved(MouseEvent e){}
public void mouseEntered(MouseEvent e){}

}



public class Lab8Draw extends JFrame{

public Lab8Draw(){
    Color c = new Color(100, 10, 200);
    setTitle("Lab 8 - Application #1");
    setLayout(new GridLayout(2,2));
    Scribble s = new Scribble();
    s.setBackground(Color.WHITE);
    add(s);
    Scribble s1 = new Scribble();
    s1.setBackground(Color.RED);
    add(s1);
    Scribble s2 = new Scribble();
    s2.setBackground(c);
    add(s2);
    Scribble s3 = new Scribble();
    s.setBackground(Color.BLUE);
    add(s3);

}


    public static void main (String[] args){


        Lab8Draw frame = new Lab8Draw();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(800, 800);
        frame.setVisible(true);
    }
}

5 个答案:

答案 0 :(得分:1)

您必须实施MouseListener

public class Scribble extends JPanel implements MouseListener

并注册

Scribble s = new Scribble();
s.addMouseListener(s);

Java tutorials为撰写MouseListener提供了有用的指南。

或者,您可以定义一个扩展MouseInputAdapter的内部类,因为它已经有MouseListener方法的空实现。

答案 1 :(得分:1)

第一步是让你的Scribble类扩展JPanel。您还需要让您的画布调用addMouseListener方法。现在,你真正拥有的是JFrame上的4幅画布。您不会将MouseListener添加到该类中的面板。您将侦听器添加到Scribble类的实例。另外,在驱动程序类的中实现MouseListener 。你不应该在JPanel类中这样做。

答案 2 :(得分:0)

首先,类Scribble必须实现MouseListener并通过addMouseListener()方法分配事件处理程序以捕获鼠标事件。 MouseListener接口具有以下必须覆盖的方法。

class Scribble extends JPanel implements MouseListener
{
  int x, x1, y, y1;
  boolean flag = false;
  public Scribble(){
   addMouseListener(this);
  }
  protected void paintComponent(Graphics g) {
    super.paintComponent(g);
    g.drawLine(x, y, x1, y1);
  }
  public void mouseReleased(MouseEvent e){
    if (!flag){
        x = e.getX();
        y = e.getY();
        flag = true;
    }
    else{
        x1 = e.getX();
        y1 = e.getY();
        flag = false;
        repaint();
    }
  }
 public void mouseExited(MouseEvent e){}
 public void mouseClicked(MouseEvent e){}
 public void mousePressed(MouseEvent e){}
 public void mouseMoved(MouseEvent e) {}
 public void mouseEntered(MouseEvent e) {}
}

答案 3 :(得分:0)

您是否将自己添加为MouseListener? E.g。

this.addMouseListener(本);

答案 4 :(得分:0)

我认为这是因为当在JFrame上绘制JPanels“Scribble”时,坐标都是0,因为它们没有被初始化。所以你有一条从P(0/0)到P(0/0)的线。

检查您的MouseListener是否正常工作....您在哪里注册?你不需要实现MouseListener吗?祝你好运。