Index: javax/swing/plaf/basic/BasicComboBoxRenderer.java =================================================================== RCS file: /cvsroot/classpath/classpath/javax/swing/plaf/basic/BasicComboBoxRenderer.java,v retrieving revision 1.4 diff -u -r1.4 BasicComboBoxRenderer.java --- javax/swing/plaf/basic/BasicComboBoxRenderer.java 2 Jul 2005 20:32:50 -0000 1.4 +++ javax/swing/plaf/basic/BasicComboBoxRenderer.java 15 Sep 2005 19:51:33 -0000 @@ -40,12 +40,16 @@ import java.awt.Component; import java.awt.Dimension; +import java.awt.FontMetrics; import java.io.Serializable; import javax.swing.JLabel; import javax.swing.JList; import javax.swing.ListCellRenderer; import javax.swing.SwingConstants; +import javax.swing.SwingUtilities; import javax.swing.UIDefaults; import javax.swing.UIManager; import javax.swing.border.Border; @@ -100,7 +104,28 @@ boolean cellHasFocus) { String s = value.toString(); - setText(s); + + // String maybe larger than comboBox. + FontMetrics fm = getToolkit().getFontMetrics(list.getFont()); + int strWidth = SwingUtilities.computeStringWidth(fm, s); + int cbWidth = getSize().width; + if (cbWidth != 0 && strWidth > cbWidth) + { + char[] str = s.toCharArray(); + int currWidth = 0; + int i = 0; + String postStr = "... "; + cbWidth -= SwingUtilities.computeStringWidth(fm, postStr); + while (i < str.length && currWidth < cbWidth) + { + ++i; + currWidth = SwingUtilities.computeStringWidth(fm, new String(str, 0, i)); + } + setText(new String(str, 0, i) + postStr); + } + else + setText(s); + setOpaque(true); UIDefaults defaults = UIManager.getLookAndFeelDefaults(); Index: javax/swing/plaf/basic/BasicComboBoxUI.java =================================================================== RCS file: /cvsroot/classpath/classpath/javax/swing/plaf/basic/BasicComboBoxUI.java,v retrieving revision 1.11 diff -u -r1.11 BasicComboBoxUI.java --- javax/swing/plaf/basic/BasicComboBoxUI.java 13 Sep 2005 21:10:50 -0000 1.11 +++ javax/swing/plaf/basic/BasicComboBoxUI.java 15 Sep 2005 19:51:33 -0000 @@ -844,7 +844,8 @@ */ protected Dimension getDefaultSize() { - return new Dimension(6, 17); + // FIXME: Not implemented properly. + return new Dimension(100, 20); } /** @@ -853,7 +854,7 @@ * * @return dimensions of the largest item in the combo box. */ - protected Dimension getLargestItemSize() + private Dimension getLargestItemSize() { ComboBoxModel model = comboBox.getModel(); int numItems = model.getSize(); @@ -962,7 +963,26 @@ public Dimension minimumLayoutSize(Container parent) { - return preferredLayoutSize(parent); + Dimension minSize = getDefaultSize(); + ComboBoxModel model = comboBox.getModel(); + int numItems = model.getSize(); + + if (numItems == 0) + return minSize; + + ListCellRenderer renderer = comboBox.getRenderer(); + + for (int i = 0; i < numItems; i++) + { + Object item = model.getElementAt(i); + String s = item.toString(); + Component comp = renderer.getListCellRendererComponent(listBox, item, + -1, false, false); + + if (comp.getPreferredSize().width < minSize.width) + minSize = comp.getMinimumSize(); + } + return minSize; } /** @@ -1105,25 +1125,17 @@ */ public void intervalAdded(ListDataEvent e) { - // must determine if the size of the combo box should change - int start = e.getIndex0(); - int end = e.getIndex1(); - ComboBoxModel model = comboBox.getModel(); ListCellRenderer renderer = comboBox.getRenderer(); if (largestItemSize == null) - largestItemSize = new Dimension(0, 0); + largestItemSize = getLargestItemSize(); + if (largestItemSize.width < getDefaultSize().width) + largestItemSize.width = getDefaultSize().width; + if (largestItemSize.height < getDefaultSize().height) + largestItemSize.height = getDefaultSize().height; - for (int i = start; i < end; i++) - { - Object item = model.getElementAt(i); - Component comp = renderer.getListCellRendererComponent(new JList(), - item, -1, - false, false); - if (comp.getPreferredSize().getWidth() > largestItemSize.getWidth()) - largestItemSize = comp.getPreferredSize(); - } + comboBox.repaint(); } /**