obtener and java swing combobox

java - and - ¿Cómo puedo cambiar el ancho de una lista desplegable JComboBox?



jcombobox java value text (7)

¡Aquí hay una gran solución de Santhosh Kumar, sin la necesidad de meterse con UI y otras cosas desagradables como esa!

http://www.jroller.com/santhosh/entry/make_jcombobox_popup_wide_enough

import javax.swing.*; import java.awt.*; import java.util.Vector; // got this workaround from the following bug: // http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4618607 public class WideComboBox extends JComboBox{ public WideComboBox() { } public WideComboBox(final Object items[]){ super(items); } public WideComboBox(Vector items) { super(items); } public WideComboBox(ComboBoxModel aModel) { super(aModel); } private boolean layingOut = false; public void doLayout(){ try{ layingOut = true; super.doLayout(); }finally{ layingOut = false; } } public Dimension getSize(){ Dimension dim = super.getSize(); if(!layingOut) dim.width = Math.max(dim.width, getPreferredSize().width); return dim; } }

Tengo un JComboBox editable que contiene una lista de valores de una sola letra. Debido a eso, el combobox es muy pequeño.

Cada letra tiene un significado especial que a veces no es claro para el usuario en caso de letras raramente usadas. Por eso he creado un ListCellRenderer personalizado que muestra el significado de cada letra en la lista desplegable.

Desafortunadamente, esta explicación no cabe en el menú desplegable porque es demasiado pequeña, porque tiene el mismo ancho que el cuadro combinado.

¿Hay alguna manera de hacer que la lista desplegable sea más amplia que el combobox?

Esto es lo que quiero lograr:

--------------------- | Small JCombobox | V | -------------------------------------------- | "Long item 1" | -------------------------------------------- | "Long item 2" | -------------------------------------------- | "Long item 3" | --------------------------------------------

No puedo cambiar el ancho del combobox porque la aplicación es una recreación de una antigua aplicación heredada donde algunas cosas tienen que ser exactamente como lo eran antes. (En este caso, el cuadro combinado debe mantener su pequeño tamaño a toda costa)


Aquí hay una buena solución de tutiez .

Antes de configurar la dimensión de la lista emergente, obtiene el elemento más grande y calcula el ancho necesario para mostrarlo por completo.

public class WiderDropDownCombo extends JComboBox { private String type; private boolean layingOut = false; private int widestLengh = 0; private boolean wide = false; public WiderDropDownCombo(Object[] objs) { super(objs); } public boolean isWide() { return wide; } // Setting the JComboBox wide public void setWide(boolean wide) { this.wide = wide; widestLengh = getWidestItemWidth(); } public Dimension getSize() { Dimension dim = super.getSize(); if (!layingOut && isWide()) dim.width = Math.max(widestLengh, dim.width); return dim; } public int getWidestItemWidth() { int numOfItems = this.getItemCount(); Font font = this.getFont(); FontMetrics metrics = this.getFontMetrics(font); int widest = 0; for (int i = 0; i < numOfItems; i++) { Object item = this.getItemAt(i); int lineWidth = metrics.stringWidth(item.toString()); widest = Math.max(widest, lineWidth); } return widest + 5; } public void doLayout() { try { layingOut = true; super.doLayout(); } finally { layingOut = false; } } public String getType() { return type; } public void setType(String t) { type = t; } public static void main(String[] args) { String title = "Combo Test"; JFrame frame = new JFrame(title); String[] items = { "I need lot of width to be visible , oh am I visible now", "I need lot of width to be visible , oh am I visible now" }; WiderDropDownCombo simpleCombo = new WiderDropDownCombo(items); simpleCombo.setPreferredSize(new Dimension(180, 20)); simpleCombo.setWide(true); JLabel label = new JLabel("Wider Drop Down Demo"); frame.getContentPane().add(simpleCombo, BorderLayout.NORTH); frame.getContentPane().add(label, BorderLayout.SOUTH); int width = 200; int height = 150; frame.setSize(width, height); frame.setVisible(true); } }

El código anterior ya tiene una principal para una prueba rápida. Pero tenga en cuenta que la siguiente declaración se puede ajustar a alrededor de 20 si desea tener un desplazamiento vertical.

return widest + 5;

Espero que sea útil para referencia futura!


Aquí tienes una simple pieza de código sin extensiones JComboBox ni ninguna otra clase

En este ejemplo, el con de desplegable es 500 siempre. También puede modificar la altura o la ubicación.

FaceCorrectiveReasonComboBox.getTextComponent().setUI(new BasicComboBoxUI() { @Override protected ComboPopup createPopup() { return new BasicComboPopup(comboBox) { protected Rectangle computePopupBounds(int px,int py,int pw,int ph) { return super.computePopupBounds(px, py, 500, ph); } }; } });


Creo que la única forma de hacer esto con la API pública es escribir una IU personalizada (hay two bugs relacionados con esto).

Si solo quieres algo rápido y sucio, encontré esta forma de utilizar los detalles de implementación para hacerlo ( here ):

public void popupMenuWillBecomeVisible(PopupMenuEvent e) { JComboBox box = (JComboBox) e.getSource(); Object comp = box.getUI().getAccessibleChild(box, 0); if (!(comp instanceof JPopupMenu)) return; JComponent scrollPane = (JComponent) ((JPopupMenu) comp).getComponent(0); Dimension size = new Dimension(); size.width = box.getPreferredSize().width; size.height = scrollPane.getPreferredSize().height; scrollPane.setPreferredSize(size); // following line for Tiger // scrollPane.setMaximumSize(size); }

Pon esto en un PopupMenuListener y podría funcionar para ti.

O puede usar el código del two :

class StyledComboBoxUI extends BasicComboBoxUI { protected ComboPopup createPopup() { BasicComboPopup popup = new BasicComboPopup(comboBox) { @Override protected Rectangle computePopupBounds(int px,int py,int pw,int ph) { return super.computePopupBounds( px,py,Math.max(comboBox.getPreferredSize().width,pw),ph ); } }; popup.getAccessibleContext().setAccessibleParent(comboBox); return popup; } } class StyledComboBox extends JComboBox { public StyledComboBox() { setUI(new StyledComboBoxUI()); } }


Es posible que desee utilizar el método setSize() .

combo.setSize(200, combo.getPreferredSize().height);



Parece que tendrás que escribir tu propia ComboBoxUI .

Hay un buen ejemplo here que muestra cómo lograr esto.

También tenga en cuenta que el método que probablemente le interese es el método createPopup() . Este es el método que crea la ventana emergente para el cuadro combinado y donde podría personalizarlo.