<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>Java Adept...</title>
	<atom:link href="http://jadept.wordpress.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://jadept.wordpress.com</link>
	<description>...czyli o moich potyczkach z Java i nie tylko.</description>
	<lastBuildDate>Wed, 28 Oct 2009 09:44:48 +0000</lastBuildDate>
	<generator>http://wordpress.com/</generator>
	<language>pl</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<cloud domain='jadept.wordpress.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://www.gravatar.com/blavatar/0eb70918e36fe07e60698af8b00545a8?s=96&#038;d=http://s.wordpress.com/i/buttonw-com.png</url>
		<title>Java Adept...</title>
		<link>http://jadept.wordpress.com</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://jadept.wordpress.com/osd.xml" title="Java Adept&#8230;" />
		<item>
		<title>W separacji z Java;)</title>
		<link>http://jadept.wordpress.com/2009/10/28/w-separacji-z-java/</link>
		<comments>http://jadept.wordpress.com/2009/10/28/w-separacji-z-java/#comments</comments>
		<pubDate>Wed, 28 Oct 2009 09:44:48 +0000</pubDate>
		<dc:creator>java_adept</dc:creator>
				<category><![CDATA[1]]></category>

		<guid isPermaLink="false">http://jadept.wordpress.com/?p=94</guid>
		<description><![CDATA[Właściwie powinienem napisać to już dawno temu. W związku z tym, że jestem na etapie pisania pracy dyplomowej, a uznał, że najlepszy do mojego tematu będzie język PHP, tak jak to już widać zresztą od dłuższego czasu, zawieszam swoją działalność blogową. 

Jeśli ktoś z odwiedzających miałby jakiś problem, na który nie może znaleźć odpowiedzi na [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=jadept.wordpress.com&blog=8023950&post=94&subd=jadept&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Właściwie powinienem napisać to już dawno temu. W związku z tym, że jestem na etapie pisania pracy dyplomowej, a uznał, że najlepszy do mojego tematu będzie język PHP, tak jak to już widać zresztą od dłuższego czasu, zawieszam swoją działalność blogową. </p>
<p>
Jeśli ktoś z odwiedzających miałby jakiś problem, na który nie może znaleźć odpowiedzi na forum, może pisać na mejla, jeśli tylko znajdę czas z chęcią pomogę, żeby trochę oderwać się od PHP no i nie tracić całkowicie kontaktu z Java, bo sam na pisanie czegoś ciekawego nie mam po prostu czasu.</p>
<p>Pozdrawiam</p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/jadept.wordpress.com/94/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/jadept.wordpress.com/94/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/jadept.wordpress.com/94/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/jadept.wordpress.com/94/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/jadept.wordpress.com/94/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/jadept.wordpress.com/94/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/jadept.wordpress.com/94/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/jadept.wordpress.com/94/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/jadept.wordpress.com/94/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/jadept.wordpress.com/94/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=jadept.wordpress.com&blog=8023950&post=94&subd=jadept&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://jadept.wordpress.com/2009/10/28/w-separacji-z-java/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/51ec225d70e56781b8bb5815da1c5087?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">java_adept</media:title>
		</media:content>
	</item>
		<item>
		<title>Powiadają, że najlepsze są powroty&#8230;.</title>
		<link>http://jadept.wordpress.com/2009/09/10/powiadaja-ze-najlepsze-sa-powroty/</link>
		<comments>http://jadept.wordpress.com/2009/09/10/powiadaja-ze-najlepsze-sa-powroty/#comments</comments>
		<pubDate>Thu, 10 Sep 2009 18:58:23 +0000</pubDate>
		<dc:creator>java_adept</dc:creator>
				<category><![CDATA[Różności]]></category>

		<guid isPermaLink="false">http://jadept.wordpress.com/?p=88</guid>
		<description><![CDATA[&#8230;no i wróciłem z wygnania za chlebem, stając od razu przed kampanią wrześniową w szkole (czytaj ukończeniem piekielnego projektu), który stwierdzam teraz jest trochę bezsensowny, bo zaprzęganie Java do tworzenie zwykłej aplikacji desktop-owej mija się trochę z celem, chciałbym zacząć powoli bawić się w coś bardziej związanego z ideą Java, ale jak mus to mus, [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=jadept.wordpress.com&blog=8023950&post=88&subd=jadept&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>&#8230;no i wróciłem z wygnania za chlebem, stając od razu przed kampanią wrześniową w szkole (czytaj ukończeniem piekielnego projektu), który stwierdzam teraz jest trochę bezsensowny, bo zaprzęganie Java do tworzenie zwykłej aplikacji desktop-owej mija się trochę z celem, chciałbym zacząć powoli bawić się w coś bardziej związanego z ideą Java, ale jak mus to mus, trzeba walczyć&#8230;</p>
<p>Pozdrawiam wszystkich dotychczas oceniających moje notki, za wszelkie uwagi jestem bardzo wdzięczny.</p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/jadept.wordpress.com/88/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/jadept.wordpress.com/88/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/jadept.wordpress.com/88/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/jadept.wordpress.com/88/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/jadept.wordpress.com/88/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/jadept.wordpress.com/88/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/jadept.wordpress.com/88/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/jadept.wordpress.com/88/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/jadept.wordpress.com/88/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/jadept.wordpress.com/88/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=jadept.wordpress.com&blog=8023950&post=88&subd=jadept&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://jadept.wordpress.com/2009/09/10/powiadaja-ze-najlepsze-sa-powroty/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/51ec225d70e56781b8bb5815da1c5087?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">java_adept</media:title>
		</media:content>
	</item>
		<item>
		<title>JTable nie takie &#8220;straszne&#8221;.</title>
		<link>http://jadept.wordpress.com/2009/06/28/jtable-nie-takie-straszne/</link>
		<comments>http://jadept.wordpress.com/2009/06/28/jtable-nie-takie-straszne/#comments</comments>
		<pubDate>Sun, 28 Jun 2009 21:11:30 +0000</pubDate>
		<dc:creator>java_adept</dc:creator>
				<category><![CDATA[Java SE]]></category>

		<guid isPermaLink="false">http://jadept.wordpress.com/?p=81</guid>
		<description><![CDATA[Mamy okres wakacyjny, dla wielu w tym i mnie jest to czas wyjazdów do pracy, aby zarobić trochę pieniążków na chleb (czyt. kolejny rok studiów, itd.). Pomimo tego, że czasu nie mam za wiele, postanowiłem napisać cokolwiek, żeby blog nie był taki martwy. Temat dzisiejszej rozkminy prosty, ale na pewno przyda się początkującym adeptom Java [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=jadept.wordpress.com&blog=8023950&post=81&subd=jadept&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Mamy okres wakacyjny, dla wielu w tym i mnie jest to czas wyjazdów do pracy, aby zarobić trochę pieniążków na chleb (czyt. kolejny rok studiów, itd.). Pomimo tego, że czasu nie mam za wiele, postanowiłem napisać cokolwiek, żeby blog nie był taki martwy. Temat dzisiejszej rozkminy prosty, ale na pewno przyda się początkującym adeptom Java którzy podobnie jak ja jeszcze nie dawno, staną w pewnym momencie do walki o ujarzmienie JTable.<br />
<br />
Z moich obserwacji wynika, że kłopoty z prawidłową obsługą tabeli ma duża część początkujących. Zwykle wybierana przez nich droga rozwiązania nie jest najlepsza i kończy się dużą ilością kompletnie nie potrzebnego kodu, koszmarnego w utrzymaniu, zwłaszcza jeśli w programie mamy wiele różnych tabel. Wydaje mi się, że wynika to przede wszystkim z faktu nie znajomości wzorców projektów, szczególnie <a href="http://pl.wikipedia.org/wiki/MVC">MVC</a>, z którego to biblioteka Swing czerpie pełnymi garściami, gdzie nawet najmniejszy JButton jest przykładem tego wzorca.<br />
<br />
Ale do rzeczy, model dla JTable jest implementacją interfejsu <a href="http://java.sun.com/j2se/1.4.2/docs/api/javax/swing/table/TableModel.html#addTableModelListener(javax.swing.event.TableModelListener)">TableModel</a>, programiści API wyręczyli nas z bezpośredniej implementacji tego interfejsu, tworząc jego szkieletową implementację <a href="http://java.sun.com/j2se/1.4.2/docs/api/javax/swing/table/AbstractTableModel.html">AbstractTableModel</a>, dzięki czemu odpada nam dużo roboty.<br />
<br />
Przykład, model tabeli operujący na obiektach klasy Person:</p>
<pre class="brush: java;">
public class PersonTableModel extends AbstractTableModel {

    private List&lt;Person&gt; persons = null;
    private final static Object[] columnNames = {&quot;&quot;, &quot;Imię&quot;, &quot;Nazwisko&quot;, &quot;Płeć&quot;,
        &quot;Ulica&quot;,&quot;Nr. d/m&quot;, &quot;Miasto&quot;, &quot;Kod pocztowy&quot;, &quot;Województwo&quot;,
        &quot;Tel. kom&quot;, &quot;Tel. dom&quot;, &quot;Email&quot;};

    private final static int HIDDEN_IDX = 0;
    private final static int NAME_IDX = 1;
    private final static int SURNAME_IDX = 2;
    private final static int GENDER_IDX = 3;
    private final static int STREET_IDX = 4;
    private final static int APARTMENT_IDX = 5;
    private final static int CITY_IDX = 6;
    private final static int ZIPCODE_IDX = 7;
    private final static int PROVINCE_IDX = 8;
    private final static int CELL_IDX = 9;
    private final static int PHONE_IDX = 10;
    private final static int EMAIL_IDX = 11;

    public PersonTableModel() {}

    @Override
    public int getRowCount() {
        if(persons==null) return 0;
        return persons.size();
    }

    @Override
    public int getColumnCount() {
        return columnNames.length;
    }

    @Override
    public Object getValueAt(int rowIndex, int columnIndex) {

        if(persons == null) return null;
        Person p = (Person) persons.get(rowIndex);
        switch (columnIndex) {
            case HIDDEN_IDX:
                return p.getId();
            case NAME_IDX:
                return p.getName();
            case SURNAME_IDX:
                return p.getSurname();
            case GENDER_IDX:
                return p.getGender().toString();
            case STREET_IDX:
                return p.getStreet();
            case APARTMENT_IDX:
                return p.getApartment();
            case CITY_IDX:
                return p.getCity();
            case ZIPCODE_IDX:
                return p.getZipCode();
            case PROVINCE_IDX:
                return p.getProvince().toString();
            case CELL_IDX:
                return p.getCellNumber();
            case PHONE_IDX:
                return p.getPhoneNumber();
            case EMAIL_IDX:
                return p.getEmail();
            default:
                return p;
        }
    }

    @Override
    public String getColumnName(int column) {
        return columnNames[column].toString();
    }

    @Override
    public boolean isCellEditable(int row, int column) {
        return false;
    }

    public void setModelData(List&lt;Person&gt; persons) {
       this.persons =  persons;
    }
    public Person getPerson(int position) {
        return persons.get(position);
    }

}
</pre>
<p>Aby stworzyć model o podstawowej funkcjonalności wystarczy zaimplementować 3 metody abstrakcyjne:</p>
<ul>
<li><code>public int getRowCount()</code> &#8211; zwracającą liczbę wierszy w tabeli</li>
<li><code>public int getColumnCount()</code> &#8211; analogicznie liczbę kolumn</li>
<li><code>public Object getValueAt(int rowIndex, int columnIndex)</code> &#8211; zwracają wartość o podanych współrzędnych</li>
</ul>
<p>Bardzo często w modelu dodaję się obsługę nagłówka tabeli, zwłaszcza jeśli mamy pewność, że liczba kolumn w tabeli nie będzie się zmieniać, wtedy należy przesłonić metodę <code>public String getColumnName(int column)</code>, a jeśli chcemy zablokować możliwość edycji komórek tabeli przeciążamy metodę <code>public boolean isCellEditable(int row, int column)</code><br />
Jak widać model tabeli przechowuje referencję do kolekcji obiektów Person, gdy stan tej listy zmieni się wystarczy wywołać metodę <code>fireTableDataChanged()</code>, aby odświeżyć stan tabeli.<br />
<br />
I to już wszystko, jak widać nie takie to straszne, więcej przydatnych informacji przechowuje skarbonka wiedzy suna: <a href="http://java.sun.com/docs/books/tutorial/uiswing/components/table.html">JTable Tutorial</a>.</p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/jadept.wordpress.com/81/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/jadept.wordpress.com/81/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/jadept.wordpress.com/81/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/jadept.wordpress.com/81/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/jadept.wordpress.com/81/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/jadept.wordpress.com/81/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/jadept.wordpress.com/81/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/jadept.wordpress.com/81/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/jadept.wordpress.com/81/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/jadept.wordpress.com/81/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=jadept.wordpress.com&blog=8023950&post=81&subd=jadept&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://jadept.wordpress.com/2009/06/28/jtable-nie-takie-straszne/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/51ec225d70e56781b8bb5815da1c5087?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">java_adept</media:title>
		</media:content>
	</item>
		<item>
		<title>Mój sposób na &#8220;oczyszczanie&#8221; formularzy&#8230;.</title>
		<link>http://jadept.wordpress.com/2009/06/17/moj-sposob-na-oczyszczanie-formularzy/</link>
		<comments>http://jadept.wordpress.com/2009/06/17/moj-sposob-na-oczyszczanie-formularzy/#comments</comments>
		<pubDate>Wed, 17 Jun 2009 11:54:01 +0000</pubDate>
		<dc:creator>java_adept</dc:creator>
				<category><![CDATA[Java SE]]></category>
		<category><![CDATA[Swing]]></category>

		<guid isPermaLink="false">http://jadept.wordpress.com/?p=49</guid>
		<description><![CDATA[Wszyscy znamy opcję reset spotykaną chociażby w zwykłych formularzach html. Na pierwszy rzut oka z kodzenie takiej funkcjonalności w aplikacji okienkowej wydaje się banalnie proste, bierzemy wszystkie komponenty typu  JTextComponent, lub jeszcze inne, wkładamy je do kolekcji i w odpowiedniej metodzie, przywracamy pierwotny stan kontrolek (np. setText(null);).

I co wszystko jest tip top? Otóż mamy [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=jadept.wordpress.com&blog=8023950&post=49&subd=jadept&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Wszyscy znamy opcję reset spotykaną chociażby w zwykłych formularzach html. Na pierwszy rzut oka z kodzenie takiej funkcjonalności w aplikacji okienkowej wydaje się banalnie proste, bierzemy wszystkie komponenty typu  <a href="http://java.sun.com/j2se/1.4.2/docs/api/javax/swing/text/JTextComponent.html">JTextComponent</a>, lub jeszcze inne, wkładamy je do kolekcji i w odpowiedniej metodzie, przywracamy pierwotny stan kontrolek (np. <code>setText(null);</code>).
</p>
<p>I co wszystko jest tip top? Otóż mamy zonka połamaliśmy co najmniej kilka z podstawowych zasad programowania obiektowego z <a href="http://en.wikipedia.org/wiki/Single_responsibility_principle">SRP</a> i <a href="http://en.wikipedia.org/wiki/Don%27t_repeat_yourself">DRY</a> na czele. Czyli ogólnie wszystko jest do dupy. Wystarczy pomyśleć co by było w przypadku 10 różnych formularzy w aplikacji, a pasuje każdemu dodać taką funkcjonalność. Ile zbędnych, koszmarnych w utrzymaniu linii kodu nabazgrzemy?</p>
<p>Postanowiłem pobawić się w małą, nie doskonałą jeszcze, ale jednak refaktoryzację&#8230;<br />
W standardowej bibliotece Java mamy bardzo przyjemny interfejs <a href="http://java.sun.com/j2se/1.4.2/docs/api/java/awt/event/ContainerListener.html">ContainerListener</a> i nim właśnie zamierzam się posłużyć, powołując do życia interfejs ContainerClearer.</p>
<p><pre class="brush: java;">
package view;
import java.awt.event.ContainerListener;

public interface ContainerClearer extends ContainerListener {

   void clearComponents();

}
</pre>
<p>Mając już podstawę na potrzeby klas konkretnych, pasuje skodzić jakąś implementację.</p>
<pre class="brush: java;">
package view;

import java.awt.Component;
import java.awt.event.ContainerEvent;
import java.util.*;
import javax.swing.*;

public class SimpleFormClearer implements ContainerClearer {

    private List&lt;Component&gt; components;

    public SimpleFormClearer() {
        components = new ArrayList&lt;Component&gt;();
    }

    public void clearComponents() {
        for(Component c : components) {
            if (c instanceof JTextComponent)
                ((JTextComponent)c).setText(null);
            if (c instanceof JComboBox)
                ((JComboBox)c).setSelectedItem(null);
        }
    }

    public void componentAdded(ContainerEvent e) {
        components.add(e.getChild());
    }

    public void componentRemoved(ContainerEvent e) {
        components.remove(e.getChild());
    }

}
</pre>
<p>W celu zmniejszenie ilości kodu, można posunąć się jeszcze dalej, tworząc klasę abstrakcyjną i zaimplementować w niej interfejs <code>ContainerClearer</code>, jak to jest często wykorzystywane w standardowych bibliotekach Java (Abstract + nazwa interfejsu)</p>
<pre class="brush: java;">
public abstract class AbstractContainerClearer implements ContainerClearer {

    protected java.util.List&lt;Component&gt; components;

    public AbstractContainerClearer() {
        components = new java.util.ArrayList&lt;Component&gt;();
    }

    abstract public void clearComponents();

    public void componentAdded(ContainerEvent e) {
        components.add(e.getChild());
        addClearerToChildContainer(e.getChild());
    }

    public void componentRemoved(ContainerEvent e) {
        components.remove(e.getChild());
        addClearerToChildContainer(e.getChild());
    }

    protected void addClearerToChildContainer(Component c) {

        if (c instanceof Container) {

            Container cont = (Container) c;
            cont.addContainerListener(this);

            Component[] children = cont.getComponents();

            for (int i = 0; i &lt; children.length; i++) {
                addClearerToChildContainer(children[i]);
            }
        }
    }
}
</pre>
<p>Dzięki temu, że jest to klasa abstrakcyjna nie musimy implementować w niej metod narzucanych przez interfejs, dorzucamy <code>abstract</code> i wszystko śmiga. Powyższy zabieg uświadomił mi jeszcze jedną ważną kwestią, otóż aby klasa <code>SimpleFormClearer</code> działała poprawnie chociażby w okienku dialogowym zawierającym wiele zagnieżdżonych paneli musielibyśmy dodawać go do każdego panela, co w przypadku bardziej rozbudowanego GUI staje się dość wkurzające. Metoda <code>addClearerToChildContainer</code> rozwiązuje ten problem, a implementacja tej klasy staję się znacznie bardziej przejrzysta:</p>
<pre class="brush: java;">
public class BasicFormClearer extends AbstractContainerClearer {

    @Override
    public void clearComponents() {
        for(Component c : components) {
            if (c instanceof JTextComponent)
                ((JTextComponent)c).setText(null);
            if (c instanceof JComboBox)
                ((JComboBox)c).setSelectedItem(null);
        }
    }
}
</pre>
<p>Teraz wystarczy dodać go do kontenera najwyższego poziomu:</p>
<pre class="brush: java;">
getContentPane().addContainerListener(new BasicFormClearer());
</pre>
<p>i po sprawie&#8230;</p>
<p>Zalety: dużo prościej, ładniej i przejrzyście, tworząc kilka klas konkretnych można jeszcze pokusić, a nawet należy dodać odpowiednią fabrykę.<br />
Wady: na pierwszy rzut oka widać że kod metody <code>clearComponents()</code> nie jest doskonały (OCP, rzutowanie), mi jak na razie nie przychodzi lepsze rozwiązanie, może ktoś przedstawi jakąś sugestię?<br />
<br />
W każdym razie i tak jest dużo lepiej, warto zaglądać do <a href="http://java.sun.com/j2se/1.5.0/docs/api/">dokumentacji</a>  w poszukiwaniu przydatnych narzędzi i zawsze należy dążyć do uzyskania jak największej jakości kodu.</p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/jadept.wordpress.com/49/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/jadept.wordpress.com/49/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/jadept.wordpress.com/49/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/jadept.wordpress.com/49/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/jadept.wordpress.com/49/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/jadept.wordpress.com/49/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/jadept.wordpress.com/49/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/jadept.wordpress.com/49/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/jadept.wordpress.com/49/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/jadept.wordpress.com/49/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=jadept.wordpress.com&blog=8023950&post=49&subd=jadept&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://jadept.wordpress.com/2009/06/17/moj-sposob-na-oczyszczanie-formularzy/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/51ec225d70e56781b8bb5815da1c5087?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">java_adept</media:title>
		</media:content>
	</item>
		<item>
		<title>SwingWorker w akcji;)</title>
		<link>http://jadept.wordpress.com/2009/06/05/swingworker-w-akcji/</link>
		<comments>http://jadept.wordpress.com/2009/06/05/swingworker-w-akcji/#comments</comments>
		<pubDate>Fri, 05 Jun 2009 16:45:37 +0000</pubDate>
		<dc:creator>java_adept</dc:creator>
				<category><![CDATA[Java SE]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Swing]]></category>
		<category><![CDATA[Współbieżność]]></category>

		<guid isPermaLink="false">http://jadept.wordpress.com/?p=19</guid>
		<description><![CDATA[Postanowiłem oderwać się od swojej piekielnej potyczki z wyrażeniami regularnymi i napisać coś w końcu zgodnego z tytułem blogu. Temat na początek łatwy, ale od czegoś trzeba zacząć, a dokładnie wykonywanie długotrwałych procesów programu za pomocą klasy SwingWorker
Postanowiłem o tym napisać bo sam dosyć często lekceważyłem tę kwestię i jakoś nie przeszkadzało mi kilku-sekundowe przywieszenie [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=jadept.wordpress.com&blog=8023950&post=19&subd=jadept&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Postanowiłem oderwać się od swojej piekielnej potyczki z wyrażeniami regularnymi i napisać coś w końcu zgodnego z tytułem blogu. Temat na początek łatwy, ale od czegoś trzeba zacząć, a dokładnie wykonywanie długotrwałych procesów programu za pomocą klasy <a href="http://java.sun.com/javase/6/docs/api/javax/swing/SwingWorker.html">SwingWorker</a><br />
Postanowiłem o tym napisać bo sam dosyć często lekceważyłem tę kwestię i jakoś nie przeszkadzało mi kilku-sekundowe przywieszenie się UI podczas np. łączenia z bazą danych w prostych programikach na zaliczenia. W końcu stało się to bardzo wkurzające i jest to po prostu duży przypał jeśli widzi się takie działanie programu. Drugim powodem było to, że nie tak wiele osób umie prawidłowo korzystać ze &#8220;świątyni wszechwiedzy&#8221; Google, widziałem nawet jak nie którzy sami próbowali implementować &#8220;ciężkie&#8221; zadania zrzucając je na własne wątki, czyli prostować poziomicę.<br />
<br />
Co do tych ciężkich procesów, to ogólna zasada mówi że każde zadanie ktorego czas trwania moze spowodowac zauwazalne &#8216;zamrozenie&#8217; interfejsu uzytkownika, nie powinno być wykonywane w wątku operującym GUI. Do takich długotrwałych procesów zalicza się m.in:</p>
<ul>
<li>Łączenie z bazą danych oraz operacje na bazie danych</li>
<li>Wczytywanie dużych plików np. (jpg-ów) (ogólnie operacji IO)</li>
<li>Długotrwałych obliczeń (np.operacji morphingu)</li>
<li>Odświeżanie dużych tabel</li>
</ul>
<p>W Java wątek odpowiadający za obsługę GUI zwie się <a href="http://java.sun.com/docs/books/tutorial/uiswing/concurrency/dispatch.html">Event Dispatch Thread</a> (jakby ktoś nie wiedział;)), czyli po prostu EDT. Jak sama nazwa mówi zajmuję się on obsługą kolejki zdarzeń i informowaniem o nich obiektów nasłuchujących (czyt. z reguły ActionListener-ów), dodatkowo zarządza rozłożeniem komponentów, ich wyświetleniem, zmianą właściwości komponentów (np. dezaktywacja przycisku) i obsługą zadań.  Zadaniami tymi powinny być <b>tylko i wyłącznie krótkotrwałe procesy</b>. Niektórzy myślą że to&#8230;:</p>
<pre class="brush: java;">
public static void main(String[] args) {

    SwingUtilities.invokeLater(new Runnable(){
        @Override
        public void run() {
            JFrame f = new JFrame();
            f.setSize(200,200);
            f.setVisible(true);
        }
    });
    }
}
</pre>
<p>lub</p>
<pre class="brush: java;">
public static void main(String[] args) {

    EventQueue.invokeLater(new Runnable(){
        @Override
        public void run() {
            JFrame f = new JFrame();
            f.setSize(200,200);
            f.setVisible(true);
        }
    });
    }
}
</pre>
<p>&#8230;załatwia sprawę, ale to dopiero początek, każda nie banalna aplikacja powinna odpalać GUI w EDT za pomocą powyższych technik (pierwsza jest ciut mniej pracochłonna, ponieważ wystarczy zaimportować tylko pakiet javax.swing.*;), ale jak zwał tak zwał wszystko to jeden ciul ważne że mamy prawidłowo zainicjalizowane GUI i jak na razie wszystko jest wporządku .<br />
<br />
Teraz potrzebujemy obsługi długotrwałych zadań, która nasza spłodzona w pocie czoła aplikacja ma wykonywać.<br />
Pierwszy krok&#8230;<br />
&#8230;a jakże ulubiona <a href="http://java.sun.com/javase/6/docs/api/javax/swing/SwingWorker.html">dokumentacja</a></p>
<p>Rozkminimy sobie co ten wspaniały produkt programistów Sun-a ma nam do zaoferowania.<br />
Pierwsze co rzuca się w oczy to deklaracja klasy:</p>
<pre class="brush: java;">
public abstract class SwingWorker&lt;T,V&gt; extends Object
implements RunnableFuture
</pre>
<p>Jak widać SwingWorker to klasa abstrakcyjna, czyli możemy utworzyć obiekt tylko i wyłącznie klasy po niej dziedziczącej. Drugą rzeczą rzucającą się w oczy są parametry T i V, tak SwingWorker czerpie pełnymi z garściami z dobrodziejstw typów uogólnionych dodanych w Java 1.5. Implementowany interfejs jest połączeniem interfejsów <a href="http://java.sun.com/j2se/1.4.2/docs/api/java/lang/Runnable.html">Runnable</a> i <a href="http://java.sun.com/j2se/1.5.0/docs/api/java/util/concurrent/Future.html">Future</a> (z niego właśnie pochodzi metoda get() zwracająca rezulat obliczeń).<br />
Parametr T &#8211; określa typ zwracany przez metody <code>doInBackground()</code> i <code>get()</code> o których później. Jest to po prostu rezultat naszego zadania np. obrazek.<br />
Parametr V &#8211; określa typ danych pośrednich, które może produkować zadanie, przykładowo linie tekstu z wczytywanego pliku. Dane te można wyłuskać za pomocą metody <code>process(List dane)</code>, a które przekazuje do niej metoda <code>publish(V... dane)</code>, która powinna być używana w implementacji metody <code>doInBackground()	</code>.<br />
<strong>Uwaga!</strong><br />
Aby metody zwracały typ <code>void</code> (a dokładniej żadnego konkretnego typu), bo taką możliwość naturalnie też mamy, w deklaracji klasy należy podstawić parametr <strong>V</strong>oid.</p>
<p>Użyteczne metody klasy SwingWorker:</p>
<ul>
<li><code>abstract protected doInBackground()</code>
<p>Zaimplementowanie tej metody najbardziej nas interesuje, ba, nawet musimy to zrobić ponieważ jest to     metoda abstrakcyjna. To w niej powinniśmy dostarczyć zadanie do wykonania. Jeśli przesłonimy także metodę <code>process(List dane)</code>, możemy przy pomocy <code>publish(V... dane)</code>  przekazywać do <code>process(List dane)</code> cząstkowe wyniki działania zadania.</p>
</li>
<li>
   <code>protected process(List dane)</code></p>
<p>  Dzięki tej metodzie możemy operować na pośrednich danych zwróconych przez <code>publish(V... dane)</code>. W tej metodzie możemy bezpiecznie operować na komponentach graficznych, np. dodawać linijki tekstu to JTextArea, ponieważ działa ona asynchronicznie w EDT.</p>
</li>
<li><code>protected void  publish(V... chunks)</code>
<p>Metoda ta przesyła szczątkowe dane metodzie <code>protected process(List dane)</code>, nie ma potrzeby jej przesłaniania, ale można to zrobić w przypadku gdy np. chcemy wykonać jakieś extra operację na dostarczanych danych.
</li>
<li><code>protected  void done()</code>
<p>Metoda wywoływana po zakończeniu zadania, wykonywana w EDT, można w niej przeprowadzić sprzątania i zaprezentować w GUI główny rezultat wykonywanego zadania, czyli pobrać rezultat działania <code>doInBackground()</code> przy pomocy metody <code>get()</code>.</p>
</li>
</ul>
<p>To nie wszystkie ciekawe rzeczy związane ze SwingWorker-em, polecam zaglądnięcie do dokumentacji, jest to bardzo dobrze udokumentowana klasa.</p>
<p>A teraz kodzik prostego przykładu, pełny program można pobrać <a href="http://chomikuj.pl/bodzio277?fid=114944284">stąd</a>.</p>
<pre class="brush: java;">
button.addActionListener(new ActionListener(){
           public void actionPerformed(ActionEvent e) {
               SwingWorker&lt;Icon, Void&gt; worker = new SwingWorker&lt;Icon, Void&gt;(){

                    @Override
                    protected Icon doInBackground() throws Exception {
                        progressBar.setIndeterminate(true);
                        return loadImage(textField.getText());
                    }

                    @Override
                    protected void done() {
                        try {
                            imageLabel.setIcon(get());
                            progressBar.setIndeterminate(false);
                        } catch (Exception ex) {
                            ex.printStackTrace();
                        }
                    }

               };
               worker.execute();
           }
        });
</pre>
<p>Dla ułatwienia jak widać posłużyłem się klasą anonimową, tutaj ktoś może się zastanowić dlaczego za każdym razem tworzę nowy obiekt, a to dlatego, że nie ma możliwości powtórnego wykorzystania obiektu tego typu.<br />
I na tym kończę ten arcik, mam nadzieję że nie popełniłem żadnych byków i polecam wszystkim nie stosującym do tej pory, specjalnie przeznaczonego do wykonywania długich zadań SwingWorker-a.</p>
<p><code></p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/jadept.wordpress.com/19/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/jadept.wordpress.com/19/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/jadept.wordpress.com/19/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/jadept.wordpress.com/19/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/jadept.wordpress.com/19/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/jadept.wordpress.com/19/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/jadept.wordpress.com/19/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/jadept.wordpress.com/19/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/jadept.wordpress.com/19/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/jadept.wordpress.com/19/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=jadept.wordpress.com&blog=8023950&post=19&subd=jadept&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://jadept.wordpress.com/2009/06/05/swingworker-w-akcji/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/51ec225d70e56781b8bb5815da1c5087?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">java_adept</media:title>
		</media:content>
	</item>
		<item>
		<title>To już 20 lat&#8230;.</title>
		<link>http://jadept.wordpress.com/2009/06/04/to-juz-20-lat/</link>
		<comments>http://jadept.wordpress.com/2009/06/04/to-juz-20-lat/#comments</comments>
		<pubDate>Thu, 04 Jun 2009 21:23:21 +0000</pubDate>
		<dc:creator>java_adept</dc:creator>
				<category><![CDATA[Różności]]></category>
		<category><![CDATA[Polityka]]></category>
		<category><![CDATA[Wolność]]></category>

		<guid isPermaLink="false">http://jadept.wordpress.com/?p=12</guid>
		<description><![CDATA[Właśnie oglądam sobie koncert z Gdańska z okazji 20-lecia odzyskania wolności i nasuwają mi się pewne refleksję&#8230;.
Nie pamiętam tamtych czasów, dlatego może to nie jest dla mnie jakiś szczególny dzień, choć czuję że nie do końca, ale wiem, że nie mogę tak naprawdę docenić tego co się stało 20 lat temu bo nie pamiętam sytuacji [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=jadept.wordpress.com&blog=8023950&post=12&subd=jadept&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Właśnie oglądam sobie koncert z Gdańska z okazji 20-lecia odzyskania wolności i nasuwają mi się pewne refleksję&#8230;.</p>
<p>Nie pamiętam tamtych czasów, dlatego może to nie jest dla mnie jakiś szczególny dzień, choć czuję że nie do końca, ale wiem, że nie mogę tak naprawdę docenić tego co się stało 20 lat temu bo nie pamiętam sytuacji w tamtych czasach. Pewnie większość młodych nie czuje tego klimatu i nie docenia do końca tych zmian bo tak jak ja odkąd pamiętają już tak było, a jeśli już coś słychać to tylko narzekania. Super sytuacji raczej też nie mamy, ale to się ma, na co się zasługuje, tak już jest że 50 lat życia w syfie, odcisnęło ślad w mentalności przeciętnego Polaka. Kiedyś byliśmy narodem znanym z tolerancji, stawianym za wzór w Europie, inna sprawa że tolerancja teraz jest trochę mocno naciąganym pojęciem, a ludzie chcący być tak bardzo tolerowani czasem wykazują się właśnie skrajnym brakiem tolerancji. A jeśli tolerować, (nie twierdzę, że pochwalać czy coś) to i osoby z inną orientacją seksualną i także starsze babcie słuchające pewnej rozgłośni radiowej, to właśnie jest prawdziwa tolerancja według mnie, tolerowanie dwóch skrajności i tego co leży pomiędzy, a nie dzielenie ludzi na całkiem spoko i całkiem do dupy&#8230;..<br />
Choć te skrajne grupy są całkowicie nie tolerancyjne, wystarczy zobaczyć co działo się na konferencji pewnego polityka PiS-u, podczas wejście na sale posłanek przeciwnych partii politycznych.<br />
<br />
Ale trochę odszedłem od tematu, choć myślę, że tolerancja z tą rocznicą ma ścisły związek.<br />
<br />
Jedno co mnie boli w dzisiejszym dniu to ten ogromny podział jaki jest w naszym narodzie.<br />
Sam fakt rozbicia tych uroczystości na dwa miasta wielce o tym świadczy, to jak dwie Polski mamy?<br />
Czy po prostu jesteśmy aż tak zawistni i nie potrafimy nawet w ten szczególny dzień pogodzić się?<br />
Wiadomo że piłuje tu do polityków, po dzisiejszym dniu szczególnie PiS pokazał &#8220;klasę&#8221;, choć nie twierdzę, że PO jest super partią i przyszłością Polski, wina w tym co się dzisiaj stało leży raczej po obu stronach, sam stronie od polityki, a w wyborach do Europarlamentu raczej wstrzymam się od głosu&#8230;.Ale takie coś ciężko jest pozostawić bez komentarza, ta zawiść jest wszędzie czy to w sejmie, czy w pracy czy w szkolę&#8230;<br />
<br />
Za mało szacunku mamy do samych siebie&#8230;</p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/jadept.wordpress.com/12/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/jadept.wordpress.com/12/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/jadept.wordpress.com/12/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/jadept.wordpress.com/12/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/jadept.wordpress.com/12/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/jadept.wordpress.com/12/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/jadept.wordpress.com/12/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/jadept.wordpress.com/12/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/jadept.wordpress.com/12/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/jadept.wordpress.com/12/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=jadept.wordpress.com&blog=8023950&post=12&subd=jadept&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://jadept.wordpress.com/2009/06/04/to-juz-20-lat/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/51ec225d70e56781b8bb5815da1c5087?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">java_adept</media:title>
		</media:content>
	</item>
		<item>
		<title>Witam!</title>
		<link>http://jadept.wordpress.com/2009/06/03/hello-world/</link>
		<comments>http://jadept.wordpress.com/2009/06/03/hello-world/#comments</comments>
		<pubDate>Wed, 03 Jun 2009 20:38:22 +0000</pubDate>
		<dc:creator>java_adept</dc:creator>
				<category><![CDATA[Różności]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Nigdy nie lubiłem portali społecznościowych (no może kiedyś;), ale postanowiłem spróbować bloga.
Czemu?
Tu piszę co nie co o tym.
Czego można się spodziewać po tym blogu?
W związku z tym, że dotyczy programowania w Java, głównie SE, choć zacząłem też uczyć się JSP i servletów (Head First Servlets &#38; JSP &#8211; polecam) grom materiałów na tym blogu będzie [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=jadept.wordpress.com&blog=8023950&post=1&subd=jadept&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Nigdy nie lubiłem portali społecznościowych (no może kiedyś;), ale postanowiłem spróbować bloga.<br />
Czemu?</p>
<p><a href="/about">Tu</a> piszę co nie co o tym.</p>
<p>Czego można się spodziewać po tym blogu?</p>
<p>W związku z tym, że dotyczy programowania w <em>Java</em>, głównie SE, choć zacząłem też uczyć się JSP i servletów (<em>Head First Servlets &amp; JSP</em> &#8211; polecam) grom materiałów na tym blogu będzie właśnie o tym.<br />
Nie ma co tutaj szukać kodów super jakości, choć staram się, wiem że jeszcze muszę się wiele nauczyć. W sumie bez tej świadomości nie powstałby nigdy ten blog.</p>
<p>Aktualnie zajmuje się pewnym projektem (o szczegółach napiszę później), a że wykładowca obudził się z tematami dopiero w maju, zaliczenie całości przeniesie się na przyszły rok akademicki, pewnie w  najbliższym czasie głównie o tym będę tutaj pisał&#8230;.</p>
<p>A pozatym spodziewać się można wszystkiego co mi przyjdzie ciekawego do napisania&#8230;.</p>
<p>Co chcę osiągnąć dzięki temu blogowi?</p>
<p>Chciałbym żeby był kolejną opcją z której mogę czerpać wiedzę.<br />
Po prostu liczę, że ktoś kto zobaczy byki moim kodzeniu, będzie tak miły i dostarczy dobrą &#8220;zjebę&#8221;:)</p>
<p>To narazie wszystko,  eksperyment z blogowaniem uważam za rozpoczęty;)</p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/jadept.wordpress.com/1/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/jadept.wordpress.com/1/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/jadept.wordpress.com/1/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/jadept.wordpress.com/1/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/jadept.wordpress.com/1/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/jadept.wordpress.com/1/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/jadept.wordpress.com/1/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/jadept.wordpress.com/1/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/jadept.wordpress.com/1/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/jadept.wordpress.com/1/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=jadept.wordpress.com&blog=8023950&post=1&subd=jadept&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://jadept.wordpress.com/2009/06/03/hello-world/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/51ec225d70e56781b8bb5815da1c5087?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">java_adept</media:title>
		</media:content>
	</item>
	</channel>
</rss>