如何在for循环中添加鼠标侦听器

时间:2019-03-13 14:25:13

标签: java

所以我遇到一个问题,我无法退出绘图的for循环,我相信是因为MouseListener不在for循环中工作,我想知道是否有一种方法可以在运行中添加Mouse侦听器for循环,因此我可以检查何时释放鼠标。 这是一个学校项目,对于Java我是新手,所以最好做一个简单的解释。谢谢

    import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.MouseInfo;
import java.awt.Rectangle;
import java.awt.Shape;
import java.awt.Toolkit;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.image.ImageObserver;
import java.text.AttributedCharacterIterator;
import java.util.concurrent.TimeUnit;

import javax.swing.*;
import javax.swing.plaf.basic.BasicTabbedPaneUI.MouseHandler;
public class main extends JPanel implements MouseListener {
    int x,y;
    static int time = 0;
    static boolean mousePressed;
    static JFrame f = new JFrame("TEST");

    static JPanel p = new JPanel();
    static JLabel l = new JLabel("Hello");

    public main() {
        p.addMouseListener(this);
        addMouseListener(this);
    }
    public void paint(Graphics g) {

        //g.drawLine(10, 10, 200, 300);

    }

    public static void main(String[] args) {


        p.add(l);
        f.add(p);


        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setSize(400,400);
        f.getContentPane().add(new main());
        f.setResizable(false);

        f.setVisible(true);


    }


    @Override
    public void mouseClicked(MouseEvent e) {





            x=(int) MouseInfo.getPointerInfo().getLocation().getX();
            y=(int) MouseInfo.getPointerInfo().getLocation().getY()-46;
            if(mousePressed = true) {
             Graphics g = getGraphics();
             g.drawLine(x,y,x,y);
             try {
                TimeUnit.MILLISECONDS.sleep(1);
            } catch (InterruptedException e1) {
                // TODO Auto-generated catch block
                e1.printStackTrace();
            }
             mouseClicked(e);
             mousePressed = false;
            }
            else
                mousePressed=true;



    }

    @Override
    public void mousePressed(MouseEvent e) {
        mousePressed=true;
        mouseClicked(e);

    }








    @Override
    public void mouseReleased(MouseEvent e) {
        // TODO Auto-generated method stub
        mousePressed=false;
        System.out.println("TEST");
        mouseClicked(e);

    }

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

    }

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

    }            
    public void mouseDragged(MouseEvent e) {

    }


}

1 个答案:

答案 0 :(得分:1)

  

... MouseListener在for循环中不起作用

  1. 您的应用程序中没有for循环。
  2. mouseClicked(e);中的
  3. mouseClicked正在无限地调用自己。
  4. 您不应在鼠标侦听器中绘画,而应修改状态然后调用repaint()
  5. 如果您自己实现paint(),则应该绘制整个窗口,而不仅仅是绘制要添加到窗口的内容。或委托给父类的paint()

例如:

public class Test extends JFrame implements MouseListener {
    int x, y;
    boolean mousePressed;
    public static void main(String[] args) {
        new Test().setVisible(true);
    }
    public Test() {
        super("Test");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setSize(400, 400);
        addMouseListener(this);
    }
    public void paint(Graphics g) {
        super.paint(g); // paints the entire window normally
        if (mousePressed) { // additional painting
            g.drawLine(x - 20, y, x + 20, y);
            g.drawLine(x, y - 20, x, y + 20);
        }
    }
    @Override
    public void mousePressed(MouseEvent e) {
        x = e.getX();
        y = e.getY();
        mousePressed = true;
        repaint();
    }
    @Override
    public void mouseReleased(MouseEvent e) {
        mousePressed = false;
        repaint();
    }
    @Override
    public void mouseEntered(MouseEvent e) {
    }
    @Override
    public void mouseExited(MouseEvent e) {
    }
    @Override
    public void mouseClicked(MouseEvent e) {
    }
}