为什么JComboBox会忽略PrototypeDisplayValue

时间:2011-12-30 12:26:01

标签: java swing fonts resize jcombobox

与这两个帖子@iMohammad有关, Increasing/Decreasing Font Size inside textArea using JButtonChanging Font Style when Clicking on a JButton Java ...,我通过在屏幕上传递JComboBox作为setPrototypeDisplayValue的参数来面对来自JComboBox's size的非常有趣的问题

请问我如何动态调整JComboBox动态取决于Font,同样适用于我在sscce

中尝试过的其他JComponents
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);
            }
        });
    }
}

4 个答案:

答案 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));

组合:combo弹出式广告:popup

另外,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();
        }

由于某种原因,字体更改仅重置“最小尺寸”而不是“显示尺寸”。