如何让textbox中两个字段的数据条件满足?

How do I make the conditions of the data in the textbox two fields meet?

下午好,有人提示我如何使用 cp5.addNumberbox 完成此操作,但我尝试了不同的选项,但仍然无法击败 cp5.addTextfield。 什么都不管用! 任务如下: 1).输入数字时,minValue 字段不得超过 MaxValue 字段。 2).输入数字时,MaxValue 字段不得小于 minValue 字段。 3). minValue 字段不得超过 maxValue 字段的范围 500 个单位。 我 post 没有我狂热的最简单版本的代码:

import controlP5.*;

ControlP5 cp5;

// range constants
final int RANGE_MIN = 4000;
final int RANGE_MAX = 5000;
// the smallest allowed difference between min/max values
final int RANGE_MIN_DIFFERENCE = 500;
final int RANGE_MID = RANGE_MIN + ((RANGE_MAX - RANGE_MIN) / 2);

int minValue;
int maxValue;

Textfield inputMin;
Textfield inputMax;

void setup() {
  size(700, 400);

  PFont font = createFont("arial", 18);

  cp5 = new ControlP5(this);

  inputMin = cp5.addTextfield("minValue")
    .setPosition(100, 100)
    .setSize(100, 20)
    .setFont(font)
    //.setScrollSensitivity(1.1)
    // set initial acceptable range
    .setMin(RANGE_MIN)
    .setMax(RANGE_MAX)
    // set default value
    .setValue(4000)
    ;

  inputMax = cp5.addTextfield("maxValue")
    .setPosition(100, 150)
    .setSize(100, 20)
    .setFont(font)
    //.setScrollSensitivity(1.1)
    // set initial acceptable range
    .setMin(RANGE_MIN)
    .setMax(RANGE_MAX)
    // set default value
    .setValue(RANGE_MID + 1)
    ;


  textFont(font);
}

void draw() {
  constrainRangeInputs();
  background(0);
  fill(255);
  text("minValue: " + minValue + "\n" +
    "maxValue: " + maxValue, 10, 15);
}

void constrainRangeInputs() {
  int rangeMinInt = (int)inputMin.getValue();
  int rangeMaxInt = (int)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);
    }
  }
}

您表达问题的方式听起来像是在指示其他人为您完成工作。虽然你已经说明了你的目标,但你还没有说明:

  • 您遇到的问题是什么(“没有任何效果!”不会对任何试图帮助您的人说任何话)
  • 您尝试过什么来解决问题(预期行为是什么,实际行为是什么)

我已经 运行 你的代码,在输入字段后我得到这个错误:

java.lang.IllegalArgumentException: Can not set int field sketch_201009b.minValue to java.lang.String
    at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:167)
    at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:171)
    at sun.reflect.UnsafeIntegerFieldAccessorImpl.set(UnsafeIntegerFieldAccessorImpl.java:98)
    at java.lang.reflect.Field.set(Field.java:764)
    at controlP5.ControlBroadcaster.invokeField(Unknown Source)
    at controlP5.ControlBroadcaster.callTarget(Unknown Source)
    at controlP5.ControlBroadcaster.broadcast(Unknown Source)
    at controlP5.Controller.broadcast(Unknown Source)
    at controlP5.Controller.broadcast(Unknown Source)
    at controlP5.Textfield$Enter.execute(Unknown Source)
    at controlP5.Textfield.keyEvent(Unknown Source)
    at controlP5.ControllerGroup.keyEvent(Unknown Source)
    at controlP5.ControlWindow.handleKeyEvent(Unknown Source)
    at controlP5.ControlWindow.keyEvent(Unknown Source)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at processing.core.PApplet$RegisteredMethods.handle(PApplet.java:1411)
    at processing.core.PApplet.handleMethods(PApplet.java:1613)
    at processing.core.PApplet.handleKeyEvent(PApplet.java:2949)
    at processing.core.PApplet.dequeueEvents(PApplet.java:2602)
    at processing.core.PApplet.handleDraw(PApplet.java:2440)
    at processing.awt.PSurfaceAWT.callDraw(PSurfaceAWT.java:1557)
    at processing.core.PSurfaceNone$AnimationThread.run(PSurfaceNone.java:313)

