【问题标题】:Why JComboBox ignore PrototypeDisplayValue为什么 JComboBox 忽略 PrototypeDisplayValue
【发布时间】:2012-01-30 13:17:35
【问题描述】:

与@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);
            }
        });
    }
}

【问题讨论】:

    标签: java swing fonts resize jcombobox


    【解决方案1】:

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

    cbox.setPrototypeDisplayValue(cbox.getSelectedItem());
    

    使一切按预期工作。删除对setPrototypDisplayValue 的调用也会使程序按预期运行。

    编辑:

    另一个问题是原型显示值没有触发任何事件,因为您像以前一样将它设置为以前的值,并且只有在值实际发生变化时才会触发事件。在 cbox.setPrototypeDisplayValue(cbox.getSelectedItem().toString()) 之前添加 cbox.setPrototypeDisplayValue(""); 会使一切都按预期运行,即使在 JDK 1.6 上也是如此。我同意鉴于字体已更改,应重新计算首选大小,但至少此更改是一种解决方法。

    【讨论】:

    • 误编了错误的代码行,手快,现在作为例子是正确的
    • 请解释程序应该做什么,以及它做什么。一切似乎都按预期工作(JDK 1.7.0_02-ea)。
    • :-) 我们其他人仍然在 Java6 中,JComboBox 在屏幕上仍然有相同的大小
    【解决方案2】:

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

    所以我尝试了以下操作,随着我增加字体大小,组合框的大小也增加了。

    cbox.setFont(font);
    cbox.updateUI();
    

    我也删除了这条线

    cbox.setPrototypeDisplayValue(text.getText()); 
    

    【讨论】:

    • +1 有效,但是还有一个问题,肯定有Bug,因为updateUI(Look and Feel) 和我们预期的一样有效,我认为这个问题与更新Look and Feel 无关,奇怪
    • 不要使用 updateUI() 方法。那是为了改变 LAF。更改字体不是 LAF 更改。
    【解决方案3】:

    作为参考,GridLayout 和八次点击在 Mac OS X 上给出了这个结果:

    panel.setLayout(new GridLayout(0, 1, 10, 10));
    

    组合: 弹出:

    顺便说一句,cbox.updateUI() 恢复了 Aqua UI 委托 com.apple.laf.AquaComboBoxUI 规定的默认值。

    【讨论】:

    • 同意FlowLayout和JComboBox
    【解决方案4】:

    这是来自 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();
            }
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-11-06
      • 2019-03-22
      • 2017-07-07
      • 2021-02-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多