为什么两个文本域中的逗号同时放置却没有聚焦?
Why is the comma in two text fields put at the same time without focusing?
如何在按下逗号时更改代码中的条件?让逗号在打字的时候不会同时出现在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));}
}}}
}
Why is the comma placed without focusing text fields?
因为您正在使用全局 keyPressed()
事件。
这种情况:if (e.getKey() == ',')
检查是否按下了 ,
键,在你的情况下检查两次是多余的。它等同于此 simpler/cleaner 片段:
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 组件事件。请参阅 Processing > Examples > Contributed Libraries > ControlP5 > controllers > ControlP5Textfield 以获得不错的演示。
此外,我推荐 formatting/keeping 代码整洁。这可能是一个快速的 throw-away 草图,但是养成良好的习惯会有回报,因为您阅读代码的时间将比编写代码的时间多得多。随着您的程序变得越来越大,您会希望让未来的自己生活得更轻松 :)
更新 根据您的评论,这是一个最小的草图,它应该允许您控制 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()
来判断值何时更改
关于串行数据:
- 如果您只需要 .1 精度,7.4 到 16.8 的范围很容易:只需将该值乘以 10 使其达到 74 到 168,这适合一个字节(0-255 范围)
- 1800 到 9000 范围更棘手,因为 9000-1800 = 7200 步之间。对于这个精度,您至少需要 13 位(2 ^ 13 = 8192 所以可以容纳 7200 个值)。您可能需要在 Arduino 中使用等同于
highByte()
and lowByte()
in Processing before sending and word()
的东西将其拆分为两个字节 (2 ^ 16)(如果不使用 Arduino,则使用等同的 STM32 开发工具)。
例如:
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);
}
串行通信部分是一个完全独立的问题(另一个问题)
如何在按下逗号时更改代码中的条件?让逗号在打字的时候不会同时出现在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));}
}}}
}
Why is the comma placed without focusing text fields?
因为您正在使用全局 keyPressed()
事件。
这种情况:if (e.getKey() == ',')
检查是否按下了 ,
键,在你的情况下检查两次是多余的。它等同于此 simpler/cleaner 片段:
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 组件事件。请参阅 Processing > Examples > Contributed Libraries > ControlP5 > controllers > ControlP5Textfield 以获得不错的演示。
此外,我推荐 formatting/keeping 代码整洁。这可能是一个快速的 throw-away 草图,但是养成良好的习惯会有回报,因为您阅读代码的时间将比编写代码的时间多得多。随着您的程序变得越来越大,您会希望让未来的自己生活得更轻松 :)
更新 根据您的评论,这是一个最小的草图,它应该允许您控制 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()
来判断值何时更改
关于串行数据:
- 如果您只需要 .1 精度,7.4 到 16.8 的范围很容易:只需将该值乘以 10 使其达到 74 到 168,这适合一个字节(0-255 范围)
- 1800 到 9000 范围更棘手,因为 9000-1800 = 7200 步之间。对于这个精度,您至少需要 13 位(2 ^ 13 = 8192 所以可以容纳 7200 个值)。您可能需要在 Arduino 中使用等同于
highByte()
andlowByte()
in Processing before sending andword()
的东西将其拆分为两个字节 (2 ^ 16)(如果不使用 Arduino,则使用等同的 STM32 开发工具)。
例如:
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);
}
串行通信部分是一个完全独立的问题(另一个问题)