JComboBox.addItem для нулевых объектов - PullRequest
0 голосов
/ 02 июля 2010

HI,

У меня есть JComboBox, к которому я добавляю свои элементы пользовательских объектов.Но иногда добавленный объект пуст.Таким образом, когда в поле со списком есть пустые элементы, он разрушается и становится очень тонким.Но после заселения становится норальной высоты.Может кто-нибудь предложить что-нибудь, чтобы сохранить высоту JComboBox, даже если не добавлено ни одного элемента или пустого элемента.

приватный финал JComboBox comboField = new JComboBox ();comboField.removeAllItems ();comboField.addItem (getFirstConfig ());comboField.addItem (getSecConfig ());

Спасибо

Ответы [ 3 ]

1 голос
/ 02 июля 2010

Вы можете сделать это, установив минимальный размер, но правильное значение зависит от шрифта.Вы можете угадать значение или установить его из addNotify с некоторой помощью из FontMetrics.

. Обычно я обнаружил, что проще сделать это, сделав первый элемент что-то вроде: "- Выберите Config-- ", или, если вы знаете, что нет элементов для выбора:" - Нет доступных конфигураций - "

Обновление:

Поскольку вы не можете использовать заполнитель, ваши альтернативы зависят от используемого менеджера компоновки и LAF.

В основном это равносильно установке минимального и / или предпочтительного размера JComponent.Это неточно, но я обычно использую GridBagLayout и у меня хорошие результаты при таком подходе:

    @Override
    public void addNotify() {
        super.addNotify();
        combo.setMinimumSize(atLeast(combo.getMinimumSize(), 100, 20));
        combo.setPreferredSize(atLeast(combo.getPreferredSize(), 100, 20));
    }

    private Dimension atLeast(Dimension d, int minWidth, int minHeight) {
        d.width = Math.max(minWidth, d.width);
        d.height = Math.max(minHeight, d.height);
        return d;
    }

Замените 100,20 на минимальное значение, которое вам подходит.

0 голосов
/ 07 июля 2010

Просто добавили проверку, что если параметры для Jcombobox равны нулю, то добавьте пустую строку "". Это удерживает ComboBox от разрушения.

0 голосов
/ 02 июля 2010

Вы говорите о выпадающем списке или о самой коробке. Если это просто коробка, не могли бы вы просто установить на нее минимальную высоту?

Обновление: Основываясь на вашем комментарии, я провел с ним эксперимент. В зависимости от того, какой менеджер компоновки вы используете, поведение компонентов может быть разным. Один из способов, которым это может сработать, - обернуть ваше поле со списком в панель макета потока и установить предпочтительный размер, как показано ниже. Если это по-прежнему не помогает, скажите, пожалуйста, какой у вас менеджер макета.

код (исполняемый пример):

import javax.swing.*;
import java.awt.event.*;
import java.awt.*;

public class JComboBoxTest {
    private static JComboBox combo;
    private static String[] labelStrs = new String[5];

    private static void createAndShowGUI() {
        final JFrame frame = new JFrame("test");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        for (int i = 0; i < 5; i += 1) {
            labelStrs[i] = "I am label #" + i;
        }

        combo = new JComboBox(labelStrs);

        //------------------------------------------------
        combo.setPreferredSize(new Dimension(100, 20));
        //------------------------------------------------

        JButton remove = new JButton("remove");
        remove.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                combo.removeAllItems();
                frame.repaint();
            }
        });

        JButton add = new JButton("add");
        add.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                for (int i = 0; i < 5; i += 1) {
                    combo.addItem(labelStrs[i]);
                }
                frame.repaint();
            }
        });

        Panel container = new Panel();
        Panel wrapper = new Panel();
        Panel btns = new Panel();

        container.setLayout(new FlowLayout());
        container.add(combo);
        wrapper.add(container); 
        btns.add(remove);
        btns.add(add);

        frame.getContentPane().setLayout(new BorderLayout());
        frame.getContentPane().add(wrapper, BorderLayout.CENTER);
        frame.getContentPane().add(btns, BorderLayout.SOUTH);

        frame.pack();
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        javax.swing.SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                createAndShowGUI();
            }
        });
    }   
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...