拖放填充形状与未填充形状 [作业]
Drag and drop filled shapes vs unfilled shapes [Homework]
我正在为家庭作业制作一个 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());
}
}
}
松开鼠标
public void mouseReleased(MouseEvent e) {
if (SwingUtilities.isRightMouseButton(e)) {
indexToMove = -1;
}
}
这是相关形状 CLASS 代码
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);
}
}
这是我检查它是否 FILLED/UNFILLED 的地方
只有在我拖放未填充的形状一次后才会出现系统故障
@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;
}
}
知道这是相当多的代码,我试图删除任何看起来不相关的内容。如果您需要查看更多,请告诉我!
回答了我自己的问题。
当您右击时,indexToMove 没有分配给任何东西,因为直到形状被移动后它才会注册它不应该被移动。
我将 indexToMove 的值设置为 -1,因此当您启动该形状时,该形状将不可拖动。
我正在为家庭作业制作一个 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());
}
}
}
松开鼠标
public void mouseReleased(MouseEvent e) {
if (SwingUtilities.isRightMouseButton(e)) {
indexToMove = -1;
}
}
这是相关形状 CLASS 代码
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);
}
}
这是我检查它是否 FILLED/UNFILLED 的地方 只有在我拖放未填充的形状一次后才会出现系统故障
@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;
}
}
知道这是相当多的代码,我试图删除任何看起来不相关的内容。如果您需要查看更多,请告诉我!
回答了我自己的问题。
当您右击时,indexToMove 没有分配给任何东西,因为直到形状被移动后它才会注册它不应该被移动。
我将 indexToMove 的值设置为 -1,因此当您启动该形状时,该形状将不可拖动。