Skip to Main Content

Java SE (Java Platform, Standard Edition)

Announcement

For appeals, questions and feedback about Oracle Forums, please email oracle-forums-moderators_us@oracle.com. Technical questions should be asked in the appropriate category. Thank you!

Interested in getting your voice heard by members of the Developer Marketing team at Oracle? Check out this post for AppDev or this post for AI focus group information.

How to widen the drop-down list in a JComboBox

843804Nov 11 2004 — edited Aug 27 2007
Is there some way to set the width of the drop-down list of a JComboBox? Note, this is not the same thing as setting the width of the JComboBox itself (vis-a-vis setBounds() or setSize()). I've got my JComboBox set as wide as possible, but the thing is the items in the list are dynamic and user defined, and there is no way to predict the width of the widest item. Does anyone know how to do this?

Gib

Comments

843804
By default, the JComboBox dropdown is as wide as its widest element, so you should not have to make any modification. If you insert a very long item the drop down should take care of itself (assuming there is enough screen space to do so).

However, if you are really interested in how it works, check out the BasicComboUI ...you will find a method like createPopup....check that out.

Good luck!
843804
Unfortunately, my program seems to disagree ;). I'm looking at it right now, and the popup list is undeniably too narrow to show the longest item (a String that's only 1/4 showing). It seems to prefer being as wide as the JComboBox itself, and that I can only make so wide (the GUI is pretty packed as it is).

I checked out BasicComboUI.createPopup(), but couldn't find anything I can use (maybe more insight on my part is needed). For one thing, it is protected, and for another, it returns a ComboPopup which is an interface whose methods are completely unrelated to anything I need. Any other suggestions at all (maybe some Swing settings that aren't set right?)
794342
http://forum.java.sun.com/thread.jsp?forum=57&thread=507038
843804
gib,

checkout this forum thread:

http://forum.java.sun.com/thread.jsp?thread=522572&forum=57&message=2501520

In the above thread, even the JExtendedComboBox is a little overkill. I chose a slightly different path:

Create an adapter between the JComboBox and PopupMenuEvents that implements the PopupMenuListener interface and register it with the JComboBox via addPopupMenuListener().

The adapter, upon receiving a PopupMenuEvent via the popupMenuWillBecomeVisible() method, then either resets the preferred width of the popup using the resizeComboPopup() method (from the thread above), or, alternatively, simply turns on the horizontal scroll bar of the JScrollPane that contains the popup.

Hope that helps...
843806
This is a few years too late, but if anyone else stumbles into here with the same question this can help. My solution is short to code (half of it is just comments) but semicomplex to explain, because it involves events firing other events with feedback prevention. Anyway, give your JComboBox a PopupMenuListener, and create a global boolean (this will be used to prevent feedback). The sneaky thing about this techniques is it extends the JComboBox, creates the JPopupMenu with the new length, and resets the JComboBox length by cancelling the popup, sneaking into popupMenuCanceled, and repopping from there! I amaze me!
//Popup state to prevent feedback
boolean stateCmb = false;

//Extend JComboBox's length and reset it
public void popupMenuWillBecomeVisible(PopupMenuEvent e)
{
  JComboBox cmb = (JComboBox)e.getSource();
  //Extend JComboBox
  cmb.setSize(NEW_LENGTH, cmb.getHeight());
  //If it pops up now JPopupMenu will still be short
  //Fire popupMenuCanceled...
  if(!stateCmb)
    cmb.firePopupMenuCanceled();
  //Reset JComboBox and state
  stateCmb = false;
  cmb.setSize(OLD_LENGTH, cmb.getHeight());
}
		
//Show extended JPopupMenu
public void popupMenuCanceled(PopupMenuEvent e)
{
  JComboBox cmb = (JComboBox)e.getSource();
  stateCmb = true;
  //JPopupMenu is long now, so repop
  cmb.showPopup();
}
Message was edited by:
dlinderm

Message was edited by:
dlinderm
843806
I have implemented dlinderm's solution and it works except for one major problem:

If you click on a ComboBox but then click off of it (clicking somewhere else on the interface other than the ComboBox) without selecting anything, the extended width will never again display when clicking the ComboBox in the future. Instead, the ComboBox will always show the regular width.

Does anyone know how to get around this problem?
843806
Add this:
public void popupMenuWillBecomeInvisible(PopupMenuEvent e) {
		stateCmb = false;
	}
1 - 7
Locked Post
New comments cannot be posted to this locked post.

Post Details

Locked on Sep 24 2007
Added on Nov 11 2004
7 comments
2,051 views