java如何避免鼠标焦点出现字段故障
当我把鼠标指针拖到处理窗口外时,我的程序会做出意想不到的反应。如何复制:
- 将鼠标指针悬停在“MIN”字段上,同时按住鼠标左键,尝试更改字段中数字的值李>
- 以平均速度拖动鼠标指针,或向左再向右拖动鼠标指针,使其超出在不释放鼠标左键的情况下打开应用程序窗口李>
- 现在不满足以下条件:
- 最小<;麦克斯
- 始终为最小值-最大值的500个单位
- 最大值>;闵
- 从最小值到最大值+500个单位
请注意,只有当鼠标指针移出屏幕区域时,才会观察到这种效果应用程序窗口。有没有办法消除这种影响,或者如何避免
如果你不把鼠标指针移到窗口大小的区域上,那么一切都不会有问题
С代码:
import controlP5.*;
ControlP5 cp5;
// range constants
final float RANGE_MIN = 7.4;
final float RANGE_MAX = 16.8;
// the smallest allowed difference between min/max values
final float RANGE_MIN_DIFFERENCE = 1;
final float RANGE_MID = RANGE_MIN + ((RANGE_MAX - RANGE_MIN) / 2);
float minValue;
float maxValue;
Numberbox inputMin;
Numberbox inputMax;
void setup() {
size(700, 400);
PFont font = createFont("arial", 18);
cp5 = new ControlP5(this);
inputMin = cp5.addNumberbox("minValue")
.setPosition(360, 240)
.setSize(80, 30)
.setColorValue(0xffffff00)
.setFont(font)
.setScrollSensitivity(1.1)
// set initial acceptable range
.setMin(RANGE_MIN)
.setMax(RANGE_MAX)
// set default value
.setMultiplier(0.01)
.setDirection(Controller.HORIZONTAL)
.setValue(7.4);
Label labelinputMin = inputMin.getCaptionLabel();
labelinputMin.setFont(font);
labelinputMin.setColor(color(#00ffff));
labelinputMin.toUpperCase(false);
labelinputMin.setText("MIN");
labelinputMin.align(ControlP5.LEFT_OUTSIDE, CENTER);
labelinputMin.getStyle().setPaddingLeft(-100);
inputMax = cp5.addNumberbox("maxValue")
.setPosition(360, 300)
.setSize(80, 30)
.setColorValue(0xffffff00)
.setFont(font)
.setScrollSensitivity(1.1)
// set initial acceptable range
.setMin(RANGE_MIN)
.setMax(RANGE_MAX)
// set default value
.setMultiplier(0.01)
.setDirection(Controller.HORIZONTAL)
.setValue(RANGE_MID + 1);
Label labelinputMax= inputMax.getCaptionLabel();
labelinputMax.setFont(font);
labelinputMax.setColor(color(#00ffff));
labelinputMax.toUpperCase(false);
labelinputMax.setText("МAX");
labelinputMax.align(ControlP5.LEFT_OUTSIDE, CENTER);
labelinputMax.getStyle().setPaddingLeft(-93);
textFont(font);
}
void draw() {
constrainRangeInputs();
background(0);
fill(255);
text("minValue: " + minValue + "\n" +
"maxValue: " + maxValue, 10, 15);
}
void controlEvent(ControlEvent event) {
println(event.getController().getName(), "changed value to", event.getValue(), "RANGE_MIN = ", minValue, "RANGE_MAX = ", maxValue);
}
void constrainRangeInputs() {
float rangeMinInt = (float)inputMin.getValue();
float rangeMaxInt = (float)inputMax.getValue();
//
if (abs(rangeMaxInt - rangeMinInt) < RANGE_MIN_DIFFERENCE) {
if (rangeMaxInt > RANGE_MID) {
inputMin.setValue(rangeMaxInt - RANGE_MIN_DIFFERENCE);
} else {
inputMax.setValue(rangeMinInt + RANGE_MIN_DIFFERENCE);
}
}
}
# 1 楼答案
这个问题是由您编写的内容和处理
draw()
循环的方式混合而成的,它受到FPS的限制,在您的情况下可能是60,因为您没有设置它constrainRangeInputs
方法由draw()
循环调用,但不由Numberbox.updateInternalEvents
方法调用。如果FPS非常低,numberbox可以在draw()
方法的两个循环之间更新几次,即使我们看不到它,因为它没有直观地更新然后,当
draw()
循环完成它的任务时,它调用constrainRangeInputs()
方法问题在于:
绝对数使得
rangeMinInt
可能高于rangeMaxInt
如果它足够高的话。下面是一个发生时间的例子:这与走出窗口无关(如果你改变窗口的大小使其非常宽,你就可以重现这个问题,我是通过实验做到的)。问题是,当
constrainRangeInputs()
完成它的工作时,当前的数字已经足够高,足以符合您的条件这是因为在
draw()
循环的两次迭代之间,鼠标移动的速度足以覆盖RANGE_MIN_DIFFERENCE
以上的区域您可以通过去掉
abs()
来轻松解决这个问题。我不知道为什么它在一开始是相关的,但是当你从现有的代码中修改它时,它可能是原始代码的产物所以:改变这一行
而对于这一点:
希望能有所帮助,这比看起来更棘手。玩得开心