如何使两个字段成为条件?

问题描述

下午好,我需要添加一些条件来验证当前代码中的两个字段。

  1. “最小”字段不得超过“最大”字段。最小
  2. “最大”字段不得小于“最小”字段。最多
  3. “最小”字段不应超过与“最大”字段的间隔,可以输入少500个单位。 例如: 不得进入最低4500和最高5000、4400 / 5000、4250 / 5000、4501 / 5000。
  4. “最小”和“最大”字段不能相等。最小值=输入时禁止最大值。

enter image description here

enter image description here

enter image description here

代码

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

range sliders: contrained range size

一个限制是范围不能大于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);
  }
  
}

Range sliders: editable range constrained

如果占用太多空间,则可以使用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);
  }
  
}

range number boxes

逻辑将值限制到最小500的差值并不是100%严格,我可能没有考虑其他一些边缘情况。这更多地是一种说明解决问题的方法,因此您更好地做到这一点。

我建议您遍历处理>示例>分布式库> ControlP5 并运行示例,尤其是控制器。您可以对听起来更接近您当前问题的优先级进行优先级排序,但是值得获得有关这些选项的经验,因此您可以选择最适合您问题的最佳控制器/ UI元素。

该示例可能不包括控制器使用的每种方法的用法,但是底部有一个注释列表,您可以轻松地立即复制/粘贴/运行。 此外,您当然还有full documentation