首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >单击鼠标时程序不执行功能

单击鼠标时程序不执行功能
EN

Stack Overflow用户
提问于 2012-11-09 08:42:15
回答 3查看 248关注 0票数 3

当鼠标左键单击时,水平相邻的颜色应该交换,当鼠标右键单击时,垂直相邻的颜色应该交换。当我单击这两个按钮中的任何一个时,没有任何反应。

有问题的代码:

代码语言:javascript
运行
复制
import java.awt.Color;
import java.awt.Graphics;
import javax.swing.JPanel;

import sun.java2d.loops.DrawRect;

import java.awt.event.MouseListener;
import java.awt.event.MouseEvent;

public class Board extends JPanel implements MouseListener
{
//instance variables
private int width;
private int height;
private Block topLeft;
private Block topRight;
private Block botLeft;
private Block botRight;

public Board()  //constructor
{
    width = 200;
    height = 200;
    topLeft=new Block(0,0,width/2-10,height/2-10,Color.RED);
    topRight=new Block(width/2,0,width/2-10,height/2-10,Color.GREEN);
    botLeft=new Block(0,height/2,width/2-10,height/2-10,Color.BLUE);
    botRight=new Block(width/2,height/2,width/2-10,height/2-10,Color.YELLOW);
    setBackground(Color.WHITE);
    setVisible(true);
    //start trapping for mouse clicks
    addMouseListener(this);
}

//initialization constructor
 public Board(int w, int h)  //constructor
 {
    width = w;
    height = h;
    topLeft=new Block(0,0,width/2-10,height/2-10,Color.RED);
    topRight=new Block(width/2,0,width/2-10,height/2-10,Color.GREEN);
    botLeft=new Block(0,height/2,width/2-10,height/2-10,Color.BLUE);
    botRight=new Block(width/2,height/2,width/2-10,height/2-10,Color.YELLOW);
    setBackground(Color.WHITE);
    setVisible(true);
    //start trapping for mouse clicks
    addMouseListener(this);
}



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

public void paintComponent(Graphics window)
 {
super.paintComponent(window);
topRight.draw(window);
topLeft.draw(window);
botRight.draw(window);
botLeft.draw(window);


}

 public void swapTopRowColors()
{
Color temp = topLeft.getColor();
topLeft.setColor(topRight.getColor());
topRight.setColor(temp);
repaint();
}

public void swapBottomRowColors()
{
   Color temp = botLeft.getColor();
   botLeft.setColor(botRight.getColor());
   botRight.setColor(temp);
   repaint();
}

public void swapLeftColumnColors()
{
   Color temp = botLeft.getColor();
   botLeft.setColor(topLeft.getColor());
   topLeft.setColor(temp);
   repaint();
}

public void swapRightColumnColors()
{
   Color temp = botRight.getColor();
   botRight.setColor(topRight.getColor());
   topRight.setColor(temp);
   repaint();
}

public void mouseClicked(MouseEvent e)
{
    int mouseX=e.getX();
    int mouseY=e.getY();
    int mouseButton = e.getButton();

    if(mouseButton==MouseEvent.BUTTON1)     //left mouse button pressed
    {
        if(mouseX>=topLeft.getX() && mouseX<=topLeft.getWidth() && mouseY>=topLeft.getY() && mouseY<=topLeft.getY())
        {
            this.swapTopRowColors();
        }

        else if(mouseX>=topRight.getX() && mouseX<=topRight.getWidth() && mouseY>=topRight.getY() && mouseY<=topRight.getY())
        {
            this.swapTopRowColors();
        }

        else if(mouseX>=botLeft.getX() && mouseX<=botLeft.getWidth() && mouseY>=botLeft.getY() && mouseY<=botLeft.getY())
        {
            this.swapBottomRowColors();
        }

        else if(mouseX>=botRight.getX() && mouseX<=botRight.getWidth() && mouseY>=botRight.getY() && mouseY<=botRight.getY())
        {
            this.swapBottomRowColors();
        }

    }
    //right mouse button pressed
    if(mouseX>=topLeft.getX() && mouseX<=topLeft.getWidth() && mouseY>=topLeft.getY() && mouseY<=topLeft.getY())
    {
        this.swapLeftColumnColors();
    }

    else if(mouseX>=topRight.getX() && mouseX<=topRight.getWidth() && mouseY>=topRight.getY() && mouseY<=topRight.getY())
    {
        this.swapRightColumnColors();
    }

    else if(mouseX>=botLeft.getX() && mouseX<=botLeft.getWidth() && mouseY>=botLeft.getY() && mouseY<=botLeft.getY())
    {
        this.swapLeftColumnColors();
    }

    else if(mouseX>=botRight.getX() && mouseX<=botRight.getWidth() && mouseY>=botRight.getY() &&    mouseY<=botRight.getY())
    {
        this.swapRightColumnColors();
    }









}

public void mouseEntered(MouseEvent e) { }
public void mouseExited(MouseEvent e) { }
public void mousePressed(MouseEvent e) { }
public void mouseReleased(MouseEvent e) { }

//toString
}

