2016-10-30 149 views
0

我正在做一个家庭作业的ms绘画风格程序。在这个家庭作业中,你应该能够右击一个形状并在屏幕上移动它。填充的形状可以在形状内部的任何地方右键单击,其中未填充的形状应该右键单击并在形状的边界上进行选择。拖放填充的形状与未填充的形状[作业]

我遇到的问题是,当我最初启动程序时,绘制和未填充的形状,并试图拖动它,它会拖动,但一旦我再次放下它,它的行为是正确的,并成为不可复制的,所有未来未填充的形状相应地起作用

TLDR:我希望所有填充的形状都是可拖动的,并且所有未填充的形状都是不可裁剪的。如果它是第一个放置的形状,未填充的形状(出于某种原因)可拖动。拖曳未填充的形状后,它的行为正确。

下面是相关的代码:

private boolean isFilled = false; 
private JCheckBox fill = new JCheckBox("Filled"); 
private int indexToMove; 

涂料成份

public void paintComponent(Graphics g) { 
super.paintComponent(g); 
g.setColor(Color.WHITE); 
g.clearRect(0, 0, getWidth(), getHeight()); 

for (int i = 0; i < shapes.size(); i++) { 
    shapes.get(i).draw(g); 
} 

repaint(); 

} 

的actionPerformed我补扣

else if (e.getSource() == fill) { 
    if (fill.isSelected()) { 
    isFilled = true; 
    } else { 
    isFilled = false; 
    } 
} 

这是我开始拖放

部分

鼠标的时候按住

public void mousePressed(MouseEvent e) { 

if (SwingUtilities.isRightMouseButton(e)) { 
    for (int i = 0; i < shapes.size(); i++) { 
    if (shapes.get(i).isSelected(e.getX(), e.getY())) { 
     System.out.println("Shape contained in: " + i); 
     indexToMove = i; 
    } 
    } 
} 
} 

鼠标拖动

public void mouseDragged(MouseEvent e) { 

if (SwingUtilities.isRightMouseButton(e)) { 
    if (indexToMove >= 0) { 
    shapes.get(indexToMove).move(e.getX(), e.getY()); 
    } 
} 
} 

MOUSE RELEASED

public void mouseReleased(MouseEvent e) { 
if (SwingUtilities.isRightMouseButton(e)) { 
    indexToMove = -1; 
} 
} 

这些是相关SHAPE类代码

public class MyRectangle extends Rectangle implements MyShape { 
private Color color; 
private boolean filled = false; 
private int x, y, dx, dy, height, width; 

public MyRectangle(Color color, boolean filled, int x, int y, int endX, int endY) { 
this.color = color; 
this.filled = filled; 
this.x = x; 
this.y = y; 
this.dx = endX; 
this.dy = endY; 

} 

@Override 
public void draw(Graphics g) { 

... 

if (!filled) { 

    g.drawRect(x, y, width, height); 
} 

if (filled) { 
    g.fillRect(x, y, width, height); 
} 
} 

这是我检查它是否填充/ UNF ILLED 制出的只发生后,我拖放填充的形状ONE TIME

@Override 
public boolean isSelected(int clickX, int clickY) { 
boolean selected = false; 
if(filled == false){ 
    System.out.println("unfilled shape, do not move"); 
    selected = false; 
} 

else if (filled == true) { 
    if ((clickX > x) && (clickX < dx) && (clickY > y) && (clickY < dy)) { 

    selected = true; 
    } else { 
    selected = false; 
    } 
} 


return selected; 
} 


public void move(int offsetX, int offsetY) { 

int centerX = (dx + x)/2; 
int centerY = (dy + y)/2; 
System.out.println("CenterX: " + centerX + " CenterY: " + centerY); 

if (offsetX > centerX) { 

    offsetX = offsetX - centerX; 
    x += offsetX; 
    dx += offsetX; 
} else if (offsetX < centerX) { 

    offsetX = centerX - offsetX; 
    x -= offsetX; 
    dx -= offsetX; 
} 

if (offsetY > centerY) { 

    offsetY = offsetY - centerY; 

    y += offsetY; 
    dy += offsetY; 
} 

else if (offsetY < centerY) { 

    offsetY = centerY - offsetY; 
    y -= offsetY; 
    dy -= offsetY; 
} 

} 

知道这是相当多的代码,我试图砍掉任何似乎并不相关。让我知道你是否需要看更多!

回答

0

回答了我自己的问题。

当你右键点击时,indexToMove没有被分配给任何东西,直到它被移动后它才会注册它不应该被移动。

我给indexToMove的值-1,所以当你开始的形状将不可拖动。