Java 如何使用鼠标焦点避免字段故障
当我将鼠标指针拖到处理窗口外时,我的程序会做出意外的反应。如何复制:Java 如何使用鼠标焦点避免字段故障,java,processing,control-p5,Java,Processing,Control P5,当我将鼠标指针拖到处理窗口外时,我的程序会做出意外的反应。如何复制: 将鼠标指针悬停在“MIN”字段上,同时按住鼠标左键,尝试更改字段中数字的值 以平均速度拖动鼠标指针,或向左然后向右拖动鼠标指针,使其超出在不释放鼠标左键的情况下打开应用程序窗口 现在不满足以下条件: 最小值最小值 从最小值到最大值+500个单位 请注意,只有当鼠标指针移出区域时,才会观察到这种效果应用程序窗口。有没有办法消除这种影响或如何避免 如果您不将鼠标指针移到窗口大小区域上,则一切正常 С代码: impor
- 最小值<最大值
- 始终从最大值到最小值-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);
}
}
}
导入控制p5.*;
控制p5-cp5;
//量程常数
最终浮动范围_MIN=7.4;
最终浮动范围_MAX=16.8;
//最小/最大值之间允许的最小差值
最终浮动范围\最小\差值=1;
最终浮动范围\中间=范围\最小值+((范围\最大值-范围\最小值)/2);
浮动最小值;
浮点最大值;
Numberbox inputMin;
Numberbox输入最大值;
无效设置(){
大小(700400);
PFont font=createFont(“arial”,18);
cp5=新控制P5(本);
inputMin=cp5.addNumberbox(“minValue”)
.设置位置(360、240)
.设置大小(80,30)
.setColorValue(0xffffff00)
.setFont(字体)
.SetScroll灵敏度(1.1)
//设置初始可接受范围
.setMin(范围_MIN)
.setMax(最大范围)
//设置默认值
.设定乘数(0.01)
.设置方向(控制器水平)
.设定值(7.4);
Label labelinputMin=inputMin.getCaptionLabel();
labelinputMin.setFont(字体);
labelinputMin.setColor(颜色(#00ffff));
labelinputMin.toUpperCase(假);
labelinputMin.setText(“MIN”);
labelinputMin.align(控件P5.LEFT_外侧,中间);
labelinputMin.getStyle().setPaddingLeft(-100);
inputMax=cp5.addNumberbox(“maxValue”)
.设置位置(360300)
.设置大小(80,30)
.setColorValue(0xffffff00)
.setFont(字体)
.SetScroll灵敏度(1.1)
//设置初始可接受范围
.setMin(范围_MIN)
.setMax(最大范围)
//设置默认值
.设定乘数(0.01)
.设置方向(控制器水平)
.设定值(范围_MID+1);
Label labelinputMax=inputMax.getCaptionLabel();
labelinputMax.setFont(字体);
labelinputMax.setColor(颜色(#00ffff));
labelinputMax.toUpperCase(假);
labelinputMax.setText(“МAX”);
labelinputMax.align(控件P5.LEFT_外侧,中心);
labelinputMax.getStyle().setPaddingLeft(-93);
文本字体(字体);
}
作废提款(){
约束输入();
背景(0);
填充(255);
文本(“minValue:+minValue+”\n”+
“最大值:”+maxValue,10,15);
}
无效控制事件(控制事件){
println(event.getController().getName(),“将值更改为”,event.getValue(),“RANGE_MIN=”,minValue,“RANGE_MAX=”,maxValue);
}
void constraintrangeinputs(){
float rangeMinInt=(float)inputMin.getValue();
float rangeMaxInt=(float)inputMax.getValue();
//
if(绝对值(范围最大值-范围最小值)<范围最小值差){
如果(rangeMaxInt>RANGE\u MID){
inputMin.setValue(rangeMaxInt-范围最小值差);
}否则{
输入最大设定值(最小量程+最小量程差);
}
}
}
这个问题是由您编写的内容和处理的draw()
循环的方式混合而成的,它受到FPS的限制,在您的情况下可能是60,因为您没有设置它
constraintRangeInputs
方法由draw()
循环调用,但不是Numberbox.updateInternalEvents
方法调用。如果FPS非常低,numberbox可能会在draw()
方法的两个循环之间更新多次,即使我们不会看到它,因为它没有直观地更新
然后,当draw()
循环完成它的任务时,它调用您的constraintRangeInputs()
方法
问题在于:
if (abs(rangeMaxInt - rangeMinInt) < RANGE_MIN_DIFFERENCE) {
这与离开窗口无关(如果你改变窗口的大小使其非常宽,你将能够重现问题,我是通过实验来实现的)。问题是,当ConstraintRangeInputs()
完成它的工作时,当前的数字已经足够高,足以符合您的条件
这是因为在draw()
循环的两次迭代之间,鼠标移动速度足够快,覆盖的范围超过了RANGE\u MIN\u差值
您可以通过去掉abs()
轻松解决此问题。我不知道为什么它在一开始是相关的,但是当您从现有代码中修改它时,它可能是来自原始代码的工件
所以:改变这一行
if (abs(rangeMaxInt - rangeMinInt) < RANGE_MIN_DIFFERENCE) {
if(abs(rangeMaxInt-rangeMinInt)
为此:
if (rangeMaxInt - rangeMinInt < RANGE_MIN_DIFFERENCE) {
if(rangeMaxInt-rangeMinInt
希望它能有所帮助,这比看起来更棘手。祝你玩得开心!我不确定我是否理解。请你澄清以下几点:(1)如何一步一步地重现问题;(2)期望的结果是什么;(3)当前有问题的结果是什么。你可以编辑你的帖子来添加这些信息(然后在评论中给我贴上标签让我知道,这样我就不会忘记这一点)。亲爱的编辑的帖子。当然,也许我发现了这个小问题,但似乎这样的事情不应该发生。太好了,我更加自信代码中没有鼠标焦点的约束,但一个有能力的人展示了所有细节。
if (rangeMaxInt - rangeMinInt < RANGE_MIN_DIFFERENCE) {