当鼠标左键单击时,水平相邻的颜色应该交换,当鼠标右键单击时,垂直相邻的颜色应该交换。当我单击这两个按钮中的任何一个时,没有任何反应。
有问题的代码:
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
}
以及启动它的代码:
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();
}
}
发布于 2012-11-09 11:57:59
最终的代码是这样的:
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
}
而且它运行得很好。有一个颜色问题来自复制/粘贴错误,我没有捕捉到,但已经修复。
发布于 2012-11-09 11:26:23
你有两个问题。
mouseX >= topLeft.getX() && mouseX <= topLeft.getWidth()
这是检查鼠标位置是否大于或等于块x位置(这很好),并且小于或等于它的宽度...?因此,如果我有一个宽度为10、宽度为100的框,而我在105处单击,则此检查将失败。
105 >= 100 && 105 < 10 // .... ???
然后是这个..。
mouseY >= topLeft.getY() && mouseY <= topLeft.getY()
花一点时间来检查最后一个条件……你必须准确地点击块的顶端,才能使这个条件为真。
我会做两件事中的一件。
要么我会写一个方法,对任何块执行这个计算...
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
方法……
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;
}
}
在你的鼠标点击事件处理程序中...
if (topLeft.contains(e.getPoint()) { ... }
发布于 2012-11-09 09:51:07
https://stackoverflow.com/questions/13300442
复制相似问题