代码之家  ›  专栏  ›  技术社区  ›  Eric

添加字段直到屏幕已满

  •  0
  • Eric  · 技术社区  · 14 年前

    为了回答这个问题,让我们假设我想要一排按钮。我想把尽可能多的按钮放在那一行,我可以在屏幕上,但没有更多。换句话说,只要预期按钮不会被切断或文本被缩短,就添加它。

    看来我应该可以做一些类似的事情:

    HorizontalFieldManager hfm = new HorizontalFieldManager();
    
    int remainingWidth = Display.getWidth();
    
    int i =0;
    while(true) {
        ButtonField bf = new ButtonField("B " + i);
        remainingWidth -= bf.getWidth();
        if(remainingWidth<0)
            break;
        hfm.add(bf);
        i++;
    }
    
    add(hfm);
    

    但这不起作用。bf.getWidth()始终为0。我怀疑这是因为在查询宽度时按钮尚未布置好。

    所以,也许我可以确定按钮的大小总是一样的。但由于以下几个原因,这种方法行不通:

    1. 不同的BB平台有不同的按钮外观,适合曲线上按钮的文本不会适合风暴上的按钮。
    2. 第三方主题可能会改变按钮的外观,所以我甚至不能指望按钮在特定平台上具有特定的大小。

    在添加按钮之前,我是否无法实际检查剩余空间?它感觉像是一个相当有用的功能;我是不是错过了什么?

    3 回复  |  直到 14 年前
        1
  •  1
  •   Michael B.    14 年前

    在将组件添加到管理器之前,请尝试绘制该管理器。

    如果按钮有填充物,您可能也应该添加填充物。

    public class Main extends UiApplication{
    
        public static void main(String[] args) {
            Main main = new Main();
            main.enterEventDispatcher();
        }
    
        public Main() {
            Screen main = new Screen();
            this.pushScreen(main);
            main.init();
        }
    }
    
    public class Screen extends MainScreen    {
    HorizontalFieldManager hfm;
    public Screen() {
        hfm = new HorizontalFieldManager();
        this.add(hfm);
    }
    
    public void init() {
        int remainingWidth = Display.getWidth();
        int i = 0;
        while(true) {
            ButtonField bf = new ButtonField("B " + i);
            hfm.add(bf);
            remainingWidth -= bf.getWidth();
            System.out.println(remainingWidth);
            if(remainingWidth <= 0) {
                hfm.delete(bf);
                break;
            }
            i++;
        }
    }
    
        2
  •  1
  •   Skrud    14 年前

    你说得对 getWidth() 返回字段的宽度 之后 它已经被布置好了(这就是为什么它是0),但是 getPreferredWidth()

    remainingWidth 如果按钮的首选宽度为36像素,剩余宽度为20像素,则在没有足够空间显示的位置绘制按钮。

    试着这样做:

    HorizontalFieldManager hfm = new HorizontalFieldManager();
    int remainingWidth = Display.getWidth();
    for (int i; true; i++ ) {
      ButtonField bf = new ButtonField("B " + i);
      int preferredWidth = bf.getPreferredWidth();
      if ( remainingWidth < preferredWidth )
        break;
      remainingWidth -= preferredWidth;
      hfm.add(bf);
    }
    add(hfm);
    
        3
  •  0
  •   Alex    14 年前

    尝试创建自己的HorizontalFiledManager(扩展管理器)并覆盖

    
     protected void sublayout( int maxWidth, int maxHeight ){
    
    

    setExtent(maxWidth,maxHeight); }

    在布置子对象时,计算其宽度,并始终检查计数的宽度+下一个子对象的宽度是否大于maxWidth,然后不要布置并断开for循环。 希望这对你有帮助。