繁体   English   中英

在Java Applet中按下并释放鼠标

[英]Mouse pressed and released in java applet

我下面的代码是针对Checkers程序的。 如果用户单击停止按钮或按住鼠标,它将停止,并且执行按钮或鼠标释放会从头开始移动检查器。

我无法弄清楚如何将棋子从停在其上的同一位置移开。 请帮助!

import java.awt.Button;
import java.awt.Graphics;
import java.awt.Color;
import java.awt.Image;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;

public class Checkers extends java.applet.Applet implements Runnable,
        ActionListener {

Thread runner;
int xpos;
Image offscreenImg;
Graphics offscreenG;
Button  goButton, stopButton, exitButton;

private ExitButtonHandler ebHandler;

public void init() {
    // offscreenImg = createImage(getWidth(), getHeight());
    offscreenImg = createImage(this.size().width, this.size().height);
    offscreenG = offscreenImg.getGraphics();

    setSize(200, 250);

    addMouseListener(new Mouse());

    goButton = new Button("Go");
    goButton.setBounds(10, 200, 90, 20);
    setLayout(null);

    stopButton = new Button("Stop");
    stopButton.setBounds(100, 200, 90, 20);
    setLayout(null);

    exitButton = new Button("Exit");
    ebHandler = new ExitButtonHandler();
    exitButton.addActionListener(ebHandler);
    exitButton.setBounds(55, 220, 90, 20);
    setLayout(null);

    add(goButton);
    add(stopButton);
    add(exitButton);

    stopButton.addActionListener(this);
    goButton.addActionListener(this);
}

public void start() {
    if (runner == null) {
        runner = new Thread(this);
        runner.start();
    }
}

public void stop() {
    if (runner != null) {
        runner.stop();
        runner = null;
    }
}

public void run() {
    while (true) {
        for (xpos = 5; xpos <= 105; xpos += 4) {

            repaint();

            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
            }

        }
        xpos = 5;

        for (xpos = 105; xpos >= 5; xpos -= 4) {
            repaint();

            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
            }
        }
        xpos = 5;
    }
}

public void update(Graphics g) {
    paint(g);
}

public void paint(Graphics g) {
    // Draw background onto the buffer area
    offscreenG.setColor(Color.blue);
    offscreenG.fillRect(0, 0, 100, 100);
    offscreenG.setColor(Color.red);
    offscreenG.fillRect(0, 100, 100, 100);
    offscreenG.setColor(Color.red);
    offscreenG.fillRect(100, 0, 100, 100);
    offscreenG.setColor(Color.blue);
    offscreenG.fillRect(100, 100, 100, 100);

    // Draw checker
    offscreenG.setColor(Color.green);
    offscreenG.fillOval(xpos, 5, 90, 90);
    offscreenG.setColor(Color.yellow);
    offscreenG.fillOval(-xpos + 110, 105, 90, 90);

    // Now, transfer the entire buffer onto the screen
    g.drawImage(offscreenImg, 0, 0, this);
}

public void destroy() {
    offscreenG.dispose();
}

// Mouse events
public class Mouse extends MouseAdapter {

    public void mousePressed(MouseEvent e) {
        stop();

    }

    public void mouseReleased(MouseEvent e) {
        start();

    }
}

// Button events
public void actionPerformed(ActionEvent e) {
    if (e.getSource() == stopButton) {
        stop();

    } else if (e.getSource() == goButton) {

        start();
    }

}

// exit button
public class ExitButtonHandler implements ActionListener {
    public void actionPerformed(ActionEvent e) {
        System.exit(0);
    }
}

}

您正在重新创建一个新的线程,该线程在每次调用start函数时都start 同样,在您致电stop您将无法“恢复”您上次中断的地方。

您将需要更改您的线程以使用某种类型的标志( boolean stopped; ),然后在调用stopstart时更改该标志,因此该线程实际上并没有结束,而只是“暂停”。 停止移动,但实际上仍在运行

if (stopped) {
    //dont do stuff
}
else {
    //do stuff
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM