Java 为什么JComboBox忽略PrototypeDisplayValue
关于这两篇博文@iMohammad, 和 …,我面临着一个非常有趣的问题,它来自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
JComboBox
,通过在屏幕上传递setPrototypeDisplayValue
作为JComboBox大小的参数
请了解如何根据Font
动态调整JComboBox
的大小,这与我在我的应用程序中尝试的另一个JComponents相同
我调试了您的SSCCE,传递给setPrototypeDisplayValue
的值是空字符串。将线路更改为
cbox.setPrototypeDisplayValue(cbox.getSelectedItem());
使一切按预期进行。删除对setPrototypDisplayValue
的调用也会使程序按预期运行
编辑:
另一个问题是,没有为原型显示值触发事件,因为您像以前一样将其设置为上一个值,并且仅当值实际更改时才会触发事件。添加cbox.setPrototypeDisplayValue(“”)
beforecbox.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();
}