Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/399.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用鼠标焦点避免字段故障_Java_Processing_Control P5 - Fatal编程技术网

Java 如何使用鼠标焦点避免字段故障

Java 如何使用鼠标焦点避免字段故障,java,processing,control-p5,Java,Processing,Control P5,当我将鼠标指针拖到处理窗口外时,我的程序会做出意外的反应。如何复制: 将鼠标指针悬停在“MIN”字段上,同时按住鼠标左键,尝试更改字段中数字的值 以平均速度拖动鼠标指针,或向左然后向右拖动鼠标指针,使其超出​​在不释放鼠标左键的情况下打开应用程序窗口 现在不满足以下条件: 最小值最小值 从最小值到最大值+500个单位 请注意,只有当鼠标指针移出区域时,才会观察到这种效果​​应用程序窗口。有没有办法消除这种影响或如何避免 如果您不将鼠标指针移到窗口大小区域上,则一切正常 С代码: impor

当我将鼠标指针拖到处理窗口外时,我的程序会做出意外的反应。如何复制:

  • 将鼠标指针悬停在“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);
        }
      }
    }
    
    导入控制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) {