Follow Us on Twitter

Swing en applets weer hip?

Mei 2009 - Rond 1997, toen de populariteit van het WWW en Internet stormachtig begon te groeien, waren Applets voor korte tijd ook erg hot. Veel websites bevatten applets; diverse sites boden spelletjes en animaties aan gebaseerd op Java-applets. Vrij snel verdwenen applets van het web. Als platform voor fun-toepassingen nam Flash het snel over. Voor zakelijke toepassingen zijn applets nauwelijks aangeslagen: alleen Oracle Forms maakt indirect gebruik van applets om de frontend binnen een browser weer te geven, maar de ontwikkelaar programmeert dan niet direct in Java maar in PLSQL.

De meeste zakelijke applicaties die nu geschreven wordt, krijgen een userinterface gebaseerd op DHTML, HTML, Javascript en Ajax. Het beste wat elk van deze technieken kunnen bieden, is een ervaring die 'ouderwetse' windowsapplicaties benaderd. De client blijft 'dumb': voor een goede userinterface is een snelle internetverbinding en een krachtige server noodzakelijk.

Het alternatief is om een smart client te gebruiken. Alle logica voor de frontend wordt afgehandeld op de client en de client-software kan automatisch geïnstalleerd worden via een plugin. De gebruiker, of een beheerder, hoeft niet handmatig software te installeren of te configureren.

Sinds kort is Flex aan een opmars bezig, waarmee de smart client weer populair begint te worden. Voor Java bestaat echter al jaren een volwassen GUI-framework met vele uitbreidingen, tutorials en artikelen: Swing. In tegenstelling tot geruchten, bestaat Swing nog steeds en wordt er nog volop in en voor Swing ontwikkeld.

Swing, kort overzicht

Voor wie Swing niet kent, volgt hier een korte introductie. Swing is een framework om scherm gestuurde applicaties te ontwikkelen, die identiek op verschillende besturingssytemen en platformen werken. Swing is ondermeer geschikt om administratieve applicaties te maken.

Veel commerciële en open source applicaties die gebruik maken van het Swing framework zijn inmiddels ontwikkeld. Bekende en minder bekende applicaties zijn de Netbeans IDE, Sparc (een instant messeging applicatie), Jude (een UML diagrom tool), SoapUI (een webservice test tool) en Oracle SQL Developer.

Het Swing framework is bijzonder krachtig, maar nadeel is dat programmeren in Swing een behoorlijke leercurve had. Voor veel functioneel vrij eenvoudige zaken, is soms relatief veel programmacode nodig. In de loop der tijd zijn programma's en frameworks ontwikkeld van Swing applicaties makkelijker te maken zoals FormDesigner en Eclipse GUI Designer. Via genoemde tools kan snel een grafische applicatie opgezet worden. De code die deze tools genereren is echter niet standaard, zodat een ontwikkelaar gebonden is een het product. Om dit probleem op te lossen, is Sun begonnen aan een standaard, welke in het volgende hoofdstuk zal worden beschreven.

In 2006 is Sun begonnen aan een standaarduitbreiding voor Swing: JSR 296. Doel van de JSR 296 is het ontwikkelen van Swing applicaties makkelijker maken. Een probleem bij ontwikkelen van grafische applicaties in Swing, is de relatieve complexiteit, en de hoeveelheid code die nodig is. Verder levert JSR 296 standaard tools voor veel voorkomende problemen zoals opslaan van de positie van vensters, lokaal opslaan van gebruikersgegevens en asynchroon uitvoeren van taken. Hieronder staat een schematisch overzicht van wat de standaard biedt. We zullen in dit document de sectie ActionManager en functionaliteit met betrekking tot de TaskService toelichten.

JSR 296, JDesktop

In 2006 is Sun begonnen aan een standaarduitbreiding voor Swing: JSR 296. Doel van de JSR 296 is het ontwikkelen van Swing applicaties makkelijker maken. Een probleem bij ontwikkelen van grafische applicaties in Swing, is de relatieve complexiteit, en de hoeveelheid code die nodig is. Verder levert JSR 296 standaard tools voor veel voorkomende problemen zoals opslaan van de positie van vensters, lokaal opslaan van gebruikersgegevens en asynchroon uitvoeren van taken.

