BasicComboPopup中下拉列表的高度

时间:2016-03-18 13:52:21

标签: java swing jcombobox

如前所述,我现在为我的问题提供可行的代码。

**HTML to Run Applet**
<HTML>
<HEAD>
</HEAD>
<BODY>
<div >
<APPLET CODE="Main.class" WIDTH="800" HEIGHT="500">
</APPLET>
</div>
</BODY>
</HTML>

小程序类

public class Main extends Applet{
   public void init(){
       JComboBoxUI c = new JComboBoxUI();
       c.addItem("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA");
       c.addItem("B");
c.addItem("C");
c.addItem("D");
c.addItem("E");
c.addItem("F");
c.addItem("G");
c.addItem("H");    
c.addItem("I");
c.addItem("J");
c.addItem("K");
c.addItem("L");
c.setName("Combo Box");
c.setSelectedItem("D");
       c.setMaximumRowCount(20);
       c.setPreferredSize(new Dimension(150,20));
     add(c);
   }
}

MetalComboBox - 覆盖BasicComboPopUp

public class JComboBoxUI extends JComboBox{

     public void updateUI() {
          setUI(new CustomComboBoxUI());
       }

       public void addPopupMenuListener(PopupMenuListener l) {
           CustomComboBoxUI ui = (CustomComboBoxUI)getUI();
          ui.addPopupMenuListener(l);
       }


    public class CustomComboBoxUI extends MetalComboBoxUI {
           protected JPopupMenu _popup;
            protected ComboPopup createPopup() {
                 BasicComboPopup popup = new BasicComboPopup(comboBox) {
                    public JScrollPane createScroller() {
                        JScrollPane j = new JScrollPane( list, ScrollPaneConstants.VERTICAL_SCROLLBAR_NEVER,
                              ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED);
                        return j;
                     }
                 };         
                 _popup = (JPopupMenu)popup;
                 return popup;
              }
           @Override 
           protected void installListeners() {
               super.installListeners();
           }

           public void addPopupMenuListener(PopupMenuListener l) {
              if (_popup != null)
                 _popup.addPopupMenuListener(l);
           }
        }
}

问题

如果您将运行此命令,您将看到垂直滚动条未到达(在JScrollPane中设置)并且某些元素未显示。我想增加Popup的高度,这样我就能看到所有元素。任何帮助

2 个答案:

答案 0 :(得分:2)

  

Swing中JComboBox下拉列表的高度

如果要在用户单击列表时设置要在JCombobox中显示的项目行数,可以使用JComboBox本身的此方法。

setMaximumRowCount(int count) 

答案 1 :(得分:0)

我已经覆盖了BasicComboPopup类并重写了getPopupHeightForRowCount(int maxRowCount)方法以包含水平滚动条的高度。

 public class OverrideComboPopup extends BasicComboPopup {

    private JScrollPane sPane;
    public KronosComboPopup(KronosComboBox combo) {
        super(combo);
        setBackground(GUIResources.POPUP_MENU_BACKGROUND);
    }

 public JScrollPane createScroller() {
        sPane = new JScrollPane( list, ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED,
                      ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED);
        return sPane;
     }

     //Overrides the getPopupHeightForRowCount to include the height of horizontal bar.
     protected int getPopupHeightForRowCount(int maxRowCount) {
        int currentElementCount = comboBox.getModel().getSize();
        int rowCount = Math.min( maxRowCount, currentElementCount );
        if (rowCount==0) return rowCount;
        int ht = super.getPopupHeightForRowCount(maxRowCount);
        double cWidth = comboBox.getSize().getWidth();
        double vWidth = list.getPreferredScrollableViewportSize().getWidth();
        if (vWidth>cWidth) {
           int barHt = sPane.getHorizontalScrollBar().getHeight();
           //Sets the default height of scroll bar
           if (barHt==0) barHt = 16;
           ht = ht + barHt;
        }
        return ht;
     }


    }

如果你随时都坚持这件事,请告诉我,请联系我chauhanvineesh@gmail.com