拖放填充的形状与未填充的形状[Homework]

时间:2016-10-30 19:07:56

标签: java user-interface drag-and-drop paint shapes

我为家庭作业做了一个ms绘画风格的程序。在这个家庭作业中,您应该能够右键单击一个形状并在屏幕上移动它。可以在形状内的任何位置右键单击填充的形状,其中应该在形状的边框上右键单击并选择未填充的形状。

我遇到的问题是,当我最初启动程序时,绘制并填充未填充的形状,并尝试拖动它,它会拖动,但是一旦我再次放下它,它就会表现正常并变得无法抓取,并且所有未来未填充的形状也会相应地发挥作用。

TLDR:我希望所有填充的形状都是可拖动的,并且所有未填充的形状都是不可分割的。未填充的形状(由于某种原因)如果是第一个放置的形状,则可以拖动。将未填充的形状拖动到ONCE后,它的行为正确。

以下是相关代码:

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 on my fill button

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

这是我开始拖延和弃牌的部分

MOUSE PRESSED

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;
    }
    }
}
}

MOUSE DRAGGED

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;
}
}

这是相关的形式代码

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);
}
}

这是我检查是否填充/填充的地方 只有在我拖下并完成一次未填充的形状后,系统才会出现

@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;
}

}

知道这是相当多的代码,我试图删除任何看起来不相关的东西。如果您需要了解更多内容,请与我们联系!

1 个答案:

答案 0 :(得分:0)

回答了我自己的问题。

当你右键单击时,indexToMove并没有分配给任何东西,因为它不会在移动形状之后注册它不应该被移动。

我给indexToMove值-1,所以当你开始时,形状不会被拖拽。