Im Zuge unseres JVx Vortrages, bei der Java User Group München, wurde berichtet, daß im Download der FirstApp die Konfiguration "config.xml" nicht inkludiert ist. Nach kurzer Analyse wurde festgestellt, daß auch die Server Konfiguration nicht enthalten ist.
Das Fehlen der Dateien ist aufgrund der Schritt für Schritt Anleitung kein großes Problem und kann rasch behoben werden!
Die Ursache für das Problem war eine fehlerhafte build Konfiguration. Diese wurde umgehend behoben und die aktualisierte FirstApp steht bereits zum Download bereit. Im Zuge des Updates wurde auch gleich die aktuelle Release 0.8 von JVx inkludiert.
JVx is written in Java and you can create Desktop Applications (Swing or QTJambi), Rich Internet Applications (Applet or Webstart or Ajax/HTML) and Mobile Android Applications. You develop an Application once and start it with different technologies - Single Sourcing!
But what about the iPhone?
Native iPhone apps are written in Obective-C, C or other supported programming languages. Java is not supported - at the moment.
We are currently developing iOS AddOns that makes it possible to create native iOS apps which uses JVx business logic. The AddOns includes object serialization, connection handling and simple model implementations.
Develop your JVx Business Application, use the same source code for your Desktop and/or Web Application and use the same business logic for your Mobile Device(s).
One framework for different plattforms and different technologies.
And everything is Open Source!
JVx defines a technology independent User Interface, with Interfaces. Each technology has to implement this interfaces for its components and controls, to be compatible with JVx. We have implemented all this interfaces for Swing.
In addition we have created some swing components with special features for business applications. This components are simple extensions to existing swing components and are supported from any Look and Feel. They can be used in any swing application with or without the whole JVx framework.
We will show here some of this components:
- DesktopPane with tab or frame mode
Switch between tab and frame view, Closable tabs (works with java 1.5 and is LaF independent), Drag and Drop Tabs, Tab navigation with keyboard, Modal frames, Background image.
 Frame mode
|
|
 Tab mode
|
|
 Desktop Background |
