Java Swing:切换UI后Spinner值被截断的问题如何解决
问题解决:Spinner切换UI后值截断
问题描述(翻译后)
我有如下所示的Spinner组件,初始化时无任何异常,但在切换至其他UI进行编辑后返回原UI时,Spinner的值出现截断情况。请问该如何解决此问题?
private CamSpinner getValiditySpinner() { if (spinnerValidity == null) { spinnerValidity = new CamSpinner(); spinnerValidity.setModel(new SpinnerNumberModel(1, 1, 99, 1)); spinnerValidity.setPreferredSize(new Dimension(35, 20)); spinnerValidity.setName(OutboxComponentNameConstants.DRUG_OUTBOX_LAST_DAY_OF_VALIDITY_SPINNER); ValidationComponentUtils.setMessageKey(this.spinnerValidity, DrugPackageInformationModel.Property.validityPeriod); } return spinnerValidity; }
解决方案
1. 移除固定宽度设置(最直接)
代码中给Spinner设置了固定的preferredSize(35,20),这个宽度对于两位数字(比如99)来说刚好,但切换UI后布局管理器重绘时,无法根据内容自动调整宽度,导致值被截断。直接移除这行代码,让Spinner根据自身内容自适应宽度:
private CamSpinner getValiditySpinner() { if (spinnerValidity == null) { spinnerValidity = new CamSpinner(); spinnerValidity.setModel(new SpinnerNumberModel(1, 1, 99, 1)); // 移除固定宽度设置 // spinnerValidity.setPreferredSize(new Dimension(35, 20)); spinnerValidity.setName(OutboxComponentNameConstants.DRUG_OUTBOX_LAST_DAY_OF_VALIDITY_SPINNER); ValidationComponentUtils.setMessageKey(this.spinnerValidity, DrugPackageInformationModel.Property.validityPeriod); } return spinnerValidity; }
2. 动态计算合适宽度(需保留大小控制时)
如果必须限制Spinner的大小,不要用固定值,而是根据Spinner的编辑器计算最大可能值的宽度,确保所有数值都能完整显示:
private CamSpinner getValiditySpinner() { if (spinnerValidity == null) { spinnerValidity = new CamSpinner(); spinnerValidity.setModel(new SpinnerNumberModel(1, 1, 99, 1)); // 动态计算适配最大数值的宽度 JSpinner.NumberEditor editor = (JSpinner.NumberEditor) spinnerValidity.getEditor(); FontMetrics metrics = editor.getTextField().getFontMetrics(editor.getTextField().getFont()); // 计算最大数值"99"的文本宽度,加上边距 int preferredWidth = metrics.stringWidth("99") + 20; spinnerValidity.setPreferredSize(new Dimension(preferredWidth, 20)); spinnerValidity.setName(OutboxComponentNameConstants.DRUG_OUTBOX_LAST_DAY_OF_VALIDITY_SPINNER); ValidationComponentUtils.setMessageKey(this.spinnerValidity, DrugPackageInformationModel.Property.validityPeriod); } return spinnerValidity; }
3. UI切换时强制刷新组件
如果是自定义CamSpinner在状态恢复时出现显示异常,可以在UI切换回来的时机(比如组件显示事件)强制刷新Spinner:
// 给Spinner所在的容器添加ComponentListener yourContainer.addComponentListener(new ComponentAdapter() { @Override public void componentShown(ComponentEvent e) { if (spinnerValidity != null) { spinnerValidity.revalidate(); spinnerValidity.repaint(); // 重置编辑器确保文本显示正常 spinnerValidity.setEditor(new JSpinner.NumberEditor(spinnerValidity)); } } });
4. 检查自定义CamSpinner实现
如果CamSpinner是自定义组件,检查是否重写了updateUI()或其他布局相关方法,确保在UI更新时正确同步编辑器的状态,避免文本显示异常。
内容的提问来源于stack exchange,提问作者ru 1
相关产品推荐
相关产品推荐