我假设这是你的问题。

您似乎只是将 中第三个示例中的 Numberbox 组件替换为 TextField,但您似乎没有注意组件之间的差异:

  • Numberbox 处理数字
  • TextField 适用于文本

如前所述,有充足的 ControlP5 documentation(以及示例)。 了解如何使用文档(这里是 example video,同样适用于 java/Processing/any 其他 language/library 文档)并使用它。

你至少可以尝试这样的事情:

import controlP5.*;

ControlP5 cp5;

// range constants
final int RANGE_MIN = 4000;
final int RANGE_MAX = 5000;
// the smallest allowed difference between min/max values
final int RANGE_MIN_DIFFERENCE = 500;
final int RANGE_MID = RANGE_MIN + ((RANGE_MAX - RANGE_MIN) / 2);

int minValue;
int maxValue;
String minValueString;
String maxValueString;

Textfield inputMin;
Textfield inputMax;

void setup() {
  size(700, 400);

  PFont font = createFont("arial", 18);

  cp5 = new ControlP5(this);

  inputMin = cp5.addTextfield("minValueString")
    .setPosition(100, 100)
    .setSize(100, 20)
    .setFont(font)
    ;

  inputMax = cp5.addTextfield("maxValueString")
    .setPosition(100, 150)
    .setSize(100, 20)
    .setFont(font)
    ;


  textFont(font);
}

void draw() {
  constrainRangeInputs();
  background(0);
  fill(255);
  text("minValue: " + minValue + "\n" +
       "maxValue: " + maxValue, 10, 15);
}

void constrainRangeInputs() {
  int rangeMinInt = int(inputMin.getText());
  int rangeMaxInt = int(inputMax.getText());
  // 
  if (abs(rangeMaxInt - rangeMinInt) < RANGE_MIN_DIFFERENCE) {
    if (rangeMaxInt > RANGE_MID) {
      inputMin.setText((rangeMaxInt - RANGE_MIN_DIFFERENCE) + "");
    } else {
      inputMax.setText((rangeMinInt + RANGE_MIN_DIFFERENCE) + "");
    }
  }
}

注意这部分:

inputMin = cp5.addTextfield("minValueString")
inputMax = cp5.addTextfield("maxValueString")

这就是之前导致错误的原因。 ControlP5 会尝试将 minValueNumberbox 组件名称映射到草图顶部的 int minValue; 属性,但是它现在正在处理一个字符串(因为它是一个 TextField),而不是 int(就像 Numberbox 那样)

同时将 String 处理为 int:

  int rangeMinInt = int(inputMin.getText());
  int rangeMaxInt = int(inputMax.getText());

就我个人而言,我不建议继续这种低效且容易出错的路径或在字符串和整数之间来回转换,从而导致用户在输入数据时体验非常尴尬。 在将字符串文本输入处理为 4000 / 5000 以内的整数值 运行ge 等

方面,您需要靠自己

当我建议使用更适合的 UI 元素和数据处理(如 Numberbox)而不是 TextField 时,这似乎与您的 相关。 此外,我还提出了有关文本格式、命名变量、使用文档等方面的建议,但它们似乎已被驳回。

我知道开始编程时遇到问题时会感到沮丧,但这些都是放慢速度的机会,learn how to debug,详细了解问题并重试。一个程序可能不会做你想让它做的事,而是做你告诉它做的事。那里的某个地方必须有一个简单的解释和解决方案才能继续前进(到下一个问题,直到程序按预期运行)。 当出现问题并修复它们时,您会学到很多东西,而不是当事情正常但您不知道为什么的情况下。