Hieronder staat een schematisch overzicht van wat de standaard biedt. We zullen in dit document de sectie ActionManager en functionaliteit met betrekking tot de TaskService toelichten.

 
JSR-296 architectuur

De standaard is niet afgerond, en enige tijd heeft ontwikkeling zelfs stilgelegen, nadat de verantwoordelijke voor de standaard (spec lead) an JSR 296 Sun verliet en een nieuwe spec lead hem moest vervangen, Alexander Potochkin . De standaard wordt nu gelukkig verder ontwikkeld.

Op grond van de draft standaard is al wel een bruikbare implementatie geschreven: JDesktop. JDesktop kan als los framework gedownload worden van: https://appframework.dev.java.net/. Het framework maakt standaard deel uit van Netbeans, die JDesktop gebruikt binnen de GUI Builder. De GUI Builder heette tot voor kort Matisse en via deze tool kunnen snel grafische applicaties ontwikkeld worden.

In dit artikel wordt Netbeans gebruikt om JDesktop te demonstreren. Binnen Netbeans kan via de New Project, Java Desktop Applicatie gekozen worden om Swing applicatie te schrijven:

Aangezien dit Whitebook geen Netbeans-tutorial is, zullen we de overige stappen, zoals kiezen van de titel van de appilcatie en hoeveelheid voorbeeldcode, overslaan.

Opstartcode

De standaardapplicatie die de wizard van Netbeans genereert, bevat een File en Help menu. Het startpunt van de applicatie is de class met een main method, hier de class WhitebookSwingApp. De class is een extensie van org.jdesktop.application.SingleFrameApplication. Veel boilerplate code die vroeger geschreven moest worden, is daardoor overbodig:

public class WhitebookSwingApp extends SingleFrameApplication { 
    @Override protected void startup() { 
        show(new WhitebookSwingView(this)); 
    } 
 
    @Override protected void configureWindow(java.awt.Window root) { 
    } 
    public static WhitebookSwingApp getApplication() { 
        return Application.getInstance(WhitebookSwingApp.class); 
    } 
    public static void main(String[] args) { 
        launch(WhitebookSwingApp.class, args); 
    } 
}

De JDesktop extensie zorgt er ondermeer voor dat alle teksten taalafhankelijk zijn via resourcebundles. De positie en grootte van vensters wordt opgeslagen. Als een gebruiker het applicatievenster vergroot of een andere positie geeft, wordt na herstarten van de applicatie de venstergrootte en positie hersteld.

De class WhitebookSwingApp is een extensie van org.jdesktop.application.FrameView en bevat alle UI gerelateerde code. Deze class bevat helaas nog behoorlijk wat (door Netbeans) gegenereerde code, maar deze code is nog redelijk leesbaar.

Acties uitvoeren

Via de visual editor kunnen de menuitems aangepast worden, de standaard Engelse teksten zijn voor deze demo naar Nederlands aangepast, en een Doe iets menu-item is toegevoegd:

Voor de Help, Over.. menu-item is een actie gedefinieerd. Bij oude Swing applicaties moest dan een actionListener gedefinieerd worden. Daardoor moest voor iedere menuactie minimaal een anonymous class gedefinieerd worden, wat redelijk wat programmeerwerk vereiste en vooral vrij veel regels code opleverde.

De JSR-296 werkt via Annotations, waardoor aanzienlijk minder code nodig is. Door in een class een method te annoteren met de @Action annotations wordt aangegeven dat deze method een actie voor een Swing component is:

 @Action 
    public void showAboutBox() { 
        if (aboutBox == null) { 
            JFrame mainFrame = WhitebookSwingApp.getApplication().getMainFrame(); 
            aboutBox = new WhitebookSwingAboutBox(mainFrame); 
            aboutBox.setLocationRelativeTo(mainFrame); 
        } 
        WhitebookSwingApp.getApplication().show(aboutBox); 
    } 

De method kan in de grafische editor gebonden worden aan een menu, of via één regel code:

aboutMenuItem.setAction(actionMap.get("showAboutBox"));

