微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何使两个框中的文本框中的数据条件满足?

如何解决如何使两个框中的文本框中的数据条件满足?

下午好,我已经被提示如何使用cp5.addNumberBox来完成此操作,但是我尝试了其他选项,但仍然无法击败cp5.addTextfield。 没用! 任务如下: 1)。输入数字时,minValue字段不得超过MaxValue字段。 2)。输入数字时,MaxValue字段不得小于minValue字段。 3)。 minValue字段不得超过maxValue字段的范围500个单位。 我发布了最简单的代码版本而没有狂热:

enter image description here

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$12.callDraw(PSurfaceAWT.java:1557)
    at processing.core.PSurfaceNone$AnimationThread.run(PSurfaceNone.java:313)

我认为这是您的问题。

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

  • 数字框可用于数字
  • TextField与文本一起使用

如前所述,有足够的ControlP5 documentation(以及示例)。 学习如何使用文档(这里是example video,具有文档的Java / Processing /任何其他语言/库也是如此)。

您至少可以尝试的操作是:

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会尝试将minValue组件名称中的Numberbox映射到草图顶部的int minValue;属性,但是它现在正在处理String(因为它是TextField) ,而不是int(就像Numberbox一样)

还将String转换为int:

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

就个人而言,我不建议您使用这种效率低下且容易出错的路径,或者在String和整数之间来回转换,以免给用户带来非常尴尬的输入数据体验。 就将字符串文本输入处理为4000/5000范围内的整数值而言,您是一个人。

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

我知道,当事情不起作用时,一开始的编程可能会令人沮丧,但这是放慢脚步,learn how to debug,详细了解问题并重试的机会。程序可能不会执行您想要执行的操作,而是执行您要执行的操作。必须有一个简单的解释和解决方案才能前进(继续到下一个问题,直到程序按预期工作为止)。 当事情出现问题时,您将学到很多东西,与之相适应的是,这些问题将得到解决,但是您不知道为什么。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。