JComboBox too long for JFrame

765 views Asked by At

I have a problem with JComboBoxes and long Strings. The result is that the JComboBox is too long for the JFrame so it doesn't display the whole box. Here i have a little code which shows my problem:

    JFrame frame = new JFrame();
    frame.setSize(500, 500);
    JPanel panel = new JPanel();
    DesignGridLayout layout = new DesignGridLayout(panel);
    Vector<ArrayList<String>> content = new Vector<ArrayList<String>>();
    ArrayList<String> list = new ArrayList<String>();
    list.add("12345");
    list.add("abcde");
    list.add("12345");
    list.add("abcde");
    list.add("12345");
    list.add("abcde");
    list.add("12345");
    list.add("abcde");
    list.add("12345");
    list.add("abcde");
    list.add("12345");
    list.add("abcde");
    content.add(list);
    ComboBoxFullMenu<ArrayList<String>> combobox = new ComboBoxFullMenu<ArrayList<String>>(content);
    combobox.setRenderer(new DefaultListCellRenderer() {

        private static final long serialVersionUID = 1L;

        @Override
        public Component getListCellRendererComponent(JList<?> list, Object value, int index, boolean isSelected, boolean cellHasFocus) 
        {
            super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
            ArrayList<String> array = (ArrayList<String>) value;
            if (!array.isEmpty())
            {
                String text = "";
                for (String info : array)
                {
                    text += info + "; ";
                }
                setText(text);
            }
            return this;
        }
    });
    AutoCompleteDecorator.decorate(combobox, new ObjectToStringConverter()
    {

        @Override
        public String getPreferredStringForItem(Object object)
        {
            if (object != null)
            {
                if (object instanceof ArrayList)
                {
                    ArrayList<String> list = (ArrayList<String>) object;
                    String text = "";
                    for (String info : list)
                    {
                        text += info + "; ";
                    }
                    return text;
                }
                else
                {
                    return object.toString();
                }
            }
            return null;
        }
    });
    layout.row().grid().add(combobox);
    frame.add(panel);
    frame.setVisible(true);

And here is the class ComboBoxFullMenu:

public class ComboBoxFullMenu<E> extends JComboBox<E>
{

    /**
     * 
     */
    private static final long serialVersionUID = 1L;

    public ComboBoxFullMenu(Vector<E> items) 
    {
        super(items);
        addActionListener(this);
    }

    public ComboBoxFullMenu()
    {
        super();
        addActionListener(this);
    }

    public ComboBoxFullMenu (DefaultComboBoxModel<E> defaultComboBoxModel)
    {
        super(defaultComboBoxModel);
        addActionListener(this);
    }

    /**
     * Small hack to get pop up menu size bigger enough to show items even though
     * the combo box size could be smaller
     * */
    private boolean layingOut = false; 

    @Override
    public void doLayout()
    { 
        try
        { 
            layingOut = true; 
            super.doLayout(); 
        }
        finally
        { 
            layingOut = false; 
        } 
    } 

    @Override
    public Dimension getSize()
    { 
        Dimension dim = super.getSize(); 
        if ( !layingOut ) 
        {
            dim.width = Math.max(dim.width, getPreferredSize().width);
        }
        return dim; 
    }
}

I also tried using DefaultListCellRenderer and ObjectTroStringConverter to display the selected item in a shorter way, but i need to see all informations in the dropdownmenu and i think the JComboBox calculates its width about the longest item? I hope you understand my problem otherwise let me know.

2

There are 2 answers

5
Jayfray On

Try using this WideComboBox. It allows you to set the width of the JComboBox but when the popup is show it shows the entire item. Meaning the popup will be wider than the JComboBox. You also may find this helpful

0
camickr On

Check out Combo Box Popup is allows you to control the width of the popup. You can set the width

  1. to the size of the largest string, or
  2. specify a maximum width.

You can then turn on scrolling in the popup if the string is larger than the specified width.