Почему JComboBox игнорирует PrototypeDisplayValue - PullRequest
5 голосов
/ 30 декабря 2011

В связи с этими двумя публикациями @iMohammad, Увеличение / уменьшение размера шрифта внутри textArea с использованием JButton и Изменение стиля шрифта при нажатии на JButton Java ..., ястолкнулся с действительно забавной проблемой, возникшей из JComboBox, передав setPrototypeDisplayValue в качестве аргумента для JComboBox's size на экране

, пожалуйста, как я могу изменить размер JComboBox, динамически зависит от Font, так же, как работаетправильно для других JComponents, которые я попробовал в моем 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);
            }
        });
    }
}

Ответы [ 4 ]

4 голосов
/ 30 декабря 2011

Я отладил ваш SSCCE, и значение, переданное setPrototypeDisplayValue, является пустой строкой.Изменение строки на

cbox.setPrototypeDisplayValue(cbox.getSelectedItem());

Все работает как положено.Удаление вызова на setPrototypDisplayValue также приводит к тому, что программа ведет себя так, как и ожидалось.

РЕДАКТИРОВАТЬ:

Другая проблема заключается в том, что ни одно событие не вызывается для значения отображения прототипа, поскольку вы устанавливаете его на предыдущеезначение, как и раньше, и событие вызывается, только если значение действительно изменяется.Добавление cbox.setPrototypeDisplayValue(""); перед cbox.setPrototypeDisplayValue(cbox.getSelectedItem().toString()) заставляет все работать так, как ожидается, даже в JDK 1.6.Я согласен с тем, что с учетом изменения шрифта предпочтительный размер следует пересчитать, но по крайней мере это изменение является обходным путем.

1 голос
/ 30 декабря 2011

Вот код из 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();
        }

По какой-то причине изменение шрифта сбрасывает только «минимальный размер», а не «размер экрана».

1 голос
/ 30 декабря 2011

Для справки, GridLayout и восемь кликов дали этот результат в Mac OS X:

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

Комбо: combo Всплывающее окно: popup

Кроме того, cbox.updateUI() восстановил значения по умолчанию, предписанные делегатом Aqua UI, com.apple.laf.AquaComboBoxUI.

1 голос
/ 30 декабря 2011

Я попробовал то, что сказал Дж. Б. Низет.Но для меня размер comboBox не изменился.Как насчет вас?

Итак, я попробовал следующее, и размер ящика увеличился с увеличением размера шрифта.

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

Я также удалил строку

cbox.setPrototypeDisplayValue(text.getText()); 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...