如何解决如何使两个字段成为条件?
- “最小”字段不得超过“最大”字段。最小
- “最大”字段不得小于“最小”字段。最多
- “最小”字段不应超过与“最大”字段的间隔,可以输入少500个单位。 例如: 不得进入最低4500和最高5000、4400 / 5000、4250 / 5000、4501 / 5000。
- “最小”和“最大”字段不能相等。最小值=输入时禁止最大值。
代码:
import controlP5.*;
ControlP5 cp5;
Textfield O;
Textfield OO;
void setup() {
size(700,400);
PFont font = createFont("arial",18);
cp5 = new ControlP5(this);
O = cp5.addTextfield("MIN")
.setPosition(20,100)
.setSize(200,40);
O.setInputFilter(ControlP5.INTEGER)
.setFont(font)
.setColor(color(255,0));
OO = cp5.addTextfield("MAX")
.setPosition(20,170)
.setSize(200,40);
OO.setInputFilter(ControlP5.INTEGER)
.setFont(font);
textFont(font);
}
void draw() {
if (keypressed && OO.isFocus()) {
float n;
try {
n = Float.parseFloat(OO.getText().replace(',','.'));
if (!(n >= 1 && n <= 12000)) {
throw new NumberFormatException(); // throw to catch below
}
}
catch (Exception e2) {
String t;
if (OO.getText().length() > 1) {
t = OO.getText().substring(0,OO.getText().length() - 1);
} else {
t = "";
}
OO.setText(t);
}
}
if (keypressed && O.isFocus()) {
float n;
try {
n = Float.parseFloat(O.getText().replace(','.'));
if (!(n >= 1 && n <= 11500)) {
throw new NumberFormatException(); // throw to catch below
}
}
catch (Exception e2) {
String t;
if (O.getText().length() > 1) {
t = O.getText().substring(0,O.getText().length() - 1);
} else {
t = "";
}
O.setText(t);
}
}
background(0);
fill(255);
}
解决方法
总的来说,这听起来像是您在尝试让用户输入一系列有效值(最小值始终小于最大值)。已经有一个ControlP5控制器:Range
除了允许在一个范围内设置最小值和最大值外,约束条件是最大值和最小值之间的差异至少应保持500。
您可以使“范围”滑块的处理宽度变为0px,实际上将其禁用,这意味着将保持您在开始时设置的范围(通过SELECT Flat,Year,(SUM(CASE WHEN EANR = 'Cancelled' THEN USD_amt END) /
SUM(SUM(USD_amt)) OVER (PARTITION BY Flat,YEAR)
) AS Cancel_ratio
FROM (SELECT r.*,EXTRACT(YEAR FROM pay_day) AS Year
FROM `finances.reservations` r
) r
GROUP BY Flat,Year
ORDER BY 1
):
setRangeValues
一个限制是范围不能大于500。如果需要,您仍然可以手动限制值(通过设置范围min(low)/ max(high)值):
import controlP5.*;
ControlP5 cp5;
Range range;
int rangeMinValue;
int rangeMaxValue;
void setup() {
size(700,400);
PFont font = createFont("arial",18);
cp5 = new ControlP5(this);
range = cp5.addRange("yourRange")
// disable broadcasting since setRange and setRangeValues will trigger an event
.setBroadcast(false)
.setFont(font)
.setPosition(50,50)
// notice the dimensions are proportional to the min/max range to avoid floating point values
.setSize(500,40)
// set minimum - maximum range here
.setRange(4000,5000)
// example: set initial (recommended) range values
.setRangeValues(4000,4500)
// workaround to disable left/right handles contraining the range to 500
.setHandleSize(0)
// after the initialization we turn broadcast back on again
.setBroadcast(true)
;
textFont(font);
}
void draw() {
background(0);
fill(255);
}
void controlEvent(ControlEvent event) {
if(event.isFrom("yourRange")) {
// min and max values are stored in an array.
// access this array with controller().arrayValue().
// min is at index 0,max is at index 1.
rangeMinValue = int(event.getController().getArrayValue(0));
rangeMaxValue = int(event.getController().getArrayValue(1));
println("range:",rangeMinValue,"->",rangeMaxValue);
}
}
如果占用太多空间,则可以使用Numberbox,与文本字段相比,它具有一些优点:
- 您无需担心字符串到整数的转换(默认情况下它处理数字)
- 您可以设置最小值/最大值
这是一个例子:
import controlP5.*;
// 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);
ControlP5 cp5;
Range range;
int rangeMinValue;
int rangeMaxValue;
void setup() {
size(700,18);
cp5 = new ControlP5(this);
range = cp5.addRange("yourCustomRange")
// disable broadcasting since setRange and setRangeValues will trigger an event
.setBroadcast(false)
.setFont(font)
.setPosition(50,40)
// set minimum - maximum range here
.setRange(RANGE_MIN,RANGE_MAX)
// example: set initial (recommended) range values
.setRangeValues(RANGE_MIN,RANGE_MIN + RANGE_MIN_DIFFERENCE)
// after the initialization we turn broadcast back on again
.setBroadcast(true)
;
textFont(font);
}
void draw() {
background(0);
fill(255);
}
void controlEvent(ControlEvent event) {
if(event.isFrom("yourCustomRange")) {
// min and max values are stored in an array.
// access this array with controller().arrayValue().
// min is at index 0,max is at index 1.
int rangeMinInt = int(event.getController().getArrayValue(0));
int rangeMaxInt = int(event.getController().getArrayValue(1));
// if the values are within the desired range,update global values
if(rangeMaxInt - rangeMinInt >= RANGE_MIN_DIFFERENCE){
rangeMinValue = rangeMinInt;
rangeMaxValue = rangeMaxInt;
}else{
// otherwise check which side of the range should be constrained (right/max) or (left/min) to overwrite user input
if(rangeMaxInt > RANGE_MID){
range.setLowValue(rangeMaxInt - RANGE_MIN_DIFFERENCE);
}else{
range.setHighValue(rangeMinInt + RANGE_MIN_DIFFERENCE);
}
}
// values to use
println("range:",rangeMaxValue);
}
}
逻辑将值限制到最小500的差值并不是100%严格,我可能没有考虑其他一些边缘情况。这更多地是一种说明解决问题的方法,因此您更好地做到这一点。
我建议您遍历处理>示例>分布式库> ControlP5 并运行示例,尤其是控制器。您可以对听起来更接近您当前问题的优先级进行优先级排序,但是值得获得有关这些选项的经验,因此您可以选择最适合您问题的最佳控制器/ UI元素。
该示例可能不包括控制器使用的每种方法的用法,但是底部有一个注释列表,您可以轻松地立即复制/粘贴/运行。 此外,您当然还有full documentation
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。