Java 为什么两个文本字段中的逗号同时放置而不聚焦?
当按下逗号时,如何更改代码中的条件?以便在键入时逗号不会同时出现在两个文本框1和2中,而是分别出现?这些文本字段中的字符限制也会发生同样的情况。如何在两个文本字段之间拆分处理!为什么逗号没有聚焦文本字段? 福托: 完整代码: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
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从应用程序接收数据。据我所知