2009-06-05 11 views
26

मेरे पास एक संपादन योग्य JComboBox है जिसमें एकल अक्षर मानों की एक सूची है। उसके कारण combobox बहुत छोटा है।मैं एक JComboBox ड्रॉपडाउन सूची की चौड़ाई कैसे बदल सकता हूं?

प्रत्येक पत्र का एक विशेष अर्थ होता है जो कभी-कभी शायद ही कभी इस्तेमाल किए गए अक्षरों के मामले में उपयोगकर्ता को स्पष्ट नहीं होता है। इसके कारण मैंने एक कस्टम ListCellRenderer बनाया है जो ड्रॉपडाउन सूची में प्रत्येक अक्षर का अर्थ दिखाता है।

दुर्भाग्यवश यह स्पष्टीकरण ड्रॉपडाउन में फिट नहीं है क्योंकि यह छोटा है, क्योंकि इसमें combobox के समान चौड़ाई है।

क्या ड्रॉपडाउन सूची को combobox से अधिक बनाने का कोई तरीका है?

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

मैं बता गया की चौड़ाई को बदल नहीं सकते क्योंकि आवेदन जहां कुछ चीजें बिल्कुल के रूप में वे पहले थे होना है एक पुरानी विरासत आवेदन की एक मनोरंजन है:

यह मैं क्या हासिल करना चाहते है। (इस मामले में combobox को हर कीमत पर इसका छोटा आकार रखना पड़ता है)

उत्तर

14

मेरा मानना ​​है कि सार्वजनिक एपीआई के साथ ऐसा करने का एकमात्र तरीका कस्टम यूआई लिखना है (twobugs इससे निपटने वाले हैं)।

तुम सिर्फ कुछ त्वरित और गंदे चाहते हैं, मैं यह करने के कार्यान्वयन विवरण का उपयोग करने के इस तरह से (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); 
} 

एक PopupMenuListener में इस रखो और यह पराक्रम आप के लिए काम करते ।

या आप first linked bug से कोड इस्तेमाल कर सकते हैं:

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()); 
    } 
} 
+0

दोनों विधियां काम करने लगती हैं लेकिन popupMenuWillBecomeVisible केवल तभी काम करता है जब आप एक कस्टम ListCellRenderer भी प्रदान करते हैं। डिफ़ॉल्ट आकार मूल आकार पर तारों को काटता प्रतीत होता है। –

+0

जेसीम्बोबॉक्स (ओएसएक्स) में 8 आइटम होने पर पहली बार खुराक मेरे लिए काम नहीं करती है। और दूसरे में मैक पर भी विंडोज़ का नजरिया है .... – Grains

+0

पहला समाधान काम नहीं करता है, क्योंकि popupMenuWillBecomeVisible को आकार सेट करने से पहले बुलाया जाता है (BasicComboPopup में शो() देखें), इसलिए उस श्रोता में आपके द्वारा सेट किया गया कोई भी आकार ओवरराइट किया जाएगा। –

1

लगता है जैसे आपको अपना खुद का ComboBoxUI लिखना होगा।

एक अच्छा उदाहरण here है जो दिखाता है कि इसे कैसे पूरा किया जाए।

यह भी ध्यान दें, जिस विधि में आप शायद रुचि रखते हैं वह createPopup() विधि है। यह वह तरीका है जो कॉम्बो बॉक्स के लिए पॉपअप बनाता है और जहां आप इसे अनुकूलित करने में सक्षम होंगे।

13

यहाँ की तरह एक महान यूआई और अन्य बुरा सामान के साथ गड़बड़ करने के लिए संतोष कुमार ने समाधान, आवश्यकता के बिना है उसके जैसा!

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; 
    } 
} 
+0

यह समाधान ऊंचाई, केवल चौड़ाई समायोजित नहीं करता है। ऊंचाई समायोजित करना कहीं अधिक जटिल है। – DejanLekic

+0

मेरे लिए काम नहीं करता – user489872

+0

यह समाधान मूल combobox के 'तीर' तोड़ता है। लागू होने के बाद, अब कोई तीर नहीं है –

3

यहाँ tutiez से एक अच्छा उपाय है।

पॉपअप सूची के आयाम को स्थापित करने से पहले, इसे इससे सबसे बड़ी वस्तु मिलती है और इसे पूरी तरह दिखाने के लिए आवश्यक चौड़ाई की गणना की जाती है।

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); 

    } 
} 

उपरोक्त कोड पहले से ही एक त्वरित परीक्षण के लिए मुख्य है।लेकिन ध्यान दें कि नीचे दिए गए बयान को पर समायोजित किया जा सकता है यदि आप लंबवत स्क्रॉल करना चाहते हैं।

return widest + 5; 

आशा है कि यह भविष्य के संदर्भ के लिए उपयोगी है!

0

आप setSize() विधि का उपयोग करना चाह सकते हैं।

combo.setSize(200, combo.getPreferredSize().height); 
संबंधित मुद्दे