Java 为什么JComboBox忽略PrototypeDisplayValue

Java 为什么JComboBox忽略PrototypeDisplayValue,java,swing,fonts,resize,jcombobox,Java,Swing,Fonts,Resize,Jcombobox,关于这两篇博文@iMohammad, 和 …,我面临着一个非常有趣的问题,它来自JComboBox,通过在屏幕上传递setPrototypeDisplayValue作为JComboBox大小的参数 请了解如何根据Font动态调整JComboBox的大小,这与我在我的应用程序中尝试的另一个JComponents相同 我调试了您的SSCCE,传递给setPrototypeDisplayValue的值是空字符串。将线路更改为 cbox.setPrototypeDisplayValue(cbox.get

关于这两篇博文@iMohammad, 和 …,我面临着一个非常有趣的问题,它来自
JComboBox
,通过在屏幕上传递
setPrototypeDisplayValue
作为
JComboBox大小的参数

请了解如何根据
Font
动态调整
JComboBox
的大小,这与我在我的应用程序中尝试的另一个JComponents相同


我调试了您的SSCCE,传递给
setPrototypeDisplayValue
的值是空字符串。将线路更改为

cbox.setPrototypeDisplayValue(cbox.getSelectedItem());
使一切按预期进行。删除对
setPrototypDisplayValue
的调用也会使程序按预期运行

编辑:


另一个问题是,没有为原型显示值触发事件,因为您像以前一样将其设置为上一个值,并且仅当值实际更改时才会触发事件。添加
cbox.setPrototypeDisplayValue(“”)
before
cbox.setPrototypeDisplayValue(cbox.getSelectedItem().toString())
使一切按预期运行,即使在JDK 1.6上也是如此。我同意,如果字体已更改,则应重新计算首选大小,但至少这种更改是一种解决方法。

我尝试了JB Nizet所说的方法。但对我来说,组合框的大小没有改变。你呢

因此,我尝试了下面的方法,组合框的大小随着字体大小的增加而增加

cbox.setFont(font);
cbox.updateUI();
我还删除了该行

cbox.setPrototypeDisplayValue(text.getText()); 

作为参考,在Mac OS X上,一个
GridLayout
和八次单击得到了以下结果:

panel.setLayout(new GridLayout(0, 1, 10, 10));
组合:弹出:


另外,
cbox.updateUI()
恢复了Aqua UI委托所规定的默认值,
com.apple.laf.AquaComboBoxUI

以下是来自BasicComboxUI的代码:

        else if ( propertyName == "font" ) {
            listBox.setFont( comboBox.getFont() );
            if ( editor != null ) {
                editor.setFont( comboBox.getFont() );
            }
            isMinimumSizeDirty = true;
            comboBox.validate();
        }
        else if ( propertyName == JComponent.TOOL_TIP_TEXT_KEY ) {
            updateToolTipTextForChildren();
    }
        else if ( propertyName == BasicComboBoxUI.IS_TABLE_CELL_EDITOR ) {
            Boolean inTable = (Boolean)e.getNewValue();
    isTableCellEditor = inTable.equals(Boolean.TRUE) ? true : false;
        }
    else if (propertyName == "prototypeDisplayValue") {
            isMinimumSizeDirty = true;
            isDisplaySizeDirty = true;
            comboBox.revalidate();
        }

由于某些原因,字体更改只会重置“最小大小”而不是“显示大小”。

我错误地编辑了错误的代码行,fast hands,现在是正确的示例请解释程序应该做什么,以及它应该做什么。一切似乎都像预期的那样工作(JDK 1.7.0_02-ea)。:-)我们中的其他人仍然使用Java6,JComboBox在屏幕上的大小仍然相同+1工作,但还有另一个问题,必须存在
Bug
,因为
updateUI(Look and Feel)
按照我们的预期工作,我认为这个问题与update
外观无关,请不要使用updateUI()方法。这是LAF的变化。更改字体不是LAF更改。同意关于FlowLayout和JComboBox
        else if ( propertyName == "font" ) {
            listBox.setFont( comboBox.getFont() );
            if ( editor != null ) {
                editor.setFont( comboBox.getFont() );
            }
            isMinimumSizeDirty = true;
            comboBox.validate();
        }
        else if ( propertyName == JComponent.TOOL_TIP_TEXT_KEY ) {
            updateToolTipTextForChildren();
    }
        else if ( propertyName == BasicComboBoxUI.IS_TABLE_CELL_EDITOR ) {
            Boolean inTable = (Boolean)e.getNewValue();
    isTableCellEditor = inTable.equals(Boolean.TRUE) ? true : false;
        }
    else if (propertyName == "prototypeDisplayValue") {
            isMinimumSizeDirty = true;
            isDisplaySizeDirty = true;
            comboBox.revalidate();
        }