我正在编写代码,拍摄屏幕的图片,然后逐个像素地检查某个RGB值。然后,我想让它在RGB值上单击一次,然后中断,但由于某种原因,循环一直在所有像素上运行,忽略我输入的中断命令,单击该颜色的所有像素,而不是单击一次。有什么解决办法吗?
for (int i=0; i<image.getWidth()-1; i++){
x += 1;
int y = 0;
for (int j=0; j<image.getHeight()-1; j++){
y += 1;
int c = image.getRGB(x,y);
int red = (c & 0x00ff0000) >> 16;
int green = (c & 0x0000ff00) >> 8;
int blue = c & 0x000000ff;
// and the Java Color is ...
Color color = new Color(red,green,blue);
Color iron = new Color(0,255,0);
if (color.equals(iron)){
Robot move = new Robot();
move.mouseMove(x,y);
Thread.sleep(500);
move.mousePress(InputEvent.BUTTON1_DOWN_MASK);
move.mouseRelease(InputEvent.BUTTON1_DOWN_MASK);
System.out.println(iron);
break;
}
}
}
其他解决方案都很好,但值得一提的是,java有一个标记的中断
。
因此
ImageLoop:
for (int i=0; i<image.getWidth()-1; i++){
x += 1;
int y = 0;
for (int j=0; j<image.getHeight()-1; j++){
y += 1;
int c = image.getRGB(x,y);
int red = (c & 0x00ff0000) >> 16;
int green = (c & 0x0000ff00) >> 8;
int blue = c & 0x000000ff;
// and the Java Color is ...
Color color = new Color(red,green,blue);
Color iron = new Color(0,255,0);
if (color.equals(iron)){
Robot move = new Robot();
move.mouseMove(x,y);
Thread.sleep(500);
move.mousePress(InputEvent.BUTTON1_DOWN_MASK);
move.mouseRelease(InputEvent.BUTTON1_DOWN_MASK);
System.out.println(iron);
flag = true;
break imageLoop; // <--
}
}
}
就像有些人说的,可以用旗子。
我经常只是将代码提取到一个新方法中,然后返回结果。因此,在您的情况下,您必须将2 for循环放入另一个方法中,给出适当的参数并在“break”语句处返回。
当程序输入 if 语句时,您可以返回布尔值,该布尔值为 true;如果它未输入 if 语句,则可以返回 false。但是,当然,它基本上可以返回您想要的任何东西。
你可以做的是在你的第一个for循环之外创建一个标志变量,并将其设置为false。在第一个循环中检查标志是否为真,如果条件为真,则中断循环,在else部分,您可以运行第二个for循环,当条件为真时,在第二个循环中运行。将标志设置为高,并打破内部循环。
flag = false;
for (int i=0; i<image.getWidth()-1; i++){
if(flag)
break;
x += 1;
int y = 0;
for (int j=0; j<image.getHeight()-1; j++){
y += 1;
int c = image.getRGB(x,y);
int red = (c & 0x00ff0000) >> 16;
int green = (c & 0x0000ff00) >> 8;
int blue = c & 0x000000ff;
// and the Java Color is ...
Color color = new Color(red,green,blue);
Color iron = new Color(0,255,0);
if (color.equals(iron)){
Robot move = new Robot();
move.mouseMove(x,y);
Thread.sleep(500);
move.mousePress(InputEvent.BUTTON1_DOWN_MASK);
move.mouseRelease(InputEvent.BUTTON1_DOWN_MASK);
System.out.println(iron);
flag = true;
break;
}
}
}
问题内容: 我尝试了这个: 只能得到: :声明前缺失 那么,我将如何打破JavaScript中的嵌套循环? 问题答案: 您应该能够打破标签,就像这样:
问题内容: 我已经设置了一个线程,我想使用循环来运行它。因此,该线程应在循环中运行并在一定时间内中断,然后再次运行循环。 请我不知道该怎么做。有人可以指导我。 问题答案: 假设您在JDK 1.5或更高版本(澄清和改进了内存模型)上运行,则可以使用 或者,使用java.util.concurrent.Future和FutureTask,它们支持立即取消。
问题内容: 在我的代码中,我有一个for循环,迭代一个代码方法,直到满足for条件为止。 反正有没有打破这个for循环? 因此,如果我们看下面的代码,如果我们想在达到“ 15”时打破这个for循环,该怎么办? 我尝试了以下无济于事: 我尝试了一个循环: 我可以实现我想要的唯一方法是打破for循环,我不能暂时将其替换,如果要使用if语句。 编辑: 仅作为示例提供了此代码,这不是我试图将其实现的代码。
问题内容: 您将如何格式化这样的长行?我希望宽度不超过80个字符: 这是我最好的选择吗? 问题答案: 那是一个开始。在使用长字符串的代码之外定义更长的字符串并不是一个坏习惯。这是分离数据和行为的一种方式。您的第一个选择是通过使字符串文字彼此相邻来隐式地将它们连接在一起: 或使用行尾连续符,这有点脆弱,因为它可以工作: 但这不是: 看到不同?没有?好吧,也不会是您的代码。 隐式连接的不利之处在于,它
问题内容: 我有一个像这样的嵌套循环构造: 现在如何摆脱两个循环?我看过类似的问题,但没有一个是Java特有的。我无法应用这些解决方案,因为大多数使用的gotos。 我不想将内部循环使用其他方法。 我不想重新运行循环。中断时,我完成了循环块的执行。 问题答案: 像其他答复者一样,我绝对希望将循环放入另一种方法中,此时你可以返回以完全停止迭代。该答案仅显示了如何满足问题中的要求。 你可以将break
问题内容: 我知道,如果你将装箱的原始整数与常量进行比较,例如: 将自动取消装箱,比较将起作用。 但是,当你比较两个装箱并想比较等于或小于/大于时会发生什么? 上面的代码是否会导致检查它们是否是同一对象,或者在这种情况下会自动拆箱? 关于什么: ? 问题答案: 不,在Integer,Long等之间==,将检查引用是否相等 -即 这将检查是否x并y引用相同的对象而不是相等的对象。 所以 保证可以打印