0

当Thread线程运行时,(点击记录后)它只显示线程启动时鼠标所在的位置?我怎样才能让它不断更新,即使我在框架周围移动鼠标也能显示鼠标的位置?

@Override public void actionPerformed(ActionEvent e)
{       
    thread = new Thread(this);

    if(e.getSource() == record)
    {
        thread.start();
        System.out.println("record");
    }

    if(e.getSource() == stopRecording)
    {
        setVisible(false);
        System.out.println("stop recording");
    }

}

@Override public void run()
{       
    setTitle("979");

    setSize(screen.width, screen.height);
    addMouseListener(this);
    setLocationRelativeTo(null);
    setLayout(transFlo);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);     
    add(stopRecording);     
    setOpacity(0.50f);      
    setVisible(true);

    while(true)
    {
        repaint();
    }

}

@Override public void paint(Graphics g)
{
    g.drawString(mousePOS + x + space + y, 250, 250);
}
4

2 回答 2

0

好的,只是重申一下;请阅读事件调度线程

然后阅读Swing 中的并发

最后阅读如何编写鼠标监听器

附加的

如果要监视全局鼠标事件(通过系统的所有鼠标事件),那么您将需要查看Toolkit.addAWTEventListener

这将允许您监视所有鼠标事件,而无需将鼠标侦听器附加到所有组件

简单的鼠标示例

这是监视鼠标的面板的简单示例:P

public class CrayPanel extends javax.swing.JPanel implements MouseMotionListener, MouseListener {

    private List<Point> lstPoints;

    /**
     * Creates new form CrayPanel
     */
    public CrayPanel() {

        lstPoints = new ArrayList<Point>(25);

        addMouseListener(this);
        addMouseMotionListener(this);

    }

    @Override
    protected void paintComponent(Graphics g) {

        super.paintComponent(g);

        if (lstPoints.size() > 1) {

            Graphics2D g2d = (Graphics2D) g;

            g2d.setColor(Color.RED);
            Point startPoint = lstPoints.get(0);
            for (int index = 1; index < lstPoints.size(); index++) {

                Point toPoint = lstPoints.get(index);
                g2d.drawLine(startPoint.x, startPoint.y, toPoint.x, toPoint.y);

                startPoint = toPoint;

            }

        }

    }

    @Override
    public void mouseDragged(MouseEvent e) {
    }

    @Override
    public void mouseMoved(MouseEvent e) {

        lstPoints.add(e.getPoint());
        repaint();

    }

    @Override
    public void mouseClicked(MouseEvent e) {

        lstPoints.clear();
        lstPoints.add(e.getPoint());
        repaint();

    }

    @Override
    public void mousePressed(MouseEvent e) {
    }

    @Override
    public void mouseReleased(MouseEvent e) {
    }

    @Override
    public void mouseEntered(MouseEvent e) {

        lstPoints.add(e.getPoint());
        repaint();

    }

    @Override
    public void mouseExited(MouseEvent e) {

        lstPoints.add(e.getPoint());
        repaint();

    }
}
于 2012-07-27T06:01:48.557 回答
0

我举了另一个例子。这本质上是一个鼠标监视器,它表明,如果操作正确,您不需要Thread

public class MouseFrame extends javax.swing.JFrame implements AWTEventListener, ActionListener {

    private boolean monitor = false;
    private Point mousePoint;

    /**
     * Creates new form MouseFrame
     */
    public MouseFrame() {

        setLayout(new GridBagLayout());

        JButton btnToggle = new JButton("Start");
        add(btnToggler);

        btnToggle.addActionListener(this);

        setSize(400, 400);

    }

    public void actionPerformed(java.awt.event.ActionEvent evt) {

        monitor = !monitor;

        if (monitor) {

            btnTrigger.setText("Stop");
            Toolkit.getDefaultToolkit().addAWTEventListener(this, AWTEvent.MOUSE_MOTION_EVENT_MASK);

        } else {

            btnTrigger.setText("Start");
        Toolkit.getDefaultToolkit().removeAWTEventListener(this);

    }

    }

    @Override
    public void paint(Graphics grphcs) {

        super.paint(grphcs);

        Graphics2D g2d = (Graphics2D) grphcs;

        if (monitor) {

            g2d.setColor(Color.RED);
            FontMetrics fm = g2d.getFontMetrics();
        g2d.drawString(mousePoint.x + "x" + mousePoint.y, 25, fm.getHeight() + 25);

    }

    }

    /**
     * @param args the command line arguments
     */
    public static void main(String args[]) {
        /*
         * Create and display the form
         */
        java.awt.EventQueue.invokeLater(new Runnable() {

            public void run() {
                new MouseFrame().setVisible(true);
            }
        });
    }

    @Override
    public void eventDispatched(AWTEvent evt) {

        if (evt instanceof MouseEvent) {

            MouseEvent me = (MouseEvent) evt;
            mousePoint = SwingUtilities.convertPoint(me.getComponent(), me.getPoint(), this);

            repaint();

        }
    }
}
于 2012-07-27T09:14:13.873 回答