【问题标题】:MouseMotionListener is not working with CanvasMouseMotionListener 不适用于 Canvas
【发布时间】:2015-07-24 17:01:06
【问题描述】:

这是我到目前为止的代码,我想做的是每次移动鼠标时添加一个新对象,但是经过数小时的思考,系统甚至没有访问 MouseEvent 类,我仍然无法弄清楚问题。请帮忙!!

我的主要课程:

  package testing;

import java.awt.Canvas;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.image.BufferStrategy;
import java.util.Random;

public class Wincall extends Canvas implements Runnable {

public static final int HEIGHT = 640, WIDTH = 1080;

private WinTest w;              
private Handler handler;
private ME me = new ME(this);

public Wincall(){

    handler = new Handler();
    w = new WinTest(WIDTH, HEIGHT, "Test", this);

}

public synchronized void run(){

    while(true){

        long now = System.currentTimeMillis();

        this.tick();  
        this.render();

        long after = System.currentTimeMillis();
        int tt = (int) (after-now);
        if(tt>5)
            try {
                Thread.sleep(10);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

        System.out.println("Time Taken in millisecs : " + tt);

    }

}

public void tick(){
    handler.tick();
}

public void render(){

    BufferStrategy bs = this.getBufferStrategy();
    if(bs == null)
    {
        this.createBufferStrategy(3);
        return;
    }
    Graphics g = bs.getDrawGraphics();

    //render

    g.setColor(Color.BLACK);
    g.fillRect(0 ,0 ,WIDTH, HEIGHT);


    handler.render(g);

    //render end

    g.dispose();
    bs.show();
}

public void addStuff(){

    handler.addObject(new TestGO(me.getX(), me.getY(), 32, 32));

}

public static void main(String[] args){
    new Wincall();
}
  }

我的 MouseEvent 类:

package testing;

import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionListener;

public class ME implements MouseMotionListener{

private int mx = 0, my = 0;
private Wincall game;

public ME(Wincall game){
    this.game = game;
}

public void mouseDragged(MouseEvent e){}

public void mouseMoved(MouseEvent e) {

    game.addStuff();
    mx = e.getX();
    my = e.getY();

    System.out.println(mx);
    System.out.println(my);

}

public int getX(){
    return mx;
}

public int getY(){
    return my;
}

}

我的窗口类:

package testing;

import java.awt.Canvas;

import javax.swing.JFrame;

public class WinTest {

private static final long serialVersionUID = -369751247370351003L;

public WinTest(int h, int w, String title, Wincall game){

    JFrame f = new JFrame(title);
    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    f.setSize(h, w);
    f.add(game);
    f.setVisible(true);
    f.requestFocus();
    f.setResizable(false);
    f.setFocusable(true);

    game.addMouseMotionListener(new ME());

    game.run();
}

}

【问题讨论】:

  • Handler handler 是什么?
  • Handler 是所有对象的链表
  • 用canvas实现wincall的目的是什么?您已经将 Wintest 作为画布。你为什么不使用WinTest 本身?
  • 我想为 Window 设置一个单独的类,我将使用 Wintest 删除 Canvas 的实现

标签: java mousemotionlistener


【解决方案1】:

虽然不清楚您要做什么。但是您需要将MouseMotionListener 添加到画布而不是JFrame。由于您将画布添加到 JFrame,因此应该捕获 MouseEvents 的是 canvas。因此,您的Wintest 应该看起来像这样:

public class WinTest extends Canvas {

private static final long serialVersionUID = -369751247370351003L;

public WinTest(int h, int w, String title, Wincall game, ME me) {

    JFrame f = new JFrame(title);
    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    f.setSize(h, w);
    f.add(game);
    f.setVisible(true);
    f.requestFocus();
    f.setResizable(false);
    f.setFocusable(true);
    // f.addMouseMotionListener(me);
    game.addMouseMotionListener(me);
    game.run();
 }
}

更新:

Wincall 类:

public class Wincall extends Canvas implements Runnable {

public static final int HEIGHT = 640, WIDTH = 1080;

private WinTest w;
// private Handler handler;
private ME me = new ME(this);

public Wincall() {

    // handler = new Handler();
    w = new WinTest(WIDTH, HEIGHT, "Test", this, me);

}

public synchronized void run() {

    while (true) {

        long now = System.currentTimeMillis();

        this.tick();
        this.render();

        long after = System.currentTimeMillis();
        int tt = (int) (after - now);
        if (tt > 5)
            try {
                Thread.sleep(10);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

        // System.out.println("Time Taken in millisecs : " + tt);

    }

}

public void tick() {
    // handler.tick();
}

public void render() {

    BufferStrategy bs = this.getBufferStrategy();
    if (bs == null) {
        this.createBufferStrategy(3);
        return;
    }
    Graphics g = bs.getDrawGraphics();

    // render

    g.setColor(Color.BLACK);
    g.fillRect(0, 0, WIDTH, HEIGHT);

    // handler.render(g);

    // render end

    g.dispose();
    bs.show();
}

public void addStuff() {
    System.out.println("addStuff");
    // handler.addObject(new TestGO(me.getX(), me.getY(), 32, 32));

}

public static void main(String[] args) {
    new Wincall();
}
}

【讨论】:

  • 这就是我得到的:线程“main”java.lang.IllegalStateException 中的异常:组件必须在 java.awt.Component$FlipBufferStrategy.createBuffers(Component.java:3998) 处具有有效的对等点java.awt.Component$FlipBufferStrategy.(Component.java:3972) 在 java.awt.Component$FlipSubRegionBufferStrategy.(Component.java:4495) 在 java.awt.Component.createBufferStrategy(Component.java: 3849) 在 java.awt.Canvas.createBufferStrategy(Canvas.java:194) 在 java.awt.Component.createBufferStrategy(Component.java:3773) 在 java.awt.Canvas.createBufferStrategy(Canvas.java:169)
  • 你更新了你的代码还是你正在运行的同一个类(Wintest),因为它对我有用?请发布您更新的代码。我还将Thread.sleep(1000) 更改为 1 秒。
  • 那现在变成另外一个问题了,和Thread有关。之前您将MouseListener 附加在错误的位置,为此我向您建议了一个解决方案。您可以在System.out.println() 中跟踪您的鼠标,我不知道您更改了什么。此外,您没有提供处理程序类。我们不知道你在里面做什么。
  • 问题是我无法跟踪我的鼠标。它没有打印任何东西,我不知道为什么。我尝试先添加画布,然后添加游戏对象(到框架中),鼠标侦听器会响应大约一厘米左右的小额外空间,但 BufferStrategy 正在执行的位置没有打印出任何内容。
【解决方案2】:

我正在查看我的一些旧源代码:

试试

addMouseMotionListener(我);

代替:

f.addMouseMotionListener(me);

【讨论】:

    猜你喜欢
    • 2019-01-04
    • 2012-01-26
    • 1970-01-01
    • 2016-02-07
    • 2018-12-13
    • 2014-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多