如何通过代码设置Codename One Windows桌面应用初始Form尺寸?
Shai及Codename One团队正致力于为JavaSE构建提供更完善的桌面设置访问能力,请问是否有人成功通过Codename One应用中类似如下代码,为Windows平台的JavaSE构建设置JFrame尺寸?
if(Display.getInstance().isDesktop()) { //Set Width and Height of opening form }
当前Codename One构建引擎默认将启动JFrame的尺寸设为800×600像素,即便JFrame可调整大小,应用的PreferredSize仍在JFrame启动时确定,导致Codename One表单上的组件尺寸偏小——带图标的SpanLabels和使用标准样式的Label尤为明显,且应用使用的布局管理器会错误放置为更高分辨率设计的组件。若未为组件设置UIID,SpanLabels和Labels将以1mm尺寸绘制。
我希望将初始尺寸设为1280×1080,该尺寸小于iPad Mini模拟器皮肤,但能提供基准PreferredSize,使布局管理器正确放置组件。
编辑1:使用Dimension可调整Form尺寸,但无法设置正确的PreferredSize。
基础调研信息
- 全球仍有13%的桌面设备使用800×600分辨率。
- 大多数迁移到桌面端的Codename One应用未使用复杂布局。
- 若无复杂布局,标准布局管理器可补偿应用桌面端从800×600放大至平板常用的1280×1080分辨率时的位置与尺寸分配变化。
- 初始化平台专属Form控件可能覆盖汉堡菜单。
- 启动Form的分辨率会确定应用组件的PreferredSize,这体现在小型SpanLabels、未修改基础样式的Label的初始尺寸,以及布局管理器布局组件的方式变化上。
解决方案
由于我们的应用多数用户使用平板,而桌面端开发者使用分辨率高于800×600的设备,因此选择让桌面端应用启动时进入全屏模式。构建引擎默认的800×600初始分辨率,会导致放大到1280×1080后组件仅为可用尺寸的1/2至2/3,且所有Form上的组件位置偏移或超出屏幕,使超半数应用功能无法使用。
目前尚无安全方法可在JavaSE桌面构建中设置初始JFrame尺寸同时保持布局管理器的完整性,且部分Codename One客户仍在使用800×600分辨率设备,因此全屏模式是折中方案——它能让JFrame以可确定正确PreferredSize的分辨率初始化,确保组件尺寸可用、布局正确。
启动全屏代码
if(CN.isDesktop()) { // 检测是否为桌面端 CN.requestFullScreen(); }
方案优化步骤
该方案最初存在问题:除侧边菜单外所有控件消失,只能通过强制退出关闭应用。
- 步骤1:为侧边菜单添加退出应用命令,但退出全屏时会直接关闭应用,不符合多任务操作需求。
- 步骤2:添加切换全屏/退出全屏及关闭应用的命令,代码如下:
tb.addMaterialCommandToSideMenu("Desktop", FontImage.MATERIAL_COMPUTER, 2, ur1 -> { }); tb.addMaterialCommandToSideMenu(" Exit Full Screen", FontImage.MATERIAL_CLOSE_FULLSCREEN, 2, ur1 -> { if (CN.isInFullScreenMode()) { // 检测当前是否为全屏模式 CN.exitFullScreen(); // 退出全屏 } }); tb.addMaterialCommandToSideMenu(" Full Screen", FontImage.MATERIAL_FULLSCREEN, 2, ur1 -> { try { CN.requestFullScreen(); // 进入全屏 } catch (Exception e) { throw new RuntimeException(e); } }); tb.addMaterialCommandToSideMenu(" Close App", FontImage.MATERIAL_CLOSE, 2, ur1 -> { if (CN.isDesktop()) { CN.exitApplication(); // 关闭应用 } });
测试结果
- 组件尺寸正确,布局管理器可正确布局所有Form的组件;
- 原生Label尺寸仍有问题,需通过Properties为其分配UIID。
API拓展建议
随着Codename One平台桌面端应用增多,建议为CN类添加识别桌面显示器分辨率的方法:若分辨率≥1280×1080则将JFrame初始尺寸设为1280×1080而非800×600,避免高分辨率屏幕上Form过小导致PreferredSize异常。
内容的提问来源于stack exchange,提问作者curtjacobs1

