【问题标题】:How can one resize the scrollelements of a JComboBox?如何调整 JComboBox 的滚动元素的大小?
【发布时间】:2016-05-29 02:42:18
【问题描述】:

我的程序中有几个 JComboBox。我想以更宽的方式更改滚动条和箭头按钮的大小。我需要它,因为我想在 Windows 平板电脑上使用该程序,而且它太小,手指无法使用。 有没有可能这样做?

JComboBox comboBox;
comboBox = new JComboBox(list_apple_device.toArray());
comboBox.setSelectedItem(null);
comboBox.setFont(schrift);
comboBox.setBounds(1568, 329, 306, 43);
comboBox.addItemListener(new ItemListener() {
    @Override
    public void itemStateChanged(ItemEvent e) {
        // TODO Auto-generated method stub
        textField.setText(""+e.getItem());
    }
});
getContentPane().add(comboBox);

这是我的代码。

【问题讨论】:

  • 旁注:这不是 JavaScript,Java 是类型安全的。您可以在getItem() 上调用toString(),而不是即时创建字符串。每次连接字符串时,都会填充字符串池。
  • 嗯,也许 JavaFX 会是使用 Windows 平板电脑的更好方法?因为在 JavaFX 中,您可以使用 CSS 设置元素样式:stackoverflow.com/questions/21379865/… ... 似乎如果组合框太小,可能会出现其他问题,JavaFX 可以更轻松地解决这些问题?

标签: java swing jscrollpane jcombobox custom-component


【解决方案1】:

您可以使用 UIManger 来控制滚动条的宽度:

UIManager.put("ScrollBar.width", new Integer(50));

您将在创建组合框之前执行该代码。

【讨论】:

  • 哇,好多了 ^^ - 真的很抱歉,现在我必须杀了你^_^ 没有什么私人的 =) (+1)
  • 很有趣,但这不会改变程序中任何滚动条的宽度吗?或者您可以在创建组合框之前更改它,并在创建组合框后放回以前的值以保留默认滚动条宽度?
  • @TT。 won't that change the width of any scrollbar in the program? - 这就是这种情况下的要求。 ...and put the previous value back after creating the comboboxes - 我对这样的问题的标准回答是,试试吧!它是一行代码,您可以添加到任何程序中。我用这个例子试了一下:stackoverflow.com/questions/4982260/binding-comboboxes-in-swing/… 并且能够创建两个不同宽度的组合框。我没有尝试使用 JList 或 JTable 等。
  • @TT。我也试过了 - 你可以最好的方式首先从 UIManager 获取值:Object originalValue = UIManager.get("ScrollBar.width"); 然后将值保留为原始值!
【解决方案2】:

这不是那么容易,但有一个解决方案,你必须继承 jcombobox...

您必须继承JComboBox 才能访问ComboBoxUI。为此,您在对象实例化期间设置自己的自定义 ComboBoxUI(我们在所有构造函数中进行更改,请参阅 CustomComboBox 中的 init()

需要ComboBoxUI 才能访问ComboboxPopup。我们将默认的ComboboxPopup 替换为自定义的ComboboxPopup。您必须知道ComboboxPopup 负责创建下拉菜单,当您单击按钮时会弹出该下拉菜单。

然后我们终于可以从弹出窗口调整JScrollPane,我们抓住垂直的JScrollBar并改变它的外观(设置自定义宽度)。

public class CustomComboBox<T> extends JComboBox<T> {

    public CustomComboBox() {
        super();
        init();
    }

    public CustomComboBox(ComboBoxModel<T> aModel) {
        super(aModel);
        init();
    }

    public CustomComboBox(T[] items) {
        super(items);
        init();
    }

    public CustomComboBox(Vector<T> items) {
        super(items);
        init();
    }

    public void init(){
        CustomComboBoxUI ccbui = new CustomComboBoxUI();
        setUI(ccbui);
    }

}

这是自定义的ComboboxUI,授予您对ComboboxPopup 的访问权限(非常简单):

public class CustomComboBoxUI extends BasicComboBoxUI{

    protected ComboPopup createPopup() {
        return new CustomComboBoxPopup( comboBox );
    }

}

感谢自定义 ComboboxPopup 只需要重写基本构造函数并且只更改了一个方法(将滚动盘的大小设置为 40 像素):

public class CustomComboBoxPopup extends BasicComboPopup{

    public CustomComboBoxPopup(JComboBox combo) {
        super(combo);
    }


    @Override
    protected void configureScroller() {
        super.configureScroller();
        scroller.getVerticalScrollBar().setPreferredSize(new Dimension(40, 0));
    }       

}

要设置组合框的大小,您只需调整其大小

String[] data = new String[]{"a","b","c","d","e","f","g","h","i"};
CustomComboBox<String> comboBox = new CustomComboBox(data);
comboBox.setPreferredSize(new Dimension(50,50)); //set the size you wish

另请参阅 setting size of scrollersetting size of combobox 以获得更多帮助...

【讨论】:

  • 好像忘记了很多注释@Override我相信你可以自己添加它们^^
猜你喜欢
  • 2016-12-23
  • 1970-01-01
  • 1970-01-01
  • 2012-05-18
  • 2012-07-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-16
相关资源
最近更新 更多