Java me 无法使用setCurrent更改当前可显示的内容

Java me 无法使用setCurrent更改当前可显示的内容,java-me,midp,lcdui,Java Me,Midp,Lcdui,我正在创建一个使用蓝牙的JavaME应用程序 无论我如何尝试更改当前的displaybable,它都不会更改 我的应用程序将一个名为“devices”的文本框设置为启动时可显示的当前值,我在另一个类的方法中将当前值更改为一个名为“devicelist”的列表 但当我尝试将当前设置更改回文本框(设备)时,它不会更改 我尝试在midlet类中使用display对象,并在其他类中使用gestDisplay。但是列表对象(deviceList)仍然是当前可显示的 更新根据我的测试,似乎有一些bug。文本

我正在创建一个使用蓝牙的JavaME应用程序

无论我如何尝试更改当前的
displaybable
,它都不会更改

我的应用程序将一个名为“devices”的文本框设置为启动时可显示的当前值,我在另一个类的方法中将当前值更改为一个名为“devicelist”的列表

但当我尝试将当前设置更改回文本框(设备)时,它不会更改

我尝试在midlet类中使用display对象,并在其他类中使用gestDisplay。但是列表对象(deviceList)仍然是当前可显示的

更新根据我的测试,似乎有一些bug。文本框(设备)是当前可显示的,但当我选中
isShown
时,它显示为false。相反,当使用
isShown
进行测试时,另一个可显示的:List(deviceList)显示为true。
尽管api规范表明,
setCurrent
方法的效果不是即时的,但当前可显示的内容正在改变,但它不会显示在屏幕上。这在真实设备和模拟器中都会发生。

您找到了规范的一个正确部分,但不是全部-这就是为什么您感到困惑的原因

您对setCurrent方法的效果不是即时的理解是100%正确的,这是API javadocs规定的,好吗:

  • :

    …更改通常不会立即生效。它可能会延迟,以便在事件传递方法调用之间发生,但不能保证在调用下一个事件传递方法之前发生。setCurrent()方法立即返回,而不等待更改发生
现在,您注意到当前可显示的内容正在更改,但它没有显示,这让我感觉您使用了
getCurrent
,并希望它能够可靠地告诉您何时显示屏幕。事实并非如此,请看一看API文档:

  • :

    获取此MIDlet的当前可显示对象。。。返回的对象可能实际上不可见。。。可以调用该方法来确定可显示内容在显示器上是否实际可见
因此,简单的答案可能是使用
isShown()
(而不是getCurrent)来确定所需屏幕何时可见。虽然

…事实上,您正在经历延迟,尤其是在emulator上也会发生延迟,这让我觉得您的midlet可能存在设计问题。我强烈建议您检查是否存在与UI在同一线程中运行的某些“重量级”活动,阻止它并使其不负责任

避免UI事件线程中的重载。当
commandAction
按键
指针压缩
等内部有很多事情要做时,只需生成一个新线程即可。如果你发现这是在你的MIDLE的情况下,考虑学习本教程,找出拖欠做正确:

  • 本文介绍了MIDlet如何在不影响用户界面的情况下进行网络连接。它包括六个迭代示例,说明了多线程网络和等待屏幕的使用


如果您在MIDlet类的实例中正确地获得了Display对象,在startApp中,那么setCurrent应该做您所期望的事情。你的问题是因为你的代码中有bug。添加日志记录、测试、研究日志当出现问题时,添加更多日志记录并重新测试,直到您消除错误。这就是为什么我知道当前状态不会改变。而且我也没有看到任何异常。除了在当前状态下打印外,创建日志的最佳方法是什么。?对不起,我是新来的。我要在这里发布代码吗?如果使用emulator进行测试,最简单的方法是使用
System.out.println
在控制台中跟踪midlet的执行。Java ME也有各种日志库,值得考虑使用真实设备进行测试,但emulator system.out.println只是一个工具,无法使用emulator进行测试,因为应用程序需要发现蓝牙服务,此服务由我的电脑提供,Java ME设备无法提供这些服务。对不起,实际上我可以测试这个部分,因为它不需要服务。感谢您的提示,认为在堆栈溢出时不太欢迎在pastebin中使用代码。这里首选的方法是添加相关的代码片段,或者更好的是,添加到问题中