【问题标题】:MouseMotionListener doesn't workMouseMotionListener 不起作用
【发布时间】:2017-01-07 12:20:23
【问题描述】:

我正在编写一个名为“Kulami”的游戏。这是两个玩家的棋盘游戏。棋盘是用大小不同的矩形板构建的。我可以在我需要的所有盘子上签名,但我不能移动它们,MouseMotionListener 不起作用。一个矩形板签了字,但是没有接触到按鼠标。我找不到错误。任何人都可以显示我的代码并帮助我吗? 谢谢!

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

import Model.EFieldStateMarble;
import Model.EFieldStatePlate;


public class Plate extends JPanel {

    // Eigenschaften
    public String plate[][];

    // Konstruktor
    public Plate(int r, int c, EFieldStatePlate fieldStatePlate, EFieldStateMarble fieldStateMarble) {
        plate = new String[r][c];
        for (r = 0; r < plate.length; r++) { // waagerecht
            for (c = 0; c < plate[r].length; c++) { // senkrecht
                plate[r][c] = fieldStatePlate.toString() + fieldStateMarble.toString(); // Codierung Feld
            }

        }
    }

    // Methoden
    public void showPlate() { // Konsolenausgabe Spielfeldplatte
        for (int r = 0; r < plate.length; r++) {
            for (int c = 0; c < plate[r].length; c++) {
                System.out.print(plate[r][c]);
            }
            System.out.println();
        }
    }

    // Ändert Eintrage in r-ter Reihe und c-ter Spalte
    public void setEntryAt(int r, int c, EFieldStatePlate fieldStatePlate, EFieldStateMarble fieldStateMarble) {
        plate[r][c] = fieldStatePlate.toString() + fieldStateMarble.toString();
    }

    public String[][] getPlate() {
        return plate;
    }

    // dreht das Array um 90°
    public void turnPlate() {
        int m = plate.length;
        int n = plate[0].length;
        String[][] returnPlate = new String[n][m];
        for (int r = 0; r < plate.length; r++) {
            for (int c = 0; c < plate[0].length; c++) {
                returnPlate[c][m - 1 - r] = plate[r][c];
            }
        }plate = returnPlate;
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        Graphics2D g2d = (Graphics2D) g;
        g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);

        drawPlate(g2d, 60, 60);

    }

    private void drawPlateField(Graphics2D g2d, int x, int y) {
        int posX = x;
        int posY = y;
        g2d.setColor(Color.BLACK);
        g2d.drawRect(posX, posY, 60, 60);
        g2d.setColor(new Color(242, 203, 130));
        g2d.fillRect(posX + 1, posY + 1, 59, 59);
        g2d.setColor(Color.BLACK);
        g2d.drawOval(x + 15, y + 15, 30, 30);
        g2d.setColor(new Color(242, 203, 130));
        g2d.fillOval(x + 16, y + 16, 29, 29);
    }

    private void drawPlate(Graphics g2d, int plateX, int plateY ) {

        try {
            for (int r = 0; r < plate.length; r++) {
                for (int c = 0; c < plate[0].length; c++) {
                    drawPlateField((Graphics2D) g2d, plateX + c * 60, plateY + r * 60);
                }

            }

        } catch (Exception e) {
            System.out.print(e);
            }

    }

    private class PlateDragged implements MouseListener, MouseMotionListener {

        //Plattengröße
        int platesizeX = plate.length;
        int platesizeY = plate[0].length;

        //Plattenkoordinaten
        int plateX = 60;
        int plateY = 60;

        //Position, von der die Maus die Platte zieht
        int dragFromX = 0;
        int dragFromY = 0;

        //bei "true" kann die Platte nach Mausklick gezogen werden
        boolean candrag = false;

        public void mousePressed(MouseEvent mmp) {

            new Thread() {
                @Override
                public void run() {
                    int x = mmp.getX();
                    int y = mmp.getY();

                    if (x >= plateX && x <= (plateX + platesizeY) && y >= plateY && y <= (plateY + platesizeX)) {

                        candrag = true;
                        dragFromX = x - plateX;
                        dragFromY = y - plateY;
                    }
                    else {
                        candrag = false;
                    }
                    System.out.println("Hallo");
                }
            }.start();

        }

        @Override
        public void mouseDragged(MouseEvent mmd) {

            new Thread() {
                @Override
                public void run() {
                    if (candrag) {


                        //Plattenposition wechseln
                        plateX = mmd.getX() - dragFromX;
                        plateY = mmd.getY() - dragFromY;

                        //Entferne die Platte nicht aus dem Fenster
                        plateX = Math.max(plateX, 0);
                        plateX = Math.min(plateX, getWidth() - platesizeY);

                        plateY = Math.max(plateY, 0);
                        plateY = Math.min(plateY, getHeight() - platesizeX);
                        repaint();
                    }
                }
            }.start();

        }

        public void mouseExited(MouseEvent mme) {

            candrag = false;

        }

        @Override
        public void mouseMoved(MouseEvent arg0) {
            // TODO Auto-generated method stub

        }

        @Override
        public void mouseClicked(MouseEvent arg0) {
            // TODO Auto-generated method stub

        }

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

        }

        @Override
        public void mouseReleased(MouseEvent arg0) {
            // TODO Auto-generated method stub

        }
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {

//          Plate plate = new Plate();
            @Override
            public void run() {
                JFrame f = new JFrame();
                f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);



                Plate g2d = new Plate(2, 3, EFieldStatePlate.B6, EFieldStateMarble.EMPTY);
                g2d.setPreferredSize(new Dimension(650, 650));

                f.add(g2d);
                f.pack();
                f.setLocation(200, 800);
                f.setVisible(true);

            }


        });

    }
}

【问题讨论】:

  • 欢迎来到 StackOverflow。虽然提供代码来说明您的问题是一个好主意,但您的代码过于广泛,而且似乎不太清楚您在问什么。请看如何提供minimal, complete and verifiable example
  • @hotzst:在这种情况下不需要。他没有给任何东西添加鼠标监听器。作为一个社区 wiki 回答,因为我不想要一个重要的答案是:“RTFM”。

标签: java swing user-interface mousemotionlistener


【解决方案1】:

您的代码中没有对addMouseListener(...)addMouseMotionListener(...) 的调用。您需要将监听器添加到 Swing 组件才能使监听器工作——换句话说,监听器必须监听 something。例如,

// Konstruktor
public Plate(int r, int c, EFieldStatePlate fieldStatePlate,
        EFieldStateMarble fieldStateMarble) {
    plate = new String[r][c];
    for (r = 0; r < plate.length; r++) { 
        for (c = 0; c < plate[r].length; c++) { 
            plate[r][c] = fieldStatePlate.toString() + fieldStateMarble.toString(); 
        }
    }

    // ***** added *****
    PlateDragged plateDragged = new PlateDragged();
    addMouseListener(plateDragged);
    addMouseMotionListener(plateDragged);
}

坦率地说,这种性质的问题,对于 MouseListener 的使用非常基本,建议您通过猜测进行编码,而无需先学习教程。为了你,不要这样做。请查看MouseListener Tutorial

其他问题:为什么要从 Swing 事件线程中创建一个线程并从中调用代码?

【讨论】:

    猜你喜欢
    • 2013-09-22
    • 1970-01-01
    • 2016-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-25
    相关资源
    最近更新 更多