便携式方式为JComboBox提供水平滚动条

时间:2010-10-20 16:39:10

标签: java swing

CoderanchSun Forum,我知道为JComboBox设置水平滚动条的技巧。

然而,他们建议的解决方案受限于Look n Feel specific。

正如您所看到的,如果用户使用的是具有GTK +外观的Linux机器,或者使用Nimbus的Windows机器,那么下面的密钥代码片段将无法正常工作。

我如何能够以便携方式使JComboBox能够拥有水平滚动条?

完整的源代码是AutoCompleteJComboBox.java

关键代码段如下:

package org.yccheok.jstock.gui;

public class AutoCompleteJComboBox extends JComboBox {

   @Override
    public void setUI(ComboBoxUI ui)
    {
        if (ui != null)
        {
            // Let's try our own customized UI.
            Class c = ui.getClass();
            final String myClass = "org.yccheok.jstock.gui.AutoCompleteJComboBox$My" + c.getSimpleName();

            try {
                ComboBoxUI myUI = (ComboBoxUI) Class.forName(myClass).newInstance();
                super.setUI(myUI);
                return;
            } catch (ClassNotFoundException ex) {
                log.error(null, ex);
            } catch (InstantiationException ex) {
                log.error(null, ex);
            } catch (IllegalAccessException ex) {
                log.error(null, ex);
            }
        }

        // Either null, or we fail to use our own customized UI.
        // Fall back to default.
        super.setUI(ui);
    }

    // This is a non-portable method to make combo box horizontal scroll bar.
    // Whenever there is a new look-n-feel, we need to manually provide the ComboBoxUI.
    // Any idea on how to make this portable?
    //
    protected static class MyWindowsComboBoxUI extends com.sun.java.swing.plaf.windows.WindowsComboBoxUI
    {
        @Override
        protected ComboPopup createPopup()
        {
            return new MyComboPopup(comboBox);
        }
    }

    protected static class MyMotifComboBoxUI extends com.sun.java.swing.plaf.motif.MotifComboBoxUI
    {
        @Override
        protected ComboPopup createPopup()
        {
            return new MyComboPopup(comboBox);
        }
    }

    protected static class MyMetalComboBoxUI extends javax.swing.plaf.metal.MetalComboBoxUI
    {
        @Override
        protected ComboPopup createPopup()
        {
            return new MyComboPopup(comboBox);
        }
    }

    private static class MyComboPopup extends BasicComboPopup
    {
        public MyComboPopup(JComboBox combo)
        {
            super(combo);
        }

        @Override
        public JScrollPane createScroller()
        {
            return new JScrollPane(list,JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,
                    JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
        }
    }
}

1 个答案:

答案 0 :(得分:0)

我通过以下论坛解决了我的问题 Oracle Java Swing Forum