我有一个文本字段“条形码”和一个文本区域“条形码列表”。
在启动时,我想将焦点设置在“条形码”字段上。我的Android扫描仪就像键盘一样工作,成功扫描到这个字段。
当“条形码”文本字段更改时,我想将内容添加到“条形码列表”文本区域,然后将焦点重新设置为“条形码”字段,以准备下一次扫描。
问题是,这在模拟器中有效,但在Android设备上无效。在设备上(Unitech HT730),扫描的数据被添加到“条形码”字段,然后被复制到“条形码列表”,但是焦点没有返回到“条形码”字段。 Flink 的光标出现在最右边的字段中,但是我无法扫描(或键入)到这个字段中。一旦我触摸该字段,光标就会跳到最左边,我就能够再次扫描或键入该字段。
我试过在调用requestFocus()之前插入sleep(100)。我也试过使用repaint()。唯一有用的是删除对clear()的调用。看起来clear()除了“Barcode”文本内容之外,还必须处理其他内容,但我找不到任何其他方法来清除Barcode内容:即使setText(“”)也不起作用。
下面是我正在使用的代码片段:
gui_Barcode_t.addDataChangeListener((i1, i2) -> {
String s1 = gui_Barcode_t.getText();
// A DataChange event will fire after the field is cleared, so test to see if this has occurred.
if (s1.length()> 0) {
List_s += s1 + "\n";
gui_BarcodeList_ta.requestFocus();
gui_BarcodeList_ta.setText(List_s);
sleep(100);
gui_BarcodeList_ta.repaint();
} else {
// This works in sim: repaint(), sleep(100), requestFocus()
gui_Barcode_t.repaint();
sleep(100);
gui_Barcode_t.requestFocus();
return;
}
// Note that a DataChange event will fire after the field is cleared.
// This works in sim: clear(), sleep(100), repaint(), sleep(100), requestFocus().
// This works on Android device if clear() is removed, but the text field is not cleared.
gui_Barcode_t.clear();
sleep(100);
gui_Barcode_t.repaint();
sleep(100);
gui_Barcode_t.requestFocus();
});
2条答案
按热度按时间jjhzyzn01#
requestFocus()
非常适合聚焦,但它可能会与本机编辑冲突,这是一个不同的过程。您要使用的是
startEditingAsync()
到,如果可能编辑了错误的字段,则可能使用stopEditing()
。作为旁注,除非你正在构建一个自定义组件,否则你不应该发出
repaint()
调用。你应该永远在EDT上调用sleep。这是一个严重的bug!8tntrjer2#
谢谢,Shai。显然我在CNO和移动的GUI开发方面是个新手。
除了在startEditingAsync()和startEditingAsync()中 Package 文本编辑之外,我还必须在datachanged事件处理程序之外处理这些编辑。