-3

按下逗号时如何更改代码中的条件?这样在输入时逗号不会同时出现在两个文本框1和2中,而是分开出现?这些文本字段中字符的限制也会发生同样的事情。如何拆分两个文本字段的处理!为什么逗号放置时没有聚焦文本字段?照片: 在此处输入图像描述 完整代码:

import controlP5.*;

ControlP5 cp5;
Textfield X9;
Textfield X10;

void setup() {
  size(700,400);
  
  PFont font = createFont("arial",20);
  
  cp5 = new ControlP5(this);
  
  X9 = cp5.addTextfield("1")
     .setPosition(20,100)
     .setSize(200,40);
     X9.setInputFilter(ControlP5.INTEGER)
     .setFont(font)
     .setAutoClear(false)
     .setColor(color(255,0,0))
     ;
                 
  X10 = cp5.addTextfield("2")
     .setPosition(20,170)
     .setSize(200,40);
     X10.setInputFilter(ControlP5.INTEGER)
     .setFont(createFont("arial",20))
     .setAutoClear(false)
     ;
     
  textFont(font);}
void draw() {
  background(0);
  fill(255);}
public void keyPressed(KeyEvent e) {
  if (e.getKey() == ','){
  X9.setText(X9.getText() + ',');}
  {
//  if(X10.getText().length()>=4) { X10.setText(X10.getText().substring(0, 3));}
  {
if (e.getKey() == ','){
  X10.setText(X10.getText() + ',');}
  {
 // if(X9.getText().length()>=4) { X9.setText(X9.getText().substring(0, 3));}
  }}}
}
4

1 回答 1

1

为什么逗号放置时没有聚焦文本字段?

因为您正在使用全局keyPressed()事件。这种情况:if (e.getKey() == ',')检查,是否按下了键,并且在您的情况下检查两次是多余的。它相当于这个更简单/更干净的片段:

public void keyPressed(KeyEvent e) {
  if (key == ','){
    X9.setText(X9.getText() + ',');
    X10.setText(X10.getText() + ',');
  }
}

没有任何检查字段是否聚焦。

你可能的意思是这样的?:

public void keyPressed(KeyEvent e) {
  if (key == ',') {
    if (X9.isFocus()) {
      X9.setText(X9.getText() + ',');
    }
    if (X10.isFocus()) {
      X10.setText(X10.getText() + ',');
    }
  }
}

总的来说,目前还不清楚主要目标是什么。也许有更简单的方法来实现它?

请记住,您可以通过void controlEvent(ControlEvent event). 请参阅处理 > 示例 > 贡献库 > ControlP5 > 控制器 > ControlP5Textfield以获得很好的演示。

此外,我建议格式化/保持代码整洁。这可能是一个快速扔掉的草图,但建立一个好的习惯会得到回报,因为你会花更多的时间阅读代码而不是编写代码。随着您的程序变得越来越大,您会希望让未来的自己生活更轻松:)

更新根据您的评论,这里是一个最小的草图,应该允许您控制 7.4 和 16.8 之间的浮点数和 1800-1900 之间的整数:

import controlP5.*;

ControlP5 cp5;

int serialInt = 1800;

float serialFloat = 7.4;

void setup() {
  size(300,300);
  noStroke();
  cp5 = new ControlP5(this);
  
  cp5.addNumberbox("serialInt")           // notice the component name matches the variable name: controlP5 links the two for you
     .setBroadcast(false)                 // disable events while we update value specific properties 
     .setPosition(100,100)                // screen location
     .setSize(100,20)                     // screen dimensions
     .setMultiplier(10)                   // set the sensitifity of the numberbox: each step is 10
     .setDirection(Controller.HORIZONTAL) // change the control direction to left/right
     .setRange(1800, 9000)                // set minimum, maximum value
     .setBroadcast(true)                  // enable events (after setting range)
     ;
  

  cp5.addNumberbox("serialFloat")
     .setBroadcast(false)                 // disable events while we update value specific properties
     .setPosition(100,140)                // screen location
     .setSize(100,20)                     // screen dimensions
     .setMultiplier(0.01)                 // set the sensitifity of the numberbox: each step is 0.01
     .setDirection(Controller.HORIZONTAL) // change the control direction to left/right
     .setRange(7.4,16.8)                  // set minimum, maximum value
     .setBroadcast(true)                  // enable events (after setting range)
     ;
  
}
void draw() {
  background(0);
}
// gets called whenever a component updates value
void controlEvent(ControlEvent event){
  println(event.getController().getName(),"changed value to",event.getValue(),"serialInt = ",serialInt,"serialFloat = ",serialFloat);
}

单击并水平拖动以更改值。请注意 ControlP5 提供的一些有用的东西:

  • 如果您将控制器命名为与控制器相同的名称,则两者会自动连接:节省大量时间。(如果您不能使用变量安全名称,您可以查看Examples > Contributed Examples > ControlP5 > use > ControlP5plugTo
  • 您可以轻松设置所需的范围和精度
  • 您可以controlEvent()选择使用来判断值何时更改

关于串行数据:

  • 如果您只需要 0.1 精度,则 7.4 到 16.8 范围很容易:只需将值乘以 10 即可将其变为 74 到 168,这适合单个字节(0-255 范围)
  • 1800 到 9000 的范围比较棘手,因为 9000-1800 = 7200 步之间。对于这种精度,您至少需要 13 位(2 ^ 13 = 8192,因此可以适合 7200 个值)。您可能需要在发送之前和在 Arduino(如果不使用 Arduino 则使用等效的 STM32 开发工具)中使用highByte()与处理等效的东西将其拆分为两个字节(2 ^ 16 )。lowByte()word()

例如:

void serialWriteWord(Serial port,int value){
  port.write(highByte(value));
  port.write(lowByte(value));
}

byte lowByte(int word){
  return (byte)(word & 0xff);
}

byte highByte(int word){
  return (byte)(word >> 8);
}

串行通信部分是一个完全独立的问题(另一个问题)

于 2020-08-11T12:22:48.607 回答