Java 为什么两个文本字段中的逗号同时放置而不聚焦?

Java 为什么两个文本字段中的逗号同时放置而不聚焦?,java,processing,control-p5,Java,Processing,Control P5,当按下逗号时,如何更改代码中的条件?以便在键入时逗号不会同时出现在两个文本框1和2中,而是分别出现?这些文本字段中的字符限制也会发生同样的情况。如何在两个文本字段之间拆分处理!为什么逗号没有聚焦文本字段? 福托: 完整代码: import controlP5.*; ControlP5 cp5; Textfield X9; Textfield X10; void setup() { size(700,400); PFont font = createFont("aria

当按下逗号时,如何更改代码中的条件?以便在键入时逗号不会同时出现在两个文本框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));}
  }}}
}
为什么逗号没有聚焦文本字段

因为您正在使用全局
keyPressed()
事件。 此条件:
如果(例如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事件)
侦听单个controlP5组件事件。请参阅处理>示例>贡献的库>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提供的一些有用的东西:

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

  • 7.4到16.8的范围很容易,如果您只需要。1精度:只需将值乘以10,使其在一个字节(0-255范围)内达到74到168
  • 1800到9000的范围更为复杂,因为9000-1800=7200步。对于这种精度,您至少需要13位(2^13=8192,因此可以适合7200个值)。您可能需要在发送之前和在Arduino中(如果不使用Arduino,则使用等效的STM32开发工具),将其拆分为两个字节(2^16)
例如:

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);
}

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

可以帮助您提出更好的问题:您的代码格式很糟糕,很难阅读/理解。在将其发布到SO之前,您应该尝试将其删除。然后你的问题很难为其他人解析,因为你问了几件事却没有给出足够的上下文。您应该试着关注一个问题:您的代码到底在做什么?您希望它做什么?我认为您的问题来自于这样一个事实,即在按下
键时,您有相同的代码
X9.setText(X9.getText()+',');}
用于创建此重复行为的
X9
X10
,但我们需要更多详细信息。我的代码是在击键时向文本字段添加逗号。如何避免两个字段中的重复?当输入逗号时。晚上好,我将试着解释一下主要目的。不要骂我太多。我的任务是在文本字段1和2中使用逗号“,”,但库中有controlP5.Float-这是点形式的浮点吗?因为你不能在没有按键的情况下输入逗号。我需要通过com端口传输数字55.5和其他的数据。如果没有全局,我应该使用什么解决方案?或者我把图书馆里的句号和逗号混淆了?希望我不是在嘲笑:这不是我的本意:)我试图通过尽可能地提供改进建议来超越问题。如果我理解正确,您的目标是将浮点数(例如55.5)发送到
串行
端口,并且您打算使用controlP5允许用户输入要发送的值,对吗?据我所知,句号(
)用于将整数与浮点数的小数部分分开:至少在英语中:)在其他语言中这可能有所不同,但是您的软件(处理草图)和固件都需要处理这个问题……我不是英语母语人士,但我倾向于用(美国)编写代码英语(甚至不是英国英语,除了可能的评论)。我这样做是因为我很懒,我不想在不同的平台上搞砸语言环境支持。就我个人而言,我会坚持使用
而不是
来表示浮点数,但这当然是你的选择。请注意,要使串行通信保持一致,可能需要进行额外的工作。您打算通过串行通信发送的最小值和最大值是多少?(您可能需要考虑浮点精度)。你需要考虑如何打包……用于串行通信的数据(例如,一个良好定义的字节序列包(包括报头、数据有效载荷和可能的校验和/ CRC校验额外数据)或原始字符串(在这种情况下,需要处理串行传输错误))是的,用Copyp5,也许ControP5.Float适合我,但是为什么库中没有分号过滤器是很奇怪的。最小值和最大值是否将通过串行链路发送?这是7.4-16.8伏,或整个1800-9000伏。我将使用stm32从应用程序接收数据。据我所知