java - 同时选择两个或多个形状
问题描述
我被困在这个问题上:
当我在一个形状内单击时(有一个矩形和圆形的数组列表),我选择它(仅用于调试,将其颜色更改为蓝色)。因此,如果我在外部单击空白区域,我会取消选择它(仅用于调试,将其颜色更改为以前的颜色)。
for(int i=0; i<images.size(); i++){
//checking if the click is inside a shape
if((images.get(i).getLocation().getX() < e.getX() && images.get(i).getLocation().getY() < e.getY() && images.get(i).getX() + images.get(i).getWidth() > e.getX() && images.get(i).getLocation().getY() + images.get(i).getHeight() > e.getY())){
images.get(i).setColor(Color.BLUE);
images.get(i).setIsSelected(true);
//debugging
JOptionPane.showMessageDialog(null, images.get(i).getIsSelected());
repaint();
//JOptionPane.showMessageDialog(null, colors.get(i));
}
else{
images.get(i).setColor(colors.get(i));
//debugging
JOptionPane.showMessageDialog(null, images.get(i).getIsSelected());
images.get(i).setIsSelected(false);
repaint();
}
例如,想象 2 个圆形和 1 个矩形,全部为黑色。我的代码具有以下工作流程:
- 在矩形内单击
- 将其颜色更改为蓝色
- 只是为了调试,它打印“selected == true”(对于矩形),“selected = false”(对于第一个圆圈),“selected = false”,(对于第二个圆圈)
- 点击空白处
- 将矩形的颜色更改为以前的颜色(黑色)
- 只是为了调试,它打印“selected == false”(对于矩形),“selected = false”(对于第一个圆圈),“selected = false”,(对于第二个圆圈)
- 再次在矩形内单击
- 将其颜色更改为蓝色
- 只是为了调试,它打印“selected == true”(对于矩形),“selected = false”(对于第一个圆圈),“selected = false”,(对于第二个圆圈)
- 在圆圈内单击
- 将其颜色更改为蓝色
- 只是为了调试,它打印“selected == true”(对于矩形),“selected = true ”(对于第一个圆圈),“selected = false”,(对于第二个圆圈)
- 问题是:矩形的颜色变回黑色。它应该仍然是蓝色的。
如何同时选择 2 个或更多形状?
解决方案
您的“if”子句设置最近选择的项目的颜色并将其设置为选中;“else”子句将所有其他项目重置为未选中并重置颜色。
这不是正确的方法。
您应该有一个包含图像及其所有属性的 Shape 类。这些属性之一是当前是否选择了该形状。然后,当您重新绘制时,将 Graphics 传递给 Shape 类中的一个方法,该方法将图像重新绘制为选中或未选中。
您应该在一个单独的循环中将所有项目设置为未选中,并且只有在第一个循环未确定单击是在对象中时才会进入该循环。
boolean found = false;
for ( Shape s : images ) {
if ( click is in s ) {
s.setSelected(true);
found = true;
break;
}
}
if ( !found ) {
// set all images to unselected here
}
repaint();
推荐阅读
- wordpress - WordPress - 在一台服务器上维护两个 /wp-admin/ 站点
- c++ - 验证输入是否在范围内
- node.js - findOneAndUpdate 异步等待不返回新文档
- reactjs - React Admin - 具有多个字段输出的 ReferenceInput
- git - 从 git 克隆文件会出现错误“参数过多”
- c# - 获取枚举实例给定它的自定义属性的值
- c - 读取完整目录时的递归函数不会“进入目录”
- javascript - 将表格从 React 导出为 PDF
- javascript - ngModel 在表单中使用时不更新
- python - 用于检查文件名是否存在于文本文件中的 Python 代码