以及启动它的代码:

代码语言:javascript
运行
复制
import javax.swing.JFrame;

public class BlockGame extends JFrame
{
private static final int WIDTH = 800;
private static final int HEIGHT = 600;

public BlockGame()
{
    super("Board");
    setSize(WIDTH,HEIGHT);

    getContentPane().add(new Board(500,500));

    setVisible(true);
}

public static void main( String args[] )
{
    BlockGame run = new BlockGame();

}
}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-11-09 11:57:59

最终的代码是这样的:

代码语言:javascript
运行
复制
import java.awt.Color;
import java.awt.Graphics;
import javax.swing.JPanel;

//import sun.java2d.loops.DrawRect;

import java.awt.event.MouseListener;
import java.awt.event.MouseEvent;

public class Board extends JPanel implements MouseListener
{
//instance variables
private int width;
private int height;
private Block topLeft;
private Block topRight;
private Block botLeft;
private Block botRight;

public Board()  //constructor
{
    width = 200;
    height = 200;
    topLeft=new Block(0,0,width/2-10,height/2-10,Color.RED);
    topRight=new Block(width/2,0,width/2-10,height/2-10,Color.GREEN);
    botLeft=new Block(0,height/2,width/2-10,height/2-10,Color.BLUE);
    botRight=new Block(width/2,height/2,width/2-10,height/2-10,Color.YELLOW);
    setBackground(Color.WHITE);
    setVisible(true);
    //start trapping for mouse clicks
    addMouseListener(this);
}

  //initialization constructor
public Board(int w, int h)  //constructor
{
    width = w;
    height = h;
    topLeft=new Block(0,0,width/2-10,height/2-10,Color.RED);
    topRight=new Block(width/2,0,width/2-10,height/2-10,Color.GREEN);
    botLeft=new Block(0,height/2,width/2-10,height/2-10,Color.BLUE);
    botRight=new Block(width/2,height/2,width/2-10,height/2-10,Color.YELLOW);
    setBackground(Color.WHITE);
    setVisible(true);
    //start trapping for mouse clicks
    addMouseListener(this);
}



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

 public void paintComponent(Graphics window)
 {
super.paintComponent(window);
topRight.draw(window);
topLeft.draw(window);
botRight.draw(window);
botLeft.draw(window);


}

