<?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/"
	>

<channel>
	<title>Xis' blog &#187; swing</title>
	<atom:link href="http://xis.schowek.net/tag/swing/feed/" rel="self" type="application/rss+xml" />
	<link>http://xis.schowek.net</link>
	<description>Mój wirtualny schowek</description>
	<lastBuildDate>Thu, 10 Mar 2011 18:41:20 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1</generator>
		<item>
		<title>Upiększanie JTable</title>
		<link>http://xis.schowek.net/2009/03/11/upiekszanie-jtable/</link>
		<comments>http://xis.schowek.net/2009/03/11/upiekszanie-jtable/#comments</comments>
		<pubDate>Wed, 11 Mar 2009 11:15:32 +0000</pubDate>
		<dc:creator>xis</dc:creator>
				<category><![CDATA[Programowanie]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[jtable]]></category>
		<category><![CDATA[swing]]></category>

		<guid isPermaLink="false">http://xis.schowek.net/?p=289</guid>
		<description><![CDATA[Przy okazji moich zabaw ze Swingiem &#8211; krótko o tym jak ulepszyć JTable. Mamy sobie JTable taką: A będziemy chcieli taką: Wzbogacimy więc naszą tabelkę o bardzo ładne oznaczenie numerów wierszy, oraz kolorowanie co drugiego rekordu. Zabieg pierwszy: kolorowanie co drugiego wiersza Aby używać warunkowego kolorowania wierszy, musimy wskazać naszej tabelce, by wykorzystała obiekt klasy [...]]]></description>
			<content:encoded><![CDATA[<p>Przy okazji moich zabaw ze Swingiem &#8211; krótko o tym jak ulepszyć <a href="http://java.sun.com/javase/6/docs/api/javax/swing/JTable.html">JTable</a>.</p>
<p>Mamy sobie JTable taką:</p>
<p><img class="aligncenter size-full wp-image-290" title="przed" src="http://xis.schowek.net/wp-content/uploads/2009/03/przed.png" alt="przed" width="491" height="308" /></p>
<p>A będziemy chcieli taką:</p>
<p><img class="aligncenter size-full wp-image-294" title="po1" src="http://xis.schowek.net/wp-content/uploads/2009/03/po1.png" alt="po1" width="554" height="393" /></p>
<p>Wzbogacimy więc naszą tabelkę o bardzo ładne oznaczenie numerów wierszy, oraz kolorowanie co drugiego rekordu.</p>
<p><strong>Zabieg pierwszy: kolorowanie co drugiego wiersza</strong></p>
<p>Aby używać warunkowego kolorowania wierszy, musimy wskazać naszej tabelce, by wykorzystała obiekt klasy pochodnej od <a href="http://java.sun.com/javase/6/docs/api/javax/swing/table/DefaultTableCellRenderer.html">DefaultTableCellRenderer</a>, np. takiej:</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">class</span> ColorCellRenderer <span style="color: #000000; font-weight: bold;">extends</span> <span style="color: #003399;">DefaultTableCellRenderer</span> <span style="color: #009900;">&#123;</span>
&nbsp;
    @Override
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #003399;">Component</span> getTableCellRendererComponent<span style="color: #009900;">&#40;</span> <span style="color: #003399;">JTable</span> table, <span style="color: #003399;">Object</span> val, <span style="color: #000066; font-weight: bold;">boolean</span> selected, <span style="color: #000066; font-weight: bold;">boolean</span> focused, <span style="color: #000066; font-weight: bold;">int</span> row, <span style="color: #000066; font-weight: bold;">int</span> col <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #003399;">Component</span> comp <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">super</span>.<span style="color: #006633;">getTableCellRendererComponent</span><span style="color: #009900;">&#40;</span> table, val, selected, focused, row, col <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #000000; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span> selected <span style="color: #339933;">==</span> <span style="color: #000066; font-weight: bold;">false</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
            <span style="color: #000000; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span> <span style="color: #009900;">&#40;</span> row <span style="color: #339933;">%</span> <span style="color: #cc66cc;">2</span> <span style="color: #009900;">&#41;</span> <span style="color: #339933;">==</span> <span style="color: #cc66cc;">1</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
                comp.<span style="color: #006633;">setBackground</span><span style="color: #009900;">&#40;</span> color <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            <span style="color: #009900;">&#125;</span>
            <span style="color: #000000; font-weight: bold;">else</span> <span style="color: #009900;">&#123;</span>
                comp.<span style="color: #006633;">setBackground</span><span style="color: #009900;">&#40;</span> <span style="color: #000066; font-weight: bold;">null</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            <span style="color: #009900;">&#125;</span>
        <span style="color: #009900;">&#125;</span>
        <span style="color: #000000; font-weight: bold;">return</span> comp<span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p><strong>Zabieg drugi: numeracja wierszy</strong></p>
<p>Na forum Suna znalazłem b. stary, ale nadal ciekawy <a href="http://forums.sun.com/thread.jspa?messageID=3746961#3746961">przykład rozwiązania tego problemu</a>. Budujemy klasę <strong>LineNumberTable</strong>, która dziedziczy po JTable:</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> LineNumberTable <span style="color: #000000; font-weight: bold;">extends</span> <span style="color: #003399;">JTable</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #003399;">JTable</span> mainTable<span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> LineNumberTable<span style="color: #009900;">&#40;</span> <span style="color: #003399;">JTable</span> table <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #000000; font-weight: bold;">super</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        mainTable <span style="color: #339933;">=</span> table<span style="color: #339933;">;</span>
        setAutoCreateColumnsFromModel<span style="color: #009900;">&#40;</span> <span style="color: #000066; font-weight: bold;">false</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        setModel<span style="color: #009900;">&#40;</span> mainTable.<span style="color: #006633;">getModel</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        setSelectionModel<span style="color: #009900;">&#40;</span> mainTable.<span style="color: #006633;">getSelectionModel</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        setAutoscrolls<span style="color: #009900;">&#40;</span> <span style="color: #000066; font-weight: bold;">false</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
        addColumn<span style="color: #009900;">&#40;</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">TableColumn</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        getColumnModel<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">getColumn</span><span style="color: #009900;">&#40;</span> <span style="color: #cc66cc;">0</span> <span style="color: #009900;">&#41;</span>.<span style="color: #006633;">setCellRenderer</span><span style="color: #009900;">&#40;</span> mainTable.<span style="color: #006633;">getTableHeader</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">getDefaultRenderer</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        getColumnModel<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">getColumn</span><span style="color: #009900;">&#40;</span> <span style="color: #cc66cc;">0</span> <span style="color: #009900;">&#41;</span>.<span style="color: #006633;">setPreferredWidth</span><span style="color: #009900;">&#40;</span> <span style="color: #cc66cc;">30</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        setPreferredScrollableViewportSize<span style="color: #009900;">&#40;</span> getPreferredSize<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    @Override
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">boolean</span> isCellEditable<span style="color: #009900;">&#40;</span> <span style="color: #000066; font-weight: bold;">int</span> row, <span style="color: #000066; font-weight: bold;">int</span> column <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #000000; font-weight: bold;">return</span> <span style="color: #000066; font-weight: bold;">false</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    @Override
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #003399;">Object</span> getValueAt<span style="color: #009900;">&#40;</span> <span style="color: #000066; font-weight: bold;">int</span> row, <span style="color: #000066; font-weight: bold;">int</span> column <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #000000; font-weight: bold;">return</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">Integer</span><span style="color: #009900;">&#40;</span> row <span style="color: #339933;">+</span> <span style="color: #cc66cc;">1</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    @Override
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">int</span> getRowHeight<span style="color: #009900;">&#40;</span> <span style="color: #000066; font-weight: bold;">int</span> row <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #000000; font-weight: bold;">return</span> mainTable.<span style="color: #006633;">getRowHeight</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>OK, teraz wystarczy wykorzystać utworzone klasy w naszej JTable:</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;">    <span style="color: #000000; font-weight: bold;">public</span> MyPanel<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        initComponents<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #666666; font-style: italic;">// wskazujemy nowy renderer, dla obiektów wszystkich typów naszej tabelki</span>
        jTable1.<span style="color: #006633;">setDefaultRenderer</span><span style="color: #009900;">&#40;</span> <span style="color: #003399;">Object</span>.<span style="color: #000000; font-weight: bold;">class</span>, <span style="color: #000000; font-weight: bold;">new</span> ColorCellRenderer<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #666666; font-style: italic;">// scrollPane, którym mamy osadzoną tabelę dekorujemy oznaczeniem numerów wierszy</span>
        jScrollPane1.<span style="color: #006633;">setRowHeaderView</span><span style="color: #009900;">&#40;</span> <span style="color: #000000; font-weight: bold;">new</span> LineNumberTable<span style="color: #009900;">&#40;</span> jTable1 <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span></pre></div></div>

<p>Gotowe. Prawda, że ładniej?</p>
]]></content:encoded>
			<wfw:commentRss>http://xis.schowek.net/2009/03/11/upiekszanie-jtable/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>NetBeans i ujednolicanie JDialog</title>
		<link>http://xis.schowek.net/2009/03/08/netbeans-i-ujednolicanie-jdialog/</link>
		<comments>http://xis.schowek.net/2009/03/08/netbeans-i-ujednolicanie-jdialog/#comments</comments>
		<pubDate>Sun, 08 Mar 2009 11:29:14 +0000</pubDate>
		<dc:creator>xis</dc:creator>
				<category><![CDATA[Programowanie]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[jdialog]]></category>
		<category><![CDATA[netbeans]]></category>
		<category><![CDATA[swing]]></category>

		<guid isPermaLink="false">http://xis.schowek.net/?p=242</guid>
		<description><![CDATA[Miałem niedawno okazję dłużej popracować nad projektami Javy w NetBeans 6.5 (wcześniej poważniej NetBeans używałem tylko do Grails). Środowisko to nie było dotychczas moim ulubionym, głównie ze względu na wydajność, co do której można mieć spore zastrzerzenia, jednak zauważyłem, że ma ono również mnóstwo zalet. Pierwszą jaką dostrzegłem jest to, że projekty generowane przez to [...]]]></description>
			<content:encoded><![CDATA[<p>Miałem niedawno okazję dłużej popracować nad projektami Javy w <a href="http://www.netbeans.org/">NetBeans 6.5</a> (wcześniej poważniej NetBeans używałem tylko do <a href="http://www.grails.org/">Grails</a>). Środowisko to nie było dotychczas moim ulubionym, głównie ze względu na wydajność, co do której można mieć spore zastrzerzenia, jednak zauważyłem, że ma ono również mnóstwo zalet. Pierwszą jaką dostrzegłem jest to, że projekty generowane przez to <em>IDE</em> są naprawdę ładnie utworzone, wykorzystują standardowe narzędzia Javy, takie jak np. <a href="http://www.ant.apache.org/">Ant</a> i nie uzależniają użytkownika od używania &#8222;jedynego i właściwego&#8221; IDE. NetBeans może zauroczyć również stopniem dopracowania swoich elementów &#8211; jak już coś wspiera, to wspiera naprawdę dobrze. Przykładem tu może być sposób, w jaki można za pomocą tego środowiska utworzyć i zarządzać aplkacjami wykorzystującymi <em>Web Services</em> w aplikacji &#8211; zarówno klientem, jak i usługą wykorzystującącymi <em>API</em> <a href="http://en.wikipedia.org/wiki/JAX-WS">JAX-WS</a>. Kolejny (lecz na pewno nie ostatni) plus należy się NetBeans za właściwie bezkonkurencyjny <em>edytor wizualny</em> aplikacji wykorzystujących <a href="http://pl.wikipedia.org/wiki/Swing_(Java)">Swing</a>.</p>
<p>I o Swingu właśnie będzie ten wpis (nieco przydługi, ostrzegam).</p>
<p>Nie do końca podoba mi się domyślna filozofia <em>okien dialogowych</em> w Javie. Np. rozmiar &#8211; niby można zmieniać rozmiar &#8222;świeżo&#8221; utworzonego okienka dialogowego rozciągając je, ale menadżery okien nie pozwalają na jego maksymalizację (brakuje bowiem przycisku maksymalizacji). Wiem, że takie jest założenie okienek dialogowych, ale wyczuwam tu pewną niekonsekwencję. Ponadto &#8222;goły&#8221; <a href="http://java.sun.com/javase/6/docs/api/javax/swing/JDialog.html">JDialog</a> jest praktycznie pozbawiony funkcjonalności, np. brakuje mu domyślnych zachowań takich jak potwierdzanie i anulowanie, reakcję na przycisk <em>Escape</em> i <em>Enter</em> &#8211; te braki sprawiają, że każda implementacja okienka dialogowego musi być poprzedzona żmudnym wykonywaniem tych banalnych czynności.</p>
<p>Postanowiłem więc wykonać coś na wzór <em>bazy</em> dla okna dialogowego, która to baza będzie wyposażona we wszystkie cechy, które wg mnie posiadać powinna każda implementacja JDialog. W takiej bazie będę umieszczał różne komponenty &#8211; w zależności od tego, jakiego dialogu potrzebuję.</p>
<p><img class="size-full wp-image-243" style="margin: 0; margin-left: -25px;" title="szkic" src="http://xis.schowek.net/wp-content/uploads/2009/03/szkic.png" alt="szkic" width="689" height="440" /></p>
<p>Chcę uzyskać bazę dla dialogu, w której będę umieszczał przeróżne panele &#8211; począwszy od prostych, informacyjnych (wtedy taki dialog przypominałby funkconalnością <a href="http://java.sun.com/javase/6/docs/api/javax/swing/JOptionPane.html">JOptionPane</a>), skończywszy na całkiem zaawansowanych funkcjonalnie formularzach edycji wykorzystujących panele, które przygotuję sobie osobno (dzięki temu będę mógł wykorzystać panele także w innych sytuacjach). Wszystkie jednak dialogi cechować się mają wspólnymi właściwościami: dialog można zatwierdzić (<em>submit</em>), albo odrzucić (<em>cancel</em>). Wciśnięcie <em>Escape</em> na aktywnym oknie powoduje jego zamknięcie (funkcjonalność identyczna do wciśnięcia przycisku <em>Anuluj</em>), a <em>Enter</em> &#8211; zatwierdzenie (kliknięcie <em>OK</em>).</p>
<p>W tym celu zbudowałem JDialog w NetBeans wybierając z menu projektu <strong>New</strong>-&gt;<strong>JDialog Form</strong> i nazwałem go <strong>DialogBase</strong>. W edytorze wizualnym umieściłem dwa przyciski (nazwałem je <strong>jBtnOK</strong> i <strong>jBtnCancel</strong>), oraz jeden <a href="http://java.sun.com/javase/6/docs/api/javax/swing/JPanel.html">JPane</a>l (<strong>jPanelMain</strong>), z ustawionym layoutem <a href="http://java.sun.com/javase/6/docs/api/java/awt/BorderLayout.html">BorderLayout</a> &#8211; w tym panelu będę umieszczał przeróżne panele &#8222;implementacyjne&#8221; &#8211; w zależności od przeznaczenia mojego dialogu.</p>
<p>Na początek, domyślny konstruktor i obsługa własności <strong>panel</strong> (czyli obiekt panelu, który umieszczamy w oknie):</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;">    <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #003399;">JPanel</span> panel<span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> DialogBase<span style="color: #009900;">&#40;</span><span style="color: #003399;">JPanel</span> panel<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #000000; font-weight: bold;">this</span><span style="color: #009900;">&#40;</span> <span style="color: #000066; font-weight: bold;">null</span>, <span style="color: #000066; font-weight: bold;">true</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        setLocationRelativeTo<span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">null</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        setPanel<span style="color: #009900;">&#40;</span>panel<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">protected</span> <span style="color: #000066; font-weight: bold;">void</span> setPanel<span style="color: #009900;">&#40;</span><span style="color: #003399;">JPanel</span> panel<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">panel</span> <span style="color: #339933;">=</span> panel<span style="color: #339933;">;</span>
        jPanelMain.<span style="color: #006633;">removeAll</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        jPanelMain.<span style="color: #006633;">add</span><span style="color: #009900;">&#40;</span> panel, <span style="color: #003399;">BorderLayout</span>.<span style="color: #006633;">CENTER</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        panel.<span style="color: #006633;">setVisible</span><span style="color: #009900;">&#40;</span> <span style="color: #000066; font-weight: bold;">true</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #003399;">Dimension</span> d <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">Dimension</span><span style="color: #009900;">&#40;</span>panel.<span style="color: #006633;">getPreferredSize</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">setSize</span><span style="color: #009900;">&#40;</span> d.<span style="color: #006633;">width</span>, d.<span style="color: #006633;">height</span><span style="color: #339933;">+</span><span style="color: #cc66cc;">70</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">protected</span> <span style="color: #003399;">JPanel</span> getPanel<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #000000; font-weight: bold;">return</span> panel<span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span></pre></div></div>

<p>Metoda <strong>setPanel()</strong> ustawia własność <strong>panel</strong> oraz zajmuje się osadzeniem go w oknie dialogu i ustawieniem odpowiedniego rozmiaru okna (wysokość zwiększam o wielkość przycisków na dole okna).</p>
<p>Aby wiedzieć w jaki sposób moje okno dialogowe zostało zamknięte, wyposażam je we własność <strong>exitStatus</strong>:</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;">    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #000000; font-weight: bold;">final</span> <span style="color: #000066; font-weight: bold;">int</span> DLG_EXIT_CANCEL <span style="color: #339933;">=</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span>
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #000000; font-weight: bold;">final</span> <span style="color: #000066; font-weight: bold;">int</span> DLG_EXIT_OK <span style="color: #339933;">=</span> <span style="color: #cc66cc;">1</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000066; font-weight: bold;">int</span> exitStatus <span style="color: #339933;">=</span> DLG_EXIT_CANCEL<span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #666666; font-style: italic;">// getter i setter</span></pre></div></div>

<p>Domyślne zamknięcie okna poskutkuje zapamiętaniem statusu &#8222;Cancel&#8221;.</p>
<p>Czas na obsługę klawisza <em>Escape</em> i <em>Enter</em>. Posiłkując się <a href="http://www.javaworld.com/javaworld/javatips/jw-javatip72.html?page=1">ciekawym na ten temat artykułem</a>, wzbogaciłem mój <strong>DialogBase</strong> o następujący kod:</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;">    @Override
    <span style="color: #000000; font-weight: bold;">protected</span> <span style="color: #003399;">JRootPane</span> createRootPane<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #003399;">JRootPane</span> theRootPane <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">JRootPane</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #003399;">KeyStroke</span> escStroke <span style="color: #339933;">=</span> <span style="color: #003399;">KeyStroke</span>.<span style="color: #006633;">getKeyStroke</span><span style="color: #009900;">&#40;</span> <span style="color: #003399;">KeyEvent</span>.<span style="color: #006633;">VK_ESCAPE</span>, <span style="color: #cc66cc;">0</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        theRootPane.<span style="color: #006633;">registerKeyboardAction</span><span style="color: #009900;">&#40;</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">ActionListener</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
            <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> actionPerformed<span style="color: #009900;">&#40;</span> <span style="color: #003399;">ActionEvent</span> actionEvent <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
                doCancel<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            <span style="color: #009900;">&#125;</span>
        <span style="color: #009900;">&#125;</span>, escStroke, <span style="color: #003399;">JComponent</span>.<span style="color: #006633;">WHEN_IN_FOCUSED_WINDOW</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #003399;">KeyStroke</span> entStroke <span style="color: #339933;">=</span> <span style="color: #003399;">KeyStroke</span>.<span style="color: #006633;">getKeyStroke</span><span style="color: #009900;">&#40;</span> <span style="color: #003399;">KeyEvent</span>.<span style="color: #006633;">VK_ENTER</span>, <span style="color: #cc66cc;">0</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        theRootPane.<span style="color: #006633;">registerKeyboardAction</span><span style="color: #009900;">&#40;</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">ActionListener</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
            <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> actionPerformed<span style="color: #009900;">&#40;</span> <span style="color: #003399;">ActionEvent</span> actionEvent <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
                doSubmit<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            <span style="color: #009900;">&#125;</span>
        <span style="color: #009900;">&#125;</span>, entStroke, <span style="color: #003399;">JComponent</span>.<span style="color: #006633;">WHEN_IN_FOCUSED_WINDOW</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #000000; font-weight: bold;">return</span> theRootPane<span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span></pre></div></div>

<p>Jak widzisz, wykorzystuję tu tajemnicze metody <strong>doSubmit()</strong> i <strong>doCancel()</strong>. Co to za metody?</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;">    <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000066; font-weight: bold;">void</span> doSubmit<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #000000; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span> onSubmit<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
            setExitStatus<span style="color: #009900;">&#40;</span> DLG_EXIT_OK <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            dispose<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000066; font-weight: bold;">void</span> doCancel<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #000000; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span> onCancel<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
            setExitStatus<span style="color: #009900;">&#40;</span> DLG_EXIT_CANCEL <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            dispose<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">protected</span> <span style="color: #000066; font-weight: bold;">boolean</span> onSubmit<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #000000; font-weight: bold;">return</span> <span style="color: #000066; font-weight: bold;">true</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">protected</span> <span style="color: #000066; font-weight: bold;">boolean</span> onCancel<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #000000; font-weight: bold;">return</span> <span style="color: #000066; font-weight: bold;">true</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span></pre></div></div>

<p>Obie metody działają dość podobnie: jeśli metoda <strong>onSubmit()</strong> (lub analogicznie <strong>onCancel()</strong>) zwróci <strong>true</strong>, ustawiamy odpowiedni <strong>exitStatus</strong> i zamykamy okno. Zarówno <strong>doSubmit()</strong> jak i <strong>doCancel()</strong> wiążę też za pomocą zdarzenia <a href="http://java.sun.com/javase/6/docs/api/java/awt/event/ActionEvent.html">ActionEvent</a> z przyciskami (wystarczy dwukrotnie kliknąć na przycisku w edytorze wizualnym i wyedytować wygenerowaną przez NetBeans pustą metodę):</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;">    <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000066; font-weight: bold;">void</span> jBtnCancelActionPerformed<span style="color: #009900;">&#40;</span>java.<span style="color: #006633;">awt</span>.<span style="color: #006633;">event</span>.<span style="color: #003399;">ActionEvent</span> evt<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        doCancel<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000066; font-weight: bold;">void</span> jBtnOKActionPerformed<span style="color: #009900;">&#40;</span>java.<span style="color: #006633;">awt</span>.<span style="color: #006633;">event</span>.<span style="color: #003399;">ActionEvent</span> evt<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        doSubmit<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span></pre></div></div>

<p>OK, ale po co nam te trywialne metody <strong>onSubmit()</strong> i <strong>onCancel()</strong>? Wykorzystamy je np. do walidacji w przyszłych implementacjach naszych okien dialogowych (jeśli zdecydujemy się na ich przesłonięcie, jeśli nie &#8211; niczego złego nie zrobią ;) ).</p>
<p>Wygląda na to, że nasza baza jest gotowa. Użyjmy jej więc na jakimś przykładzie &#8211; np. formularzu logowania.</p>
<p>W NetBeans, tworzymy nowy <strong>JPanel Form</strong>, nazywamy go <strong>PanelLogin</strong> i dodajemy odpowiednie elementy interfejsu użytkownika (jak na załączonym wyżej szkicu), oczywiście to ten panel będziemy osadzać w bazie dialogu, więc nie dodajemy już przycisków <em>OK</em> i <em>Anuluj</em>, bo nie musimy. Element <a href="http://java.sun.com/javase/6/docs/api/javax/swing/JTextField.html">JTextField</a>, zawierający nazwę użytkownika nazywamy <strong>jTxtUsername</strong>, a <a href="http://java.sun.com/javase/6/docs/api/javax/swing/JPasswordField.html">JPasswordField</a> (z hasłem) &#8211; <strong>jTxtPassword</strong>.<br />
Dodajemy dwie publiczne metody do pobrania wprowadzonych nazwy użytkownika i hasła:</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;">    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #003399;">String</span> getUsername<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #000000; font-weight: bold;">return</span> jTxtUsername.<span style="color: #006633;">getText</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #003399;">String</span> getPassword<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #000000; font-weight: bold;">return</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">String</span><span style="color: #009900;">&#40;</span>jTxtPassword.<span style="color: #006633;">getPassword</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span></pre></div></div>

<p>A teraz nasz dialog logowania.<br />
W NetBeans tworzę nową <span style="text-decoration: underline;">klasę Javy</span> (<strong>New</strong>-&gt;<strong>Java Class</strong>), a nie dialog(!) i nazywam ją <strong>DialogLogin</strong>. Nasza nowa klasa musi dziedziczyć po <strong>DialogBase</strong>. Ponadto, nasz dialog powinien zwracać obiekt użytkownika (jakiejś klasy np. <strong>User</strong>, której szczegóły nie są tu istotne) jeśli logowanie się powiedzie. W tym celu powołujemy własność <strong>returnValue</strong> (wraz z getterem i setterem). Przy okazji dodaję też licznik prób logowania &#8211; proste umożliwienie trzykrotnej pomyłki przy logowaniu.</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> DialogLogin <span style="color: #000000; font-weight: bold;">extends</span> DialogBase <span style="color: #009900;">&#123;</span>
    <span style="color: #000000; font-weight: bold;">private</span> User returnValue<span style="color: #339933;">;</span>
    <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000066; font-weight: bold;">int</span> tries <span style="color: #339933;">=</span> <span style="color: #cc66cc;">3</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> DialogLogin<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #000000; font-weight: bold;">super</span><span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">new</span> PanelLogin<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Czas na obsługę logiki biznesowej naszego dialogu. Anulowanie dialogu zostawiamy bez zmian &#8211; po prostu zamykamy okno. Jednak musimy zaimplementować obsługę zatwierdzania formularza. W tym celu przesłaniamy naszą metodę <strong>onSubmit()</strong>:</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;">    @Override
    <span style="color: #000000; font-weight: bold;">protected</span> <span style="color: #000066; font-weight: bold;">boolean</span> onSubmit<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        PanelLogin thePanel <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span> PanelLogin <span style="color: #009900;">&#41;</span> <span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">getPanel</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
        User u <span style="color: #339933;">=</span> App.<span style="color: #006633;">login</span><span style="color: #009900;">&#40;</span> thePanel.<span style="color: #006633;">getUsername</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>, thePanel.<span style="color: #006633;">getPassword</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #000000; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span> u <span style="color: #339933;">==</span> <span style="color: #000066; font-weight: bold;">null</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
            <span style="color: #003399;">JOptionPane</span>.<span style="color: #006633;">showMessageDialog</span><span style="color: #009900;">&#40;</span> <span style="color: #000000; font-weight: bold;">this</span>, <span style="color: #0000ff;">&quot;Nie udało się zalogować&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            <span style="color: #000000; font-weight: bold;">return</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">--</span>tries<span style="color: #339933;">&lt;=</span><span style="color: #cc66cc;">0</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
&nbsp;
        returnValue <span style="color: #339933;">=</span> u<span style="color: #339933;">;</span>
        <span style="color: #000000; font-weight: bold;">return</span> <span style="color: #000066; font-weight: bold;">true</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span></pre></div></div>

<p>Jeśli <strong>App.login()</strong> (przyjmijmy, że ta metoda odpowiada za autoryzację aplikacji) zwróci <strong>null</strong>, to znaczy, ze nie zalogowaliśmy się do aplikacji &#8211; dialog nie zamknie się, ale pokaże nam info o nieprawidłowych parametrach logowania (i tak do momentu aż wartość <strong>tries</strong> osiągnie wartość mniejszą lub równą zeru). Jeśli użytkownik jest prawidłowy, dialog zamknie się ustawiwszy uprzednio własność <strong>returnValue</strong>.</p>
<p>Powinno działać. Sprawdźmy:</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;">    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #000066; font-weight: bold;">void</span> main<span style="color: #009900;">&#40;</span><span style="color: #003399;">String</span><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> args<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #000000; font-weight: bold;">try</span> <span style="color: #009900;">&#123;</span>
            <span style="color: #003399;">UIManager</span>.<span style="color: #006633;">setLookAndFeel</span><span style="color: #009900;">&#40;</span> <span style="color: #003399;">UIManager</span>.<span style="color: #006633;">getSystemLookAndFeelClassName</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
        <span style="color: #000000; font-weight: bold;">catch</span><span style="color: #009900;">&#40;</span> <span style="color: #003399;">Exception</span> ex <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><span style="color: #009900;">&#125;</span>
&nbsp;
        DlgLogin dlg <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> DlgLogin<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        dlg.<span style="color: #006633;">setVisible</span><span style="color: #009900;">&#40;</span> <span style="color: #000066; font-weight: bold;">true</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #003399;">System</span>.<span style="color: #006633;">err</span>.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Logowanie zakończone: &quot;</span><span style="color: #339933;">+</span>dlg.<span style="color: #006633;">getExitStatus</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #000000; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span> dlg.<span style="color: #006633;">getExitStatus</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">==</span> DialogBase.<span style="color: #006633;">DLG_EXIT_OK</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
            <span style="color: #000000; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span> dlg.<span style="color: #006633;">getReturnValue</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">!=</span> <span style="color: #000066; font-weight: bold;">null</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
                <span style="color: #003399;">System</span>.<span style="color: #006633;">err</span>.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;W porządku, użytkownik prawidłowy&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            <span style="color: #009900;">&#125;</span>
            <span style="color: #000000; font-weight: bold;">else</span> <span style="color: #009900;">&#123;</span>
                <span style="color: #003399;">System</span>.<span style="color: #006633;">err</span>.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Brak dostępu!&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            <span style="color: #009900;">&#125;</span>
        <span style="color: #009900;">&#125;</span>
        <span style="color: #000000; font-weight: bold;">else</span> <span style="color: #009900;">&#123;</span>
            <span style="color: #003399;">System</span>.<span style="color: #006633;">err</span>.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Anulowano!&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
    <span style="color: #009900;">&#125;</span></pre></div></div>

<p>Voila!</p>
<p><em>We wpisie użyłem ikon <a href="http://kde-look.org/content/show.php/Free+Business+Icons?content=77050  ">Free Business Icons</a> opublikowanych na licencji <a href="http://creativecommons.org/licenses/by/3.0/deed.pl  ">Creative Commons</a> oraz <a href="http://www.famfamfam.com/lab/icons/silk/">Silk</a> na licencji <a href="http://www.gnu.org/licenses/lgpl-3.0-standalone.html">LGPL</a>.</em></p>
]]></content:encoded>
			<wfw:commentRss>http://xis.schowek.net/2009/03/08/netbeans-i-ujednolicanie-jdialog/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
	</channel>
</rss>

