2016-11-22 2 views
2

Hier ist mein Problem: Ich habe ein Formular, das mehrere Registerkarten enthält. In der ersten habe ich eine Tabelle, die Informationen enthält. Mein Problem ist, dass, wenn ich ein neues Formular öffne (sagen wir, ein Dialog) und es dann schließt, mein Tabellenlayout unerwartet geändert wird. Das gleiche Verhalten wird beobachtet, wenn ich ein neues Formular öffne, dann benutze die Zurück-Schaltfläche.Codename eins - Warum wird mein TableLayout geändert, wenn ich von einem anderen Formular zurückgehe?

Ich habe ein minimales Beispiel hier unten, mit nur einem Register eingerichtet, das das Problem veranschaulicht:

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() { 
    } 

} 

Insbesondere kann man sehen, dass isGrowHorizontally() wahr ist vor dem Öffnen des Dialogs und danach falsch (daher werden die Etiketten geschrumpft).

Die visuelle Folge im folgende Bild gesehen werden kann (wird links vor einem Dialog (gewünschtes Verhalten) zu öffnen, rechts ist es nach dem Schließen):

example

So, weiß jemand, warum es tut Das? Und wenn ja, weiß jemand, wie man das Problem löst (oder was ich furchtbar falsch mache :-))?

Wenn nicht, weiß jemand, wie man die Zellen über die gesamte Breite des Bildschirms erstrecken und es so halten kann, selbst nachdem der Dialog geschlossen ist?

Vielen Dank im Voraus!

Deneb

+0

Eine sehr gut geschriebene erste Frage. Willkommen bei SO! – MordechayS

+0

Danke! Ich hoffe nur, dass jemand eine Lösung hat, weil mir persönlich die Ideen ausgehen: -/ – Deneb

Antwort

1

Das Problem ist, dass Sie auf Table verließen die gleiche Layout Instanz zu halten, aber das ist nicht der Fall. Die Instanz des Layouts wird ersetzt, sobald die Tabelle aktualisiert wird.

der „richtige“ Weg, dies zu tun, ist eine Einschränkung für die Tabellenzelle zu definieren, wie:

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 ist ein Spezialfall, dass die Säule über die volle Breite verleiht. In diesem Fall habe ich es auf alle Zellen angewendet, aber Sie sollten es wahrscheinlich nur einer Spalte geben, also sollten Sie diese Aussage konditionieren.

+0

Super, es funktioniert, danke :-) – Deneb

Verwandte Themen