您提出问题的方式听起来像是在指示其他人为您完成工作。虽然你已经陈述了你的目标,但你没有陈述:
- 您遇到的问题是什么(“没有任何效果!”并没有对任何试图帮助您的人说什么)
- 您尝试解决什么问题(预期行为是什么以及实际行为是什么)
我已经运行了您的代码,在输入字段后出现此错误:
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;
TextField
int
Numberbox
还将String处理为int:
int rangeMinInt = int(inputMin.getText());
int rangeMaxInt = int(inputMax.getText());
就个人而言,我不建议采用这种低效且容易出错的路径,或者在字符串和整数之间来回转换,从而导致输入数据的用户体验非常尴尬。您可以自行处理字符串文本输入到 4000 / 5000 范围内的整数值等。
当我建议使用更适合的 UI 元素和数据处理(如)Numberbox
而不是TextField
. 此外,我还就文本格式、命名变量、使用文档等提出了建议,但它们似乎已被驳回。
我知道当事情不工作时,一开始的编程可能会令人沮丧,但这是放慢速度、学习如何调试、详细了解问题并重试的机会。一个程序可能不会做你想让它做的事情,而是你告诉它做的事情。在某个地方必须有一个简单的解释和解决方案才能继续前进(下一个问题,直到程序按预期工作)。当出现问题并解决问题时,您将学到更多,而不是在事情正常但您不知道原因的情况下。