  public void swapTopRowColors()
 {
Color temp = topLeft.getColor();
Color temp2 = topRight.getColor();
topRight.setColor(temp);
topLeft.setColor(temp2);

repaint();
}

public void swapBottomRowColors()
{
   Color temp = botLeft.getColor();
   Color temp2 = botRight.getColor();
   botLeft.setColor(temp2);
   botRight.setColor(temp);
   repaint();
 }

public void swapLeftColumnColors()
{
   Color temp = botLeft.getColor();
   Color temp2 = topLeft.getColor();
   botLeft.setColor(temp2);
   topLeft.setColor(temp);
   repaint();
}

public void swapRightColumnColors()
 {
   Color temp = botRight.getColor();
   Color temp2 = topRight.getColor();
   botRight.setColor(temp2);
   topRight.setColor(temp);
   repaint();
 }

public void mouseClicked(MouseEvent e)
{
    int mouseX=e.getX();
    int mouseY=e.getY();
    int mouseButton = e.getButton();
    //System.out.println("User clicked at " + e.getX() + "," + e.getY());
    if(mouseButton == MouseEvent.BUTTON1)       //left mouse button pressed
    {
        if(((mouseX>= 0 && mouseX <= topLeft.getWidth()-1) && (mouseY>= 0 && mouseY <= (topLeft.getHeight()-1))) || ((mouseX>= topRight.getX() && mouseX <= (topRight.getX()+topRight.getWidth())-1) && (mouseY>= 0 && mouseY <= (topRight.getY()+topRight.getHeight()-1))))
        {
            this.swapTopRowColors();
        }
        else
        {
            this.swapBottomRowColors();
        }





    }
    //right mouse button pressed
    else
    {
        if(((mouseX>= 0 && mouseX <= topLeft.getWidth()-1) && (mouseY>=0 && mouseY <=  (topLeft.getHeight()-1))) || ((mouseX>= botLeft.getX() && mouseX <= (botLeft.getX()+botLeft.getWidth())-1) && (mouseY>= 0 && mouseY <= (botLeft.getY()+(botLeft.getHeight()-1)))))
    {
        this.swapLeftColumnColors();
    }
        else
        {
            this.swapRightColumnColors();
        }




    }





    System.out.println(botLeft.getHeight() + ", " + botLeft.getY());




}

public void mouseEntered(MouseEvent e) {

}
public void mouseExited(MouseEvent e) { }
public void mousePressed(MouseEvent e) { }
public void mouseReleased(MouseEvent e) { }

 //toString
}

而且它运行得很好。有一个颜色问题来自复制/粘贴错误,我没有捕捉到,但已经修复。

票数 0
EN

Stack Overflow用户

发布于 2012-11-09 11:26:23

你有两个问题。

代码语言:javascript
运行
复制
mouseX >= topLeft.getX() && mouseX <= topLeft.getWidth()

这是检查鼠标位置是否大于或等于块x位置(这很好),并且小于或等于它的宽度...?因此,如果我有一个宽度为10、宽度为100的框,而我在105处单击,则此检查将失败。

代码语言:javascript
运行
复制
105 >= 100 && 105 < 10 // .... ???

然后是这个..。

代码语言:javascript
运行
复制
mouseY >= topLeft.getY() && mouseY <= topLeft.getY()

花一点时间来检查最后一个条件……你必须准确地点击块的顶端,才能使这个条件为真。

我会做两件事中的一件。

要么我会写一个方法,对任何块执行这个计算...

代码语言:javascript
运行
复制
public boolean contains(Point p, Block block) {
    return p.x >= block.getX() && p.x <= block.getX() + block.getWidth() && 
            p.y >= block.getY() && p.y <= block.getY() + block.getHeight();
}

这样,如果代码中有bug,它只会出现在一个地方……

或者(最好),我将从Rectangle扩展Block,这样我就可以简单地使用contains方法……

代码语言:javascript
运行
复制
public class Block extends Rectangle {

    private Color color;

    public Block(int x, int y, int width, int height, Color color) {
        super(x, y, width, height);
        this.color = color;
    }

    public void draw(Graphics2D g) {
        g.setColor(color);
        g.fill(this);
    }

    public Color getColor() {
        return color;
    }

    public void setColor(Color color) {
        this.color = color;
    }
}

在你的鼠标点击事件处理程序中...

代码语言:javascript
运行
复制
if (topLeft.contains(e.getPoint()) { ... }
票数 5
EN

Stack Overflow用户

发布于 2012-11-09 09:51:07

  • 我认为您在这里混淆了屏幕和窗口坐标: getX()返回相对于源组件的鼠标坐标,这在本例中可能不是您想要的……
  • 输出一行来检查程序是否确实到达了mouseClicked()函数。
  • 你有4个if语句( if,else if),但是当这4个语句失败时,没有最后的语句,允许程序静默地通过所有这些选项。您显然不期望有任何其他选项,但这可能就是发生的事情--输出一行带有一些调试输出(X,Y,源组件)的行,您可能会学到很多东西。:)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13300442

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档