Wanneer de gebruiker binnen de applicatie nu het about menu item kiest, wordt het "About" venster weergegeven. Aangezien de frontend applicatie geheel op de client actief is, is geen roundtrip naar de server, geen processing en geen netwerkactiviteit nodig! Zelfs met Ajax, moet zowel de client als server aanzienlijk meer werk uitvoeren. Ajax geeft heeft alleen als voordeel dat geen browser-refresh nodig is, maar de server moet nog steeds aangeroepen worden. Bovendien kan de ontwikkelaar zijn applicatie direct testen, simpelweg door het component waarin hij werkt te starten. Deployment binnen een applicatieserver is niet nodig.

Asynchrone taken

Het JDesktop framework biedt ook standaardfunctionaliteit om asynchrone, langdurige acties uit te voeren. Wanneer binnen een actie, zoals in de voorgaande paragraaf een langdurige operatie wordt uitgevoerd, zoals uitvoeren van een zware databasequery, aanroepen van een trage webservice of inlezen van een groot bestand, zijn updates van de UI niet mogelijk. Voor de gebruiker lijkt het alsof de applicatie "hangt".

Een manier om dit probleem te omzeilen is de langdurige operatie op de achtergrond uit te voeren en een email bericht te sturen zodra de taak afgerond is. Wat meestal wenselijk is om een progress bar weer te geven en een bericht in de GUI-frontend na het afronden van de operatie. Om dit voor elkaar te krijgen was eerst binnen Swing aanzienlijk wat boilerplate code nodig - of een externe library.

Een van deze libraries, de Swingworker maakt standaard deel uit van Java 1.6. JDesktop biedt een extensie van de SwingWorker, Task. Hieronder staat een voorbeeld van een task, die niets anders doet dan 20 seconden wachten. Elke seconde wordt de voortgang via setProgress bijgewerkt.

private class DoeIetsTask extends org.jdesktop.application.Task {

    DoeIetsTask(org.jdesktop.application.Application app) {
        super(app);
    }

    @Override
    protected String doInBackground() {
        int secondsToWait = 20;
        for (int s = 0; s < secondsToWait; s++) {
            setProgress(100 * s / secondsToWait);
            try {
                Thread.sleep(1000);
            } catch (InterruptedException ex) {
                Logger.getLogger(WhitebookSwingView.class.getName()).log(Level.SEVERE, null, ex);
                return "Ben onderbroken";
            }
        }
        return "Klaar met wachten";
    }

    @Override
    protected void succeeded(String result) {
        statusMessageLabel.setText("DoeIetstaak is afgerond");
        JOptionPane.showMessageDialog(getFrame(), result);
    }
} 

De task kan via een aparte annotated method worden uitgevoerd:

    @Action 
    public Task doeIets() { 
        return new DoeIetsTask(getApplication()); 
    } 

Deze method kan uitgevoerd worden wanneer bij voorbeeld op een menuitem wordt gekozen of op een knop gedrukt wordt, zoals in de eerdere paragraaf is beschreven.

Door deze code wordt een progress bar weergeven terwijl de taak loopt. Na afloop wordt het resultaat, in dit geval de waarde "Klaar met wachten" weergegeven in een messagebox:

Uitbreidingen

Naast JDesktop bestaan er talloze extra frameworks en libraries, voor ondermeer kalender componenten, spreadsheets, minimaliseren in de windows tray, grafieken weergeven en de layout van de applicatie aanpassen. Het laatste, aanpassen van de layout, is Swing specifiek. De onderstaande screenshot demonstreert hoe een bestaande applicatie snel een hippe layout kan krijgen, door toevoeging van enkele regels source code:

 
Swing applicatie met Substance look&feel

Swing binnen de webbrowser

Het lokaal moeten installeren van software is sinds de opkomst van webapplicaties uit de gratie geraakt. De voordelen zijn duidelijk: beheerskosten voor werkplekken is aanzienlijk lager, en gebruikers kunnen zelf makkelijk een programma starten en gebruiken.

Applets waren ooit de oplossing om software automatisch van uit de webbrowser te kunnen starten. Helaas was het installeren van de noodzakelijke Java Plugin vaak een pijnlijk en moeizaam proces. De plugin was dusdanig groot waardoor zelfs met een ADSL verbinding het downloaden lang duurde. Bovendien was het installatieproces, door de vele overbodige vragen niet gebruikersvriendelijk te noemen.

Sinds Java Update 10 is installeren van de Java Plugin, en daarmee starten van grafische Swing applicaties binnen de webbrowser aanzienlijk makkelijker geworden. De downloadgrootte is lager geworden, doordat de vernieuwde plugin niet de complete Java runtime download, maar alleen een minimale basis en alles wat voor de specifieke applet (website) nodig is:

 
Grootte plugin, afhankelijk voor soort applicatie

Te meer internetverbindingen in de laatste jaren überhaupt al een stuk sneller zijn geworden, is de grootte van de java plugin niet meer een probleem. Een ander probleem, het gebruikersonvriendelijke installatieproces, is in de laatste updates van de Java Plugin ook aanzienlijk verbeterd. Hoewel de flash-plugin nog steeds iets makkelijker installeert, hoeft de installatie van de plugin niet langer gebruikers afschrikken.

Communicatie met de backend

Tot slot een praktisch probleem bij alle RIA applicaties: de communicatie met de backend. Hoe moet kan dit probleem opgelost worden bij Swing applets? Applicaties gebaseerd op DHTML frameworks draaien vrijwel geheel op de server: in de webbrowser wordt alleen de frontend gebaseerd op Javascript en HTML geladen. Slechte scheiding van frontend en backend kan tot een minder onderhoudbare applicatie leiden, maar zal niet direct praktische problemen opleveren.

Klassieke desktop-applicaties spraken vaak direct een database of filesysteem aan. Bij moderne RIA is dat geen optie meer: scheiding van frontend niet slechts een goede gewoonte, maar zelfs noodzakelijk: de frontend kan niet stiekem een database direct aanspreken, of filesysteem van de server aanspreken.

Bovendien moet er een goede manier van communicatie tussen de backend, op de server, en de frontend, op de client gevonden worden. Tussen een client en server is vaak een firewall of proxyserver, hier moet goed mee om gegaan kunnen worden, zonder dat gebruiker aanpassingen in zijn firewall moet doen, of vele security waarschuwingen moet negeren.

Swing applets zijn java applicaties. Hierdoor kunnen de meeste bestaande communicatieframeworks die binnen Java Enterprise (J2EE) ook gebruikt worden voor communicatie tussen front- en backend, zoals Spring Webservices, Apache CXF, RMI of zelfs Corba. Deze frameworks worden nu vooral gebruikt voor communicatie tussen meerdere servers op de backend, maar kan ook gebruikt worden voor communicatie tussen frontend en backend: een swing applicatie kan ook een SOAP of REST client zijn.

Conclusie

Via het JDesktop framework is ontwikkelen van grafische, op Swing gebaseerde applicaties erg eenvoudig. Een nieuwe taal voor de frontend is niet nodig. Gebruikers krijgen een gebruikerservaring die vergelijkbaar is met bestaande desktopapplicaties, zonder dat zij hiervoor zelf software moeten installeren of configureren.

Ontwikkelaars kunnen via Swing snel een goed onderhoudbare frontend opzetten, en zijn minder tijd kwijt aan het oplossen van browserproblemen of omzeilen van het probleem dat http een stateless protocol is.

Tot slot, het Swing framework bestaat vele jaren,er is veel informatie over beschikbaar en er zijn veel tools en frameworks die het ontwikkelen van Swing applicaties kunnen ondersteunen. . Veel applicaties zijn al in Swing ontwikkeld, en nieuwe standaarden maken het ontwikkelen van Swing applicaties nog eenvoudiger. Kortom wie rijke, robuuste zakelijke frontend applicaties wil schrijven en geen nieuwe taal als Flex wil leren, is Swing een goede keuze.

Referenties

Waardering:
 

Reacties

Nieuwe reactie inzenden

De inhoud van dit veld is privé en zal niet openbaar worden gemaakt.

Meer informatie over formaatmogelijkheden

CAPTCHA
Deze vraag is om te testen of u een persoon bent en om spam te voorkomen
Image CAPTCHA
Enter the characters shown in the image.