与这两个帖子@iMohammad有关,
Increasing/Decreasing Font Size inside textArea using JButton和
Changing Font Style when Clicking on a JButton Java ...,我通过在屏幕上传递JComboBox
作为setPrototypeDisplayValue
的参数来面对来自JComboBox's size
的非常有趣的问题
请问我如何动态调整JComboBox
动态取决于Font
,同样适用于我在sscce
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class ComboBoxFontChange extends JFrame {
private static final long serialVersionUID = 1L;
private JComboBox cbox = new JComboBox();
private JTextField tfield = new JTextField("Change");
private JLabel label = new JLabel("Cash");
private JButton button = new JButton("++ Font");
private JTextField text;
private JPanel panel = new JPanel();
public ComboBoxFontChange() {
super("Combo Box Font change");
text = (JTextField) cbox.getEditor().getEditorComponent();
cbox.addItem("Change");
cbox.addItem("Cash");
cbox.addItem("Font");
tfield.setColumns(5);
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
Font font = cbox.getFont();
font = font.deriveFont((float) (font.getSize2D() * 1.10));
cbox.setFont(font);
// EDIT
cbox.setPrototypeDisplayValue(cbox.getSelectedItem().toString());
tfield.setFont(font);
button.setFont(font);
label.setFont(font);
//panel.revalidate();
//panel.repaint();
pack();
}
});
//panel.setLayout(new GridLayout(2, 2, 10, 10));
panel.add(cbox);
panel.add(label);
panel.add(tfield);
panel.add(button);
setDefaultCloseOperation(EXIT_ON_CLOSE);
add(panel);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
ComboBoxFontChange frame = new ComboBoxFontChange();
frame.pack();
frame.setVisible(true);
}
});
}
}
答案 0 :(得分:4)
我调试了你的SSCCE,传递给setPrototypeDisplayValue
的值是空字符串。将行更改为
cbox.setPrototypeDisplayValue(cbox.getSelectedItem());
使一切按预期工作。删除对setPrototypDisplayValue
的调用也会使程序按预期运行。
编辑:
另一个问题是没有为原型显示值触发事件,因为您像以前一样将其设置为先前的值,并且仅在值实际更改时才触发事件。在cbox.setPrototypeDisplayValue("");
之前添加cbox.setPrototypeDisplayValue(cbox.getSelectedItem().toString())
会使所有内容都按预期运行,即使在JDK 1.6上也是如此。我同意,鉴于字体已更改,应重新计算首选大小,但至少此更改是一种解决方法。
答案 1 :(得分:1)
我尝试过JB Nizet所说的话。但对我来说,comboBox的大小并没有改变。你呢?
所以我尝试了以下内容,随着字体大小的增加,组合框尺寸也随之增加。
cbox.setFont(font);
cbox.updateUI();
我也删除了这行
cbox.setPrototypeDisplayValue(text.getText());
答案 2 :(得分:1)
作为参考,GridLayout
和8次点击在Mac OS X上显示了此结果:
panel.setLayout(new GridLayout(0, 1, 10, 10));
组合:弹出式广告:
另外,cbox.updateUI()
恢复了Aqua UI代表com.apple.laf.AquaComboBoxUI
规定的默认值。
答案 3 :(得分:1)
以下是BasicComboBoxUI中的代码:
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();
}
由于某种原因,字体更改仅重置“最小尺寸”而不是“显示尺寸”。