Was ist Codename One?

Die Plattform „Codename One“ dient der betriebsystemübergreifenden Entwicklung von Apps für Smartphones. Wichtiger Bestandteil ist eine Bibliothek für Benutzerschnittstellen. Codename One ist ein Nachfolger von LWUIT, welches wiederum Konzepte der Java-Swing-Bibliothek nutzt.

Die verschiedenen Bedienelemente wie Labels, Buttons oder Eingabefelder platziert man in einem Container. Die Positionierung wird nun nicht von den Container selbst übernommen, sondern von von einem assoziierten Objekt der Klasse LayoutManager. Zum Beispiel plaziert das Gridlayout die Elemente in einer Tabelle. Dies ist oft sehr nützlich, weil sich die Platzierung automatisch verschiedenen Displaygrößen anpasst.

Das Problem

In einer meiner Anwendungen gibt es ein solches Gitterlayout, und die eine Spalte enthält Buttons. Je nach dem, ob man das Handy in der linken oder rechten Hand nutzt, sind die Buttons besser Links oder Rechts zu erreichen. Ich möchte deshalb den Nutzer die Möglichkeit geben, die Positionierung der Elemente zu spiegeln.

Meine Lösung

In einem zweidimensionalen Array ist das vertauschen sehr einfach. Leider ist es in Codename One nicht ganz so einfach. Der Container speichert seine Elemente in einer linearen Struktur, der Layoutmanager setzt die Tabellenstruktur auf die lineare Struktur auf. Es gibt offenbar auch keine Operationen zum direkten Austausch von Elementen in der Container-API. Meine Lösung dazu ist die folgende:

grid = new Container();
grid.setLayout(new GridLayout(rows, 2));
...
private void swapGrid(){
        int cnt = grid.getComponentCount();
        for (int i=(cnt-1); i < 0; i-=2){
            Component cmp = grid.getComponentAt(i);
            grid.removeComponent(cmp);
            grid.addComponent(i-1, cmp);
        }
        grid.animateHierarchy(800);
}

Ein schönes Extra ist die animateHierachy-Methode. Sie bewegt alle Elemente simultan in ihre neue Position.

Schreibe einen Kommentar