如何解决如何使两个框中的文本框中的数据条件满足?
下午好,我已经被提示如何使用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);
}
}
}
解决方法
您说出问题的方式听起来像是在指示他人为您做事。尽管已经说明了目标,但尚未说明:
- 您遇到的问题是什么(“什么都没用!”对试图帮助您的任何人都没有说什么)
- 您尝试解决什么问题(预期行为是什么以及实际行为是什么)
我已经运行了您的代码,并在输入字段后出现此错误:
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 举报,一经查实,本站将立刻删除。