2012-01-17 91 views
1

我想在OTN上使用线程 - Horizontal scrollbar for JComboBox across multiple look and feel的引用在JComboBox中添加水平滚动条,但它在我的情况下不起作用。在JComboBox中添加水平滚动条不起作用

如何正确添加水平滚动条到JComboBox

码 -

public class TestJComboBoxWithScrollBar { 

    TestJComboBoxWithScrollBar() { 
     JDialog jDialog = new JDialog(); 
     jDialog.setTitle("Test JComboBox With ScrollBar"); 
     JPanel jPanel_Sort = new JPanel(); 
     GridBagLayout gbl = new GridBagLayout(); 
     GridBagConstraints bagConstraints = new GridBagConstraints(); 
     jPanel_Sort.setLayout(gbl); 
     bagConstraints.gridwidth = 1; 
     bagConstraints.gridheight = 1; 
     bagConstraints.fill = GridBagConstraints.NONE; 
     bagConstraints.anchor = GridBagConstraints.WEST; 
     bagConstraints.weightx = 0; 
     bagConstraints.weighty = 0; 
     bagConstraints.insets = new Insets(5, 5, 5, 5); 
     bagConstraints.gridx = 0; 
     bagConstraints.gridy = 0; 
     SampleJComboBoxWithScrollBar cmbHeaders = new SampleJComboBoxWithScrollBar(); 
     cmbHeaders.addItem("aaaaaaaaaaaaa"); 
     cmbHeaders.addItem("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"); 
     cmbHeaders.setPreferredSize(new Dimension(190, 50)); 
     cmbHeaders.setMinimumSize(new Dimension(190, 50)); 
     cmbHeaders.setMaximumSize(new Dimension(190, 50)); 
     jPanel_Sort.add(cmbHeaders, bagConstraints); 
     JCheckBox chkOrderBy = new JCheckBox("Asc"); 
     bagConstraints.gridx = 1; 
     bagConstraints.gridy = 0; 
     jPanel_Sort.add(chkOrderBy, bagConstraints); 
     jPanel_Sort.setPreferredSize(new Dimension(220, 70)); 
     jPanel_Sort.setMinimumSize(new Dimension(220, 70)); 
     jPanel_Sort.setMaximumSize(new Dimension(220, 70)); 
     jDialog.add(jPanel_Sort, BorderLayout.CENTER); 
     jDialog.setPreferredSize(new Dimension(300, 100)); 
     jDialog.pack(); 
     jDialog.setResizable(false); 
     jDialog.setModal(true); 
     jDialog.setVisible(true); 
    } 

    public static void main(String[] argu) { 
     new TestJComboBoxWithScrollBar(); 
    } 

    class SampleJComboBoxWithScrollBar extends JComboBox { 

     SampleJComboBoxWithScrollBar() { 
      super(); 
      this.addPopupMenuListener(this.getPopupMenuListener()); 
      this.adjustScrollBar(); 
     } 

     private void adjustPopupWidth() { 
      if (getItemCount() == 0) { 
       return; 
      } 
      Object comp = getUI().getAccessibleChild(this, 0); 
      if (!(comp instanceof JPopupMenu)) { 
       return; 
      } 
      JPopupMenu popup = (JPopupMenu) comp; 
      JScrollPane scrollPane = (JScrollPane) popup.getComponent(0); 
      Object value = getItemAt(0); 
      Component rendererComp = getRenderer().getListCellRendererComponent(new JList(), value, 0, false, false); 
      if (rendererComp instanceof JXTable) { 
       scrollPane.setColumnHeaderView(((JTable) rendererComp).getTableHeader()); 
      } 
      Dimension prefSize = rendererComp.getPreferredSize(); 
      Dimension size = scrollPane.getPreferredSize(); 
      size.width = Math.max(size.width, prefSize.width); 
      scrollPane.setPreferredSize(size); 
      scrollPane.setMaximumSize(size); 
      scrollPane.revalidate(); 
     } 

     private void adjustScrollBar() { 
      if (getItemCount() == 0) { 
       return; 
      } 
      Object comp = getUI().getAccessibleChild(this, 0); 
      if (!(comp instanceof JPopupMenu)) { 
       return; 
      } 
      JPopupMenu popup = (JPopupMenu) comp; 
      JScrollPane scrollPane = (JScrollPane) popup.getComponent(0); 
      scrollPane.setHorizontalScrollBar(new JScrollBar(JScrollBar.HORIZONTAL)); 
      scrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED); 
     } 

     private PopupMenuListener getPopupMenuListener() { 

      return new PopupMenuListener() { 

       @Override 
       public void popupMenuWillBecomeVisible(PopupMenuEvent e) { 
        adjustPopupWidth(); 
       } 

       @Override 
       public void popupMenuWillBecomeInvisible(PopupMenuEvent e) { 
       } 

       @Override 
       public void popupMenuCanceled(PopupMenuEvent e) { 
       } 
      }; 

     } 
    } 
} 
+0

堪称为更好地帮助越早,张贴[SSCCE(HTTP:// sscce.org/)。 – 2012-01-17 12:16:26

回答

3

,如果你意思张贴代码@Kleopatra则无效adjustScrollBar()永远不会从PopupMenuListener

private PopupMenuListener getPopupMenuListener() { 

    return new PopupMenuListener() { 

     @Override 
     public void popupMenuWillBecomeVisible(PopupMenuEvent e) { 
      //adjustPopupWidth(); 
      adjustScrollBar(); 
     } 

     @Override 
     public void popupMenuWillBecomeInvisible(PopupMenuEvent e) { 
     } 

     @Override 
     public void popupMenuCanceled(PopupMenuEvent e) { 
     } 
    }; 
} 
+0

是的,它的工作。谢谢 – 2012-01-17 12:38:44