有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何避免鼠标焦点出现字段故障

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

  1. 将鼠标指针悬停在“MIN”字段上,同时按住鼠标左键,尝试更改字段中数字的值
  2. 以平均速度拖动鼠标指针,或向左再向右拖动鼠标指针,使其超出​​在不释放鼠标左键的情况下打开应用程序窗口
  3. 现在不满足以下条件:
  • 最小<;麦克斯
  • 始终为最小值-最大值的500个单位
  • 最大值>;闵
  • 从最小值到最大值+500个单位

请注意,只有当鼠标指针移出屏幕区域时,才会观察到这种效果​​应用程序窗口。有没有办法消除这种影响,或者如何避免

如果你不把鼠标指针移到窗口大小的区域上,那么一切都不会有问题

enter image description here

С代码:

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) 个答案

  1. # 1 楼答案

    这个问题是由您编写的内容和处理draw()循环的方式混合而成的,它受到FPS的限制,在您的情况下可能是60,因为您没有设置它

    constrainRangeInputs方法由draw()循环调用,但不由Numberbox.updateInternalEvents方法调用。如果FPS非常低,numberbox可以在draw()方法的两个循环之间更新几次,即使我们看不到它,因为它没有直观地更新

    然后,当draw()循环完成它的任务时,它调用constrainRangeInputs()方法

    问题在于:

    if (abs(rangeMaxInt - rangeMinInt) < RANGE_MIN_DIFFERENCE) {
    

    绝对数使得rangeMinInt可能高于rangeMaxInt如果它足够高的话。下面是一个发生时间的例子:

    Assuming these values:
    rangeMinInt = 15
    rangeMaxInt = 10
    RANGE_MIN_DIFFERENCE = 1
    
    // Reading these numbers, you already know that this is supposed to be corrected by the constrainRangeInputs() method, but...
    // Doing the math reveals that:
    
    rangeMaxInt - rangeMinInt = -5
    // yet:
    abs(rangeMaxInt - rangeMinInt) = 5
    
    // So:
    abs(rangeMaxInt - rangeMinInt) < RANGE_MIN_DIFFERENCE // false
    // The program sees this as absolutely normal!
    

    这与走出窗口无关(如果你改变窗口的大小使其非常宽,你就可以重现这个问题,我是通过实验做到的)。问题是,当constrainRangeInputs()完成它的工作时,当前的数字已经足够高,足以符合您的条件

    这是因为在draw()循环的两次迭代之间,鼠标移动的速度足以覆盖RANGE_MIN_DIFFERENCE以上的区域

    您可以通过去掉abs()来轻松解决这个问题。我不知道为什么它在一开始是相关的,但是当你从现有的代码中修改它时,它可能是原始代码的产物

    所以:改变这一行

    if (abs(rangeMaxInt - rangeMinInt) < RANGE_MIN_DIFFERENCE) {
    

    而对于这一点:

    if (rangeMaxInt - rangeMinInt < RANGE_MIN_DIFFERENCE) {
    

    希望能有所帮助,这比看起来更棘手。玩得开心