|
- ComboBoxes with user-defined popup components
A base implementation of a ComboBox called ComboBase. With this combo you can build your own ComboBox for e.g. input first and last name in separate fields. We implemented a date chooser and a table selector (header is:
 Date Combo
|
|
 Table Combo
|
|
- Table with load-on-demand model and ready-to-use cell editors/renderers
A table which uses an IDataBook implementation as model (e.g. MemDataBook) and shows cell editors and renderers dependent of the cell data types, e.g. a table with image renderer and multiple choice editor/renderer
 Table with renderer and editor
|
|
Following editors/renderer are available: Text, Number (only numbers are allowed), Date, Multiple Choice, Image |
|
- Button
A standard button and a toggle button with support for mouse-over borders.
- Icon
A special icon which supports image stretching and alignment.
Our implementation includes not only Swing components. It also contains some useful layouts:
- FormLayout
Anchor based layouting. Supports margins, stretching, gaps, ... It is designed for simple and complex forms.
- BorderLayout
Supports margins.
- SequenceLayout
Supports component stretching, component orientation, intelligent wrapping.
If you are interested in JVx, leave a comment or join our community.
You are welcome!
Der Begriff Single Sourcing wird nicht nur von JVx geprägt! Auch die Rich Ajax Platform (RAP) aus dem Eclipse Ökosystem stellt einen Lösungsansatz bereit. Der Grundgedanke ist der selbe: Write once - "run everywhere". Auf den Punkt gebracht: Eine Anwendung läuft sowohl als Desktop Applikation als auch im Browser als HTML/Ajax Applikation - ohne eine Veränderung am Source Code durchführen zu müssen.
Keine Frage. Mit dem Eclipse Ökosystem erhält man ein mächtiges Werkzeug mit dem nahezu jeder Wunsch in Software umgesetzt werden kann. Der Preis dafür darf jedoch nicht außer acht gelassen werden. Denn die Einarbeitung in die Technologie und die Menge an APIs ist enorm und mit nicht zu unterschätzendem Aufwand verbunden. Weiters existieren sehr starke Abhängigkeiten zwischen den APIs und den eingesetzten Bibliotheken. Die Wartung von Anwendungen und Projekten wird durch die Komplexität nicht gerade vereinfacht. Im Grunde bekommt man sehr viele Möglichkeiten geschenkt, muss aber die Folgen der Komplexität sowohl während der Entwicklung als auch bei der Wartung in Kauf nehmen.
Wenn es um Vereinfachung und Überschaubarkeit geht, dann führt an JVx kein Weg vorbei! Das Framework ist einerseits leicht zu erlernen und andererseits verkürzt es die Entwicklung von Datenbank lastigen Anwendungen. Außerdem verzichtet JVx auf Abhängigkeiten und vereinfacht dadurch sowohl Entwicklung als auch Wartung. Zusätzlich zu Single Sourcing erhält man mit JVx ein Full-Stack Application Framework unter anderem mit RPC und Session Management. Und mit den AddOns für Android und .NET stehen die Türen für mobile Geräte weit offen.
Seit wenigen Augenblicken steht die erste Beta Release von unserer QT Jambi UI Implementierung zum Download bereit. Dieses Release enthält sowohl Erweiterungen zu den Standard Widgets als auch die Implementierung von javax.rad.ui.
Zu den Erweiterungen zählen unter anderem:
- Border Layout
Das gewohnte Border Layout mit der Ausrichtung NORD, SÜD, WEST, OST, ZENTRIERT
- Form Layout
Das Anker orientierte Layout ist eine Portierung aus dem Swing UI und ermöglicht die Erstellung von komplexen Layouts ohne Schachtelung.
- Sequence Layout
Im Gegensatz zu einem Flow Layout ermöglicht dieses Layout die Komponenten zu stretchen, die vertikale bzw. horizontale Anordnung der Komponenten sowie die Ausrichtung der Komponenten zu beeinflussen.
- Zell Editoren
Die üblichen Editoren für Datum, Passwort, Zahlen und Text.
- Anpassbare Combos
Im Normalfall ist es schwierig eine Combo Box mit einem speziellen Layout und/oder benutzerdefinierten Komponenten zu verändern. Die Bibliothek enthält bereits eine Basis Combo Box, mit der eine Combo Box beliebig gestaltet werden kann.
- Desktop und (modale) Internal Frames
Die Desktop Implementierung ermöglicht Frames die wahlweise modal angezeigt werden. Weiters wurde das Event handling von Java im Bezug auf Internal Frames umgesetzt.
Die Widgets sind unabhängig von JVx und können auch in Applikationen, die nicht auf JVx aufsetzen, integriert werden. Bei der Umsetzung wurde auf höchste Kompatibilität geachtet.
Die Showcase Anwendung steht zum Testen bereit.
Die Implementierung ist über unsere Download Seite verfügbar!
Nachdem die JVx .NET AddOns bereits wunderbar mit Silverlight harmonieren, haben wir einen ersten Versuch mit dem Windows Phone SDK gewagt. In erster Linie wollten wir prüfen ob die AddOns auch mit Windows Phone funktionieren. In der Spezifikation waren keine Stolpersteine zu fnden, daher sollte eine Integration problemlos möglich sein.
In der Praxis sieht die Sache natürlich etwas anders aus. Das SDK enthält (noch) nicht alle Klassen die in den AddOns verwendet wurden. Daher musste für unseren Test auf etwas Komfort verzichtet werden. Nach der Anpassung der AddOns war die Integration jedoch ohne Probleme möglich.
Wir setzten uns ein sehr bescheidenes Ziel für die Entwicklung der ersten App:
Darstellung einer Liste mit den Ländern aus unserer Showcase Anwendung.
Unsere App war überraschend schnell umgesetzt. Hierbei ist jedoch anzumerken, daß das Windows Phone SDK im Moment nicht mit der Konkurrenz mithalten kann. Dazu müssen noch wesentliche Details verbessert werden.
Unsere App, gestartet mit dem Windows Phone Emulator:
 Windows Phone App
|
Der Source Code für den Zugriff auf die Daten ist in üblicher Manier zu schreiben:
private JVxDataAdapter dataSource
;
private MasterConnection Connection
;
public MainPage()
{
InitializeComponent();
SupportedOrientations = SupportedPageOrientation.Portrait
| SupportedPageOrientation.Landscape;
// init connection
HttpConnection conn = new HttpConnection(new UniversalSerializer(),
"http://demo.sibvisions.org/showcase/services/Server");
MasterConnection master = new MasterConnection(conn);
master.ApplicationName = "showcase";
master.LifeCycleName = "com.sibvisions.apps.showcase.frames.Contacts";
master.UserName = "admin";
master.Password = "admin";
// init data adapter
dataSource = new JVxDataAdapter(master);
dataSource.OpenComplete += new OpenCompleteEventHandler(OpenComplete);
// open connection
dataSource.Open();
}
void OpenComplete(OpenCloseCompleteEventArgs pEvent)
{
// fetch data
CommunicationCallback callback = new CommunicationCallback(
new AsyncCallback(EndFetch));
dataSource.Connection.call("countries", "fetch", callback,
new object[] {null, new SortDefinition(new String[] {"COUNTRY"}), 0, -1});
}
void EndFetch(IAsyncResult pResult)
{
CommunicationCallback requestCallback = (CommunicationCallback)pResult.AsyncState;
ArrayList result = (ArrayList)requestCallback.CallResult[0];
// fill list
Deployment.Current.Dispatcher.BeginInvoke(() =>
{
foreach (object[] item in result)
{
if (item != null)
{
ListBox.Items.Add(item[1]);
}
}
});
}
Das XAML ist im Vergleich zum Datenzugriff weit komplexer:
<phoneNavigation:PhoneApplicationPage
x:Class="WindowsPhoneApp.MainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:phoneNavigation="clr-namespace:Microsoft.Phone.Controls;
assembly=Microsoft.Phone.Controls.Navigation"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d" d:DesignWidth="480" d:DesignHeight="800"
FontFamily="{StaticResource PhoneFontFamilyNormal}"
FontSize="{StaticResource PhoneFontSizeNormal}"
Foreground="{StaticResource PhoneForegroundBrush}">
<Grid x:Name="LayoutRoot" Background="{StaticResource PhoneBackgroundBrush}">
<Grid.RowDefinitions>
<RowDefinition Height="162"/>
<RowDefinition Height="44"/>
<RowDefinition Height="514*"/>
<RowDefinition Height="80"/>
</Grid.RowDefinitions>
<Border BorderBrush="Silver" BorderThickness="5" Name="border0"
CornerRadius="20" Background="#18A2E7" Margin="12,0,12,20">
<Grid x:Name="TitleGrid" Height="147" >
<TextBlock Text="Windows Phone App" Foreground="Black"
x:Name="textBlockPageTitle"
Style="{StaticResource PhoneTextPageTitle1Style}"
Margin="7,6,12,100" />
<TextBlock Text="JVx showcase" Foreground="Black"
x:Name="textBlockAppTitle"
Style="{StaticResource PhoneTextPageTitle2Style}"
Margin="-3,26,-3,16" TextAlignment="Center" />
</Grid>
</Border>
<TextBlock Text="Countries" x:Name="textBlockListTitle" FontSize="30"
HorizontalAlignment="Right" Width="456" Margin="0,148,12,6"
VerticalAlignment="Stretch" Padding="0,5,0,0" Grid.RowSpan="2" />
<Border BorderBrush="Silver" BorderThickness="5" Name="border1"
Grid.Row="1" CornerRadius="20" Margin="12,35,12,0" Grid.RowSpan="2">
<ListBox Name="ListBox" HorizontalAlignment="Left"
VerticalAlignment="Top" Width="480" Margin="5,5,5,5" />
</Border>
<Image Grid.Row="3" Height="74" Margin="0,6,0,0" Name="image1"
Stretch="Uniform" VerticalAlignment="Top"
Source="/WindowsPhoneApp;component/Images/sib_visions.png"/>
</Grid>
</phoneNavigation:PhoneApplicationPage>
Seit wenigen Minuten steht die 2. Beta Version von JVx 0.8 zum Download bereit. Die Änderungsliste ist diesmal etwas kürzer ausgefallen, doch unter der Haube wurde kräftig geschraubt.
Diese Version enthält vor allem im Hinblick auf das kommende WebUI einiges an Erweiterungen. Doch nähere Details dazu in einem der kommenden Posts
Was kann man von der Beta 2 erwarten?
- Erhöhte Sicherheit
Die Session steuert ab sofort den Zugriff auf Lifecycle Objekte und delegiert dies an den Security Managers. Sollten spezielle Zugrifssbeschränkungen existieren, wird der Zugriff nicht eingeschränkt.
Weiters ist die Passwort Verschlüsselung nun konfigurierbar, wahlweise MD5, SHA 512 oder eine Standard Java Security konforme Implementierung.
- Neue Utility Klassen (com.sibvisions.util)
Siehe Javadoc
- Performance Optimierung
Durch die Vermeidung von Instanz Erzeugung beim Zugriff auf die Datenbank und bei der Behandlung der Metadaten wird einerseits Speicher und andererseits Zeit eingespart. Abhängig von der Anzahl der Datensätze ist der Unterschied deutlich merkbar.
- Bugfixing
Datenbanzugriff mit HyperSQL und Oracle, Bildbibliothek laden aus unterschiedlichen Threads, Serialisierung, Layouting, XML Security Manager uvm.
Die Release 0.8 von JVx wird zusammen mit der WebUI und QT Implementierung im Laufe des 3. Quartals 2010 verfügbar sein. Der Showcase unserer WebUI Implementierung wird bereits in den nächsten Wochen online sein.
Seit heute ist unsere Packung! als mobile App, offiziell im Android Market erhältlich. Natürlich kostenlos!
Der Link für den Market: market://search?q=pname:com.sibvisions.apps.packung
Die App wurde ursprünglich entwickelt um zu zeigen, daß JVx auch unter Android ohne Probleme eingesetzt werden kann. Und das ohne Qualitätsverlust. Die App wurde zu 100% mit den JVx AddOns für Android und JVx selbst erstellt. Es kommen die selben Sourcen wie auch für die RIA zum Einsatz.
Doch mittlerweile ist das Projekt aus den Kinderschuhen entwachsen und zählt zu den Schmuckstücken in unserer Sammlung.
Was ermöglicht die App im Unterschied zur RIA?
Die App ist kein Ersatz für den großen Bruder, aber ein treuer Wegbegleiter. Mit der App ist es möglich, einfach und unkompliziert, von unterwegs seine Tipps abzugeben, mit den Spielergebnissen zu vergleichen und den Highscore einzusehen.
Folgende Screenshots zeigen die Funktionen im Detail:
 Login |
|
Die Anmeldung
Mit dem vorhandenen Benutzernamen und Passwort wird die Anmeldung durchgeführt!
Ein neuer Benutzer muss zuerst in der Rich Internet Application registriert werden bevor die mobile Anwendung genutzt werden kann. Durch die Aktivierung der automatischen Anmeldung entfällt die Eingabe von Benutzernamen und Passwort, bei erneutem Start der App bzw. wenn die Verbindung aufgrund eines Kommunikationsfehlers neu geöffnet werden muss.
Über das Menü kann der Server gewechselt werden und die App lässt sich beenden.
|
|
 Choose Server |
|
Die Server Auswahl
Es kann zwischen den zur Verfügung stehenden Systemen gewählt werden. Der Tournament Server ist das Live System für die WM 2010.
Der Demo Server ist ein System mit dem die Funktionen der RIA und das Zusammenspiel mit der mobilen App, getestet werden kann.
Der Development Server ermöglicht das Debuggen der Applikation und sollte nur von Software Entwicklern eingesetzt werden, die den Source Code der Anwendung zur Verfügung haben.
|
|
 Categories |
|
Die Kategorie Auswahl
Das Hauptmenü der App enthält die möglichen Optionen:
- My Bets
Unterstützt beim Abgeben der Tipps.
- History
Vergleicht die Tipps mit den Ergebnissen und zeigt die Punkte pro Tipp.
- Statistics
Aktueller Highscore - Weltweit bzw. der privaten Tippgruppen.
|
|
 MyBets |
|
Tippen
Pro Spieltag stehen die möglichen Spiele zur Verfügung. Das Wunschergebnis kann durch die Selektion des jeweiligen Spieles, eingegeben werden.
|
|
 Place Bet |
|
Den Tipp eingeben
Den gewünschten Endstand eingeben und bestätigen. Solange die erlaubte Deadline nicht überschritten ist, kann das Ergebnis jederzeit korrigiert werden.
|
|
 History |
|
Die Historie
In der historischen Ansicht wird das Endergebnis (rot) mit dem Tipp verglichen. Zusätzlich werden die Punkte pro Spiel angeführt.
|
|
 Statistics |
|
Highscore
Der Highscore zeigt die aktuellen Platzierungen inklusive des Punktestandes. Sollten private Tippgruppen verwendet werden, sind auch diese sichtbar.
Der eigene Benutzername wird grau hinterlegt um die Übersicht zu bewahren.
|
|
 User Info |
|
Die Benutzer Information
Der Benutzername sowie der Anmelde Zeitpunkt werden angezeigt. Mit dem Menü ist der Wechsel zu den Kategorien, die Abmeldung und die Beendigung der App möglich.
|
|
Am gestrigen JUGAT Event haben wir unsere Web Implementierung von JVx UI vorgestellt.
Was genau ist die Web Implementierung von JVx UI?
Dabei handelt es sich um eine HTML/Ajax Implementierung des Plattform unabhänigen User Interfaces das von JVx vorgegeben wird. Dadurch ist es nun möglich, eine JVx Applikation als klassische Web Anwendung zu starten. Und der entscheidende Vorteil dabei ist, daß die Applikation nicht geändert oder neu codiert werden muss. Eine Applikation die bisher als Swing Applet verwendet wurde, kann nun auch ohne Anpassung als HTML Client betrieben werden!
Und wie kann so eine Applikation im Web aussehen?
Auf den ersten Blick ist die Web Anwendung nicht von einer Swing Anwendung/Applet Anwendung zu unterscheiden. Und auch beim zweiten Blick sollte genau hingesehen werden. Doch genug der Worte - mit Screenshots sollte der WOW Effekt nun eintreten.
WebUI login |
|
Die Anmeldung
Im Vergleich zur Applet Anwendung ist der Unterschied kaum merkbar. |
|
Die Konkakte verwalten
Die gewohnten Features der Swing Anwendung stehen natürlich auch in der Web Implementierung zur Verfügung, wie z.B.: Master/Detail, Automatische Zellen Editoren, Bildanzeige usw. |
|
 WebUI contacts |
|
 WebUI contacts firebug |
|
Der Beweis
Mit Firebug treten wir den Beweis an, daß es sich bei der Anwendung tatsächlich um eine HTML/Ajax Anwendung handelt. |
|
Für die Umsetzung der JVx WebUI wurde die ext GWT Bibliothek eingesetzt. Diese bietet gute Komponenten auf denen wir aufsetzen konnten. Es wäre jedoch auch denkbar eine andere Bibliothek wie z.B.: qooxdoo zu integrieren.
Wir haben vor wenigen Wochen unseren Silverlight Showcase vorgestellt. Nun steht die Anwendung offiziell zur Verfügung.
Der Silverlight Showcase ist eine in C# entwickelte Anwendung die mit den JVx AddOns für .NET entwickelt wurde. Dabei wird die komplette Business Logik von der Java Implementierung wiederverwendet. Der Silverlight Client kommuniziert durch den UniversalSerializer direkt mit dem Java Applikationsserver.
Die Anwendung ist zusammen mit dem Java Showcase hier zu finden.
Die JVx AddOns für .NET unterliegen der Apache Lizenz 2.0 und der Source Code wird in den nächsten Wochen offiziell freigegeben.