如何解决为什么将两个文本字段中的逗号放在同一时间而不关注?
按逗号时如何更改代码中的条件?这样,键入时逗号不会同时出现在两个文本框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))
;
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()
事件。
这种情况: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组件事件。
此外,我建议整理/保持代码整洁。这可能是一个速写的草图,但是建立一个良好的习惯将有所作为,因为您将花费更多的时间阅读代码而不是编写代码。随着您的程序越来越大,您将希望为自己的未来变得更轻松:)
更新根据您的评论,这里是一个最小的草图,应允许您控制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()
来告知值何时更改
关于串行数据:
- 如果您只需要.1精度,那么从7.4到16.8的范围是容易的:将值乘以10即可将其增加到74到168,可以容纳一个字节(0-255范围)
- 1800到9000的范围比较棘手,因为9000-1800 = 7200步距。为此精度,您至少需要13位(2 ^ 13 = 8192,因此可以容纳7200个值)。在发送之前,您可能需要使用与处理中的
highByte()
和lowByte()
等效的东西将其拆分为两个字节(2 ^ 16),在Arduino中将其word()
(如果不使用,则为等效的STM32 Dev工具) Arduino)。
例如:
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);
}
串行通信部分是一个完全独立的问题(另一个问题)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。