根据字体和字符串项调整JComboBox的宽度

时间:2015-09-15 19:27:01

标签: java swing size jcombobox

您好我想根据字体类型及其字符串项减少展开多个JComboBox的大小。 但我无法得到理想的结果......

我希望根据最大的String项适合所有JComoboBox(不再需要空间或不需要空间)。

theFont = new Font("Serif",Font.PLAIN, 11);

TheFont是Linux和Windows中常见的字体

抱歉我忘记说我在使用Netbeans了!然后我执行我的代码:initComponents();

    List<Component> lTabs = new ArrayList<>();
    JPanel jpTab = //Some JPanel;
    addComponents(jpTab, lTabs);
    for (int ii = 0; ii < lTabs.size(); ii++) {
      if (lTabs.get(ii) instanceof javax.swing.JComboBox) {
        javax.swing.JComboBox jcb = (javax.swing.JComboBox)lTabs.get(ii);
        int posMax = 0;
        int MaxSize = 0;
        String itemString = "";

        // find largest String
        for (int k = 0; k < jcb.getItemCount();k++) {
          itemString = "  "+((String)jcb.getItemAt(k)).trim(); //All String items have Two aditional spaces
          if (MaxSize < (fm.stringWidth(itemString))) { //
            MaxSize = fm.stringWidth(itemString);
            posMax = k;
          }
        }
        //            System.out.println("JComboBox  "+" Pos->:"+posMax+" Val->:"+jcb.getItemAt(posMax)+" Old->:"+jcb.getWidth()+" New->:"+MaxSize);
        jcb.setPreferredSize(new Dimension(MaxSize, jcb.getHeight()));
        jcb.setFont(theFont);
        jcb.setPrototypeDisplayValue("  "+jcb.getItemAt(posMax));
      }
    }




public void addComponents(Container c, List<Component> l) {
  Component ca[] = c.getComponents();
  l.addAll(Arrays.asList(ca));
  for (int i = 0; i < ca.length; i++) {
    Component component = ca[i];
    if (Container.class.isAssignableFrom(component.getClass())) {
        addComponents((Container) component, l);
    }
  }
}

如何安装某些JPanel中包含的所有JComboBox?

PD:我不想要这种方法:http://www.jroller.com/santhosh/entry/make_jcombobox_popup_wide_enough

编辑2 ¿可以计算JComboBox的宽度空项目(没有项目)吗?

1 个答案:

答案 0 :(得分:2)

  

我希望根据字体类型及其字符串项减少和扩展多个JComboBox的大小

这是默认行为。组合框将遍历所有项目以确定适当的大小。

你不必做任何特别的事。

jcb.setPrototypeDisplayValue("  "+jcb.getItemAt(posMax));

摆脱那句话。这仅用于使用特定字符串来固定宽度。使用此方法的好处是组合框不需要遍历列表中的所有项目,因此它可以更有效。

所以基本上你已经用你自己的循环替换了默认的迭代来确定首选大小。摆脱你的代码,只使用默认行为。