Java 代码名一-为什么从另一个表单返回时会修改我的表格布局?

Java 代码名一-为什么从另一个表单返回时会修改我的表格布局?,java,codenameone,Java,Codenameone,我的问题是:我有一个表单,它包含几个选项卡。在第一个表中,我有一个包含信息的表。我的问题是,当我打开一个新表单(比如,一个对话框)然后关闭它时,我的表布局会意外地被修改。如果我打开一个新表单,然后使用“后退”按钮,就会观察到相同的行为 我在下面设置了一个最小的示例,只有一个选项卡,说明了问题: public class spmonMobileApp { private Form current; private Resources theme; private Ta

我的问题是:我有一个表单,它包含几个选项卡。在第一个表中,我有一个包含信息的表。我的问题是,当我打开一个新表单(比如,一个对话框)然后关闭它时,我的表布局会意外地被修改。如果我打开一个新表单,然后使用“后退”按钮,就会观察到相同的行为

我在下面设置了一个最小的示例,只有一个选项卡,说明了问题:

public class spmonMobileApp {
    private Form current;
    private Resources theme;   
    private Table table;

    public void init(Object context) {
        theme = UIManager.initFirstTheme("/theme");

        // Enable Toolbar on all Forms by default
        Toolbar.setGlobalToolbar(true);        
    }

    public void start() {           
        Form tabsForm = new Form("", new LayeredLayout());
        Tabs tabs = new Tabs(Component.BOTTOM);
        Container mainContainer = new Container(new BoxLayout(BoxLayout.Y_AXIS));
        TableModel tableModel = new DefaultTableModel(new String[] {""}, new Object[][] {{"MCR"}, {"SSR"}, {"HQ"}}, false);

        table = new Table(tableModel) {
            @Override
            protected Component createCell(Object value, int row, int column, boolean editable) { // (1)
                Component p = new Label((String)value);

                p.getAllStyles().setBgColor(0xFFFF00);
                p.getAllStyles().setBgTransparency(255);
                p.getAllStyles().setAlignment(CENTER);

                p.addPointerPressedListener(new ActionListener(){
                    @Override
                    public void actionPerformed(ActionEvent evt) {
                        //createDataForm((String)value).show();
                        System.out.println(((TableLayout)table.getLayout()).isGrowHorizontally());
                        Dialog.show("Example", "Just a test", "OK", "Cancel");
                        System.out.println(((TableLayout)table.getLayout()).isGrowHorizontally());
                    }
                }); 

                return p;
            }
        };

        ((TableLayout)table.getLayout()).setGrowHorizontally(true);
        mainContainer.add(table);

        tabs.addTab("Welcome", mainContainer);
        tabsForm.add(tabs);

        tabsForm.show();
    }

    public void stop() {
        current = Display.getInstance().getCurrent();
        if(current instanceof Dialog) {
            ((Dialog)current).dispose();
            current = Display.getInstance().getCurrent();
        }
    }

    public void destroy() {
    }

}
特别是,可以看到isgrowshorizontal()在打开对话框之前为true,之后为false(因此标签会收缩)

在下图中可以看到视觉效果(左侧是在打开对话框之前(所需行为),右侧是在关闭对话框之后):

那么,有人知道为什么会这样吗?如果是这样,有人知道如何解决这个问题吗(或者我做错了什么:-)

如果没有,是否有人知道如何使单元格跨越屏幕的整个宽度,并在对话框关闭后保持这种状态

提前谢谢


Deneb

问题在于您依赖于
保持相同的布局实例,但事实并非如此。每当刷新表时,都会替换布局实例

“正确”的方法是为表格单元格定义一个约束,例如:

table = new Table(tableModel) {
   protected TableLayout.Constraint createCellConstraint(Object value, int row, int column) {
       TableLayout.Constraint c = super.createCellConstraint(value, row, column);
       c.setWidthPercentage(-2);
       return c;
   }


  ... rest of your code
};

-2是一种特殊情况,使列具有全宽。在本例中,我将其应用于所有单元格,但您可能应该只将其应用于一列,因此您应该调整该语句。

第一个问题写得非常好。欢迎来到SO!谢谢我只是希望有人能找到解决办法,因为我个人的想法已经没有了:-/