Tag Archives: Java

Gespeel met screencasts

Pas heb ik mij een nieuwe headset aangeschaft, om eens te experimenteren met screencasts. Pascal vertelde over screencasts op Barcamp Gent. Iedereen doet het, dus kon ik moeilijk achterblijven en wou ik dat eens aan de lijve ondervinden met Jing.

Aangezien wij op school het Session Bean voorbeeld in JOnAS (J2EE Web Applicatie Server) werkende dienden te krijgen en omdat dat niet zo evident is om dat op een Windows machine heb ik geprobeerd om dat met video te illustreren.

Probleem echter is dat ik de swf niet kan resizen (ik had hem op 1280 x 788 opgenomen) om op deze blog te fitten, vandaar dat ik liever naar de Session Bean screencast link. Dat is een tekortkoming in het Jing Project (geen idee of UtipU dat kan), maar volgende keren (ja, ik ben dus van plan om dat meer te doen) zal ik een gepaste resolutie gebruiken. Nog een minpunt trouwens, is dat Jing ook heel wat RAM geheugen opslurpt, maar voor de rest werkt het erg vlot.

Rest mij alleen nog te zeggen: enjoy!

Session Bean screencast

Mijn Java Twitter Client

De afgelopen weken heb ik mij nog eens met Java beziggehouden. Vooral met de bedoeling om eigenlijk eens een deftige applicatie te schrijven. Zo from scratch, met de bedoeling een standalone Desktop applicatie te schrijven voor Twitter. Puur uit interesse, puur om bij te leren en om in Swing te spelen.

Nadat ik de Twitter API had doorgenomen ben ik meteen aan de slag gegaan. Het resultaat is een applicatie die ik tweetMe heb genoemd (dat stiekem een verwijzing naar de film Feed is).

tweetMe, a twitter Desktop application

Zoals je ziet is de UI opgebouwd uit een aantal tabs. Eerst wordt er een component gegenereerd. Dit gebeurt door een XML feed uit te lezen via een DOM parser van Java. Dan worden de elementen met waarden in een Array geplaatst, bestaande uit verschillende HashMap‘s die door heel de applicatie wordt doorgegeven. Zo wordt er een Component gebouwd dat dan meegegeven wordt aan de specifieke tab. Het component moet telkens er van tab veranderd wordt volledig terug worden opgebouwd. Weer feed lezen, weer parsen en doorgeven en dan netjes HTML weergeven.

So far so good, het updaten naar Twitter werkt en het geformatteerd weergeven van de feeds ook. Dramatischer is dat dat laatste proces acht à tien seconden in beslag neemt. Onbegonnen werk dus, er schort duidelijk iets aan mijn manier van werken. En toch begrijp ik niet waarom dat het zo lang duurt.

Nu ja, er zal heus wel een andere manier zijn om zo’n dingen aan te pakken. Ik beschouw dit als een leerproces, zoals ik al zei. Ik kijk wel eens naar XUL of Adobe Air, zulke zaken zijn meer ontworpen om Internet applicaties te ontwikkelen. Java is een mature technologie die bovendien nog platform onafhankelijk is, maar Java lijkt heel onstabiel en zwaar te zijn. Niet alleen bij het bouwen van deze applicatie werd mij dat duidelijk, maar ook bij het gebruiken van het belachelijk onstabiele ArgoUML, een modelleer tool geschreven in Java.

Dus ja, de ontwikkeling zal niet verder worden gezet wat mij betreft of u moest afkomen met wat tips of sturingen. Ik zou dan heel dankbaar zijn en u zou eeuwige roem krijgen. Echt waar.

Wanneer je een eindeloze lus hebt in een ChangeListener()

Het heeft me toch een ruime hoeveelheid aan tijd gekost, daarom even het volgende, iets wat technischer item over Java en ChangeListener().

Toen ik met een ChangeListener() bezig was, die luisterde bij het verwisselen van tabs, stootte ik op het probleem dat de inhoud van elke tab volledig zou moeten vernieuwd worden. Dit betekent dat het JComponent dat meegegeven werd aan een JTabbedPane volledig opnieuw zou moeten gegenereerd worden en dat de tab dus verwijderd moet worden om vervolgens op dezelfde index terug in te voegen.

Het probleem stelde zich wanneer er een removeTabAt() aangeroepen werd omdat deze opnieuw een stateChanged() triggert terwijl er reeds een ChangeEvent actief was. Dit resulteerde in een oneindige lus. Na advies op het Sun forum werd mij de volgende oplossing aangereikt die ik graag met jullie wens te delen.

Er diende een flag toegevoegd te worden in de listener, in dit geval alreadyListening, om na te gaan of stateChanged reeds operatief is. Zo ja, dan mag er geen loadTab() uitgevoerd worden.

Hieronder de implementatie voor de ChangeListener():


tabbedPane.addChangeListener(new
ChangeListener() {
  public void stateChanged(ChangeEvent event) {
     if(!alreadyListening) {
       alreadyListening = true;
       int n = tabbedPane.getSelectedIndex();
       loadTab(n);
      alreadyListening = false;
    }
  }
});

De implementatie voor loadTab() ziet er als volgt uit:


private void loadTab(int n) {
  tabbedPane.removeTabAt(n);
  JComponent component = createComponent();
  tabbedPane.insertTab("Someting",  icon, component, "Does nothing", n);
  tabbedPane.setSelectedIndex(n);
}

Let vooral dat ik in laatste stap een setSelectedIndex() aanroep op het JTabbedPane-object om de pointer terug op waarde n te plaatsen in plaats van de automatische n+1.

En we zijn nog geen stap verder

In de jaren zestig en zeventig ― nog in de tijd van de mainframes ― werd stilaan duidelijk dat er drie verschillende niveau ‘s waren. Je had de logica van de presentatie, de logica op het applicatie-niveau en tenslotte de data-logica. Fundamenteel echter is dat deze verschillende logica van elkaar gescheiden behoren te zijn. Terug naar de jaren 50!

Continue reading En we zijn nog geen stap verder