1

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

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);
    }
  }
}
4

1 回答 1

2

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

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

我已经运行了您的代码,在输入字段后出现此错误:

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)

我会假设这是你的问题。

看来您只是简单地替换了此答案Numberbox中第三个示例中的组件,但是您似乎没有注意组件之间的差异:TextField

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

如前所述,有充足的ControlP5 文档(以及示例)。学习如何使用文档(这里有一个示例视频,同样适用于 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的草图属性,但是它现在正在处理字符串(因为它是 a ),而不是(像这样)int minValue;TextFieldintNumberbox

还将String处理为int:

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

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

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

我知道当事情不工作时,一开始的编程可能会令人沮丧,但这是放慢速度、学习如何调试、详细了解问题并重试的机会。一个程序可能不会做你想让它做的事情,而是你告诉它做的事情。在某个地方必须有一个简单的解释和解决方案才能继续前进(下一个问题,直到程序按预期工作)。当出现问题并解决问题时,您将学到更多,而不是在事情正常但您不知道原因的情况下。

于 2020-10-09T12:04:38.120 回答