You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 11:12:29