当前位置: 首页 > 知识库问答 >
问题:

拖放填充形状vs未填充形状[作业]

凤高澹
2023-03-14

我正在为一个家庭作业制作一个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();

}

在“我的填充”按钮上执行的操作

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

鼠标已释放

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

这是我检查它是否填充/未填充的地方,系统输出只发生在我拖放一次未填充的形状之后

@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个答案

郦何平
2023-03-14

回答了我自己的问题。

右键单击时,indexToMove没有分配给任何东西,因为直到形状移动后,它才会注册它不应该移动。

我给indexToMove的值是-1,所以当您启动时,形状将不可拖动。

 类似资料:
  • 问题内容: 我在这里有一个 我想使用svg创建星星。 我想抚摸星星的外面。在我的示例中,笔画在剖析内部形状的每一行上。 也可以将星形填充一半。 我想将其用于星级评定,但是我需要一半甚至四分之一的填充量。 问题答案: 您也可以使用过滤器执行此操作。这是一个动画填充:

  • 现在,我当前的渲染代码如下: 着色器: 假设我想像JavaAWT一样,成功地填充这个形状。。。我该怎么做?(已经尝试使用GL_多边形,但它只填充整个O,我有一个填充圆,而不是O。也尝试使用jogamp glu的部分,但它只是没有渲染任何东西,不知道为什么)

  • 我在这方面收效甚微。我想到的唯一一件事就是在我想要的圆所占的空间周围画出巨大的拱形,因为我很难计算出数学来。 编辑:为什么我不能填满整个图像,然后再画圆圈,因为圆圈里的不是单一的颜色,而是我想拍摄一张图像(任何图像,比如我自己的照片),并能够在图像中间的圆圈周围添加单一的颜色。所以,在画它之前,圆圈中间的东西就已经存在了,它不是由代码绘制的。

  • 我一直在寻找一段时间,现在在如何填补一个形状与一定的颜色使用乌龟在java。假设我有这样的东西: 其中是:

  • 我可以在Google地图中绘制多边形。现在,当我在地图上绘制完该区域的多边形时,我想用相同的图标填充该多边形。我可以用颜色填充多边形,但我想用边框有一些填充和图标之间有一些指定空间的图标填充它。我该怎么做?

  • 我是JavaFX动画的新手。我正在尝试遵循代码作为另一个大项目的试用;基本上我想用鼠标拖动来移动圆圈,当圆圈在矩形上时,突出显示矩形。如果圆圈落在矩形上,请将其颜色更改为圆圈的颜色。 到目前为止,我已经设法用鼠标移动圆圈,但我不确定为什么矩形的OnDragEntered方法什么都不做。 以下是FXML: 这是控制器: 包装com.sc.colordx.controller; 这是正确的方法吗?还是