Java 为JComboBox提供水平滚动条的便携式方法
从和中,我了解了为JComboBox提供水平滚动条的技术 然而,他们所建议的解决方案看起来和感觉上都是特定的 如您所见,如果用户使用的是带有GTK+look n feel的Linux机器,或者是带有Nimbus look n feel的Windows机器,那么下面的关键代码片段将无法正常工作 我如何能有一个便携式的方式,使JComboBox能够有一个水平滚动条 完整的源代码是 关键代码片段如下所示:Java 为JComboBox提供水平滚动条的便携式方法,java,swing,Java,Swing,从和中,我了解了为JComboBox提供水平滚动条的技术 然而,他们所建议的解决方案看起来和感觉上都是特定的 如您所见,如果用户使用的是带有GTK+look n feel的Linux机器,或者是带有Nimbus look n feel的Windows机器,那么下面的关键代码片段将无法正常工作 我如何能有一个便携式的方式,使JComboBox能够有一个水平滚动条 完整的源代码是 关键代码片段如下所示: package org.yccheok.jstock.gui; public class Au
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);
}
}
}
我通过以下论坛解决了我的问题