Dadajax’s weblog

blog o technice, počítačích, programování a fotografování
12. 11. 2008 , 21:15

Java - vytvoření Swing menu z XML souboru

Kategorie: Programování // přidat komentář » 66 shlédnutí

Swing menu builder

Téměř každá aplikace, která má GUI, obsahuje také nějaké to menu. Vytvořit takové menu není nic těžkého. Pokud ale vyvíjíte aplikaci, u které ještě zdaleka není jisté, jak bude výsledné menu vypadat, je docela dobrý nápad toto menu tvořit dynamicky - za pomocí nějakých metadat. V tomto článku vám ukážu jedno z možných řešení - vytvoření Swingovského menu, které bude definováno v XML souboru (jak jinak u mně ;) ). Pojdmě na to.

Nejdříve si ujasníme, co vlastně budeme dělat. Vytvoříme si XML soubor, který bude obsahovat něco takového:


<menubar>
  <menu name="file">
    <item name="new">
      <command name="new"/>
    </item>
    <item name="save">
      <command name="save"/>
    </item>
    <item name="load">
      <command name="load"/>
    </item>
  </menu>
  <menu name="edit">
    <item name="copy">
      <command name="copy"/>
    </item>
    <item name="cut">
      <command name="cut"/>
    </item>
    <item name="paste">
      <command name="paste"/>
    </item>
  </menu>
</menubar>

Jak vidíte, struktura tohoto souboru je velmi jednoduchá. Pro zjednodušení budeme počítat pouze s jednou úrovní menu. To znamená, že nebudeme brát v potaz možnost, že některá položka v menu obsahuje další podmenu.

Nejdříve si vytvoříme základní třídu pro zpracovávaní XML souborů. Její hlavní funkce je parsování souboru a vrácení dokumentu. Ke zpracování XML používám nejraději DOM, který je pro tyto malé soubory ideální. Celý obsah souboru načte do paměti (včetně struktury) a vy se v něm pak můžete bez problému pohybovat jako v klasickém stromu.

Třída XmlBase bude vypadat takto:


import java.io.File;
import java.io.IOException;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;

import org.w3c.dom.DOMImplementation;
import org.w3c.dom.Document;
import org.xml.sax.SAXException;

public abstract class XmlBase {
	private Document document;
	private DocumentBuilderFactory dbf;
	private DocumentBuilder builder;
	DOMImplementation domImplementation;
	private String rootElement;

	public XmlBase(String fileName, String rootElement) {
		this.rootElement = rootElement;
		dbf = DocumentBuilderFactory.newInstance();
		try {
			builder = dbf.newDocumentBuilder();
		} catch (ParserConfigurationException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		domImplementation = builder.getDOMImplementation();

		File xmlFile = new File(fileName);
		if (xmlFile.exists()) {
			try {
				document = builder.parse(xmlFile);
			} catch (SAXException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		} else {
			document = createDocument();
		}
	}

	protected Document createDocument() {
		Document tempDoc = domImplementation.createDocument(null, rootElement, null);
		tempDoc.createElement(rootElement);
		return tempDoc;
	}

	protected Document getDocument() {
		return document;
	}

}

Tato třída obstará získání objektu typu Document, se kterým budeme poté pracovat. Pro převedení XML elementů na jednotlivé položky menu vytvoříme třídu XmlMenuBuilder, která rozšíří třídu XmlBase. Tato třída už konečně bude mít na starosti vytváření menu. Třída bude definována takto:


import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;

import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

public class XmlMenuBuilder extends XmlBase {

	private static final String ROOT_ELEMENT = "menubar";

	protected Document document;

	public XmlMenuBuilder(String fileName) {
		super(fileName, ROOT_ELEMENT);
		document = super.getDocument();
	}

	public JMenuBar getMenuBar() {
		document = super.getDocument();
		JMenuBar menuBar = new JMenuBar();
		NodeList menus = document.getElementsByTagName("menu");
		for (int i = 0; i < menus.getLength(); i++) {
			JMenu menu = new JMenu(getName(menus.item(i)));
			NodeList menuItems = menus.item(i).getChildNodes();
			for (int ii = 0; ii < menuItems.getLength(); ii++) {
				if (menuItems.item(ii).getNodeName().equals("item")) {
					JMenuItem item = new JMenuItem(getName(menuItems.item(ii)));
					item.setActionCommand(getMenuItemCommand(menuItems.item(ii)));
					menu.add(item);
				}
			}
			menuBar.add(menu);
		}
		assert(menuBar != null);
		return menuBar;
	}

	private String getName(Node node) {
		return node.getAttributes().getNamedItem("name").getNodeValue();
	}

	private String getMenuItemCommand(Node node) {
		NodeList nl = node.getChildNodes();
		for (int i = 0; i < nl.getLength(); i++) {
			if (nl.item(i).getNodeName().equals("command")) {
				String command = nl.item(i).getAttributes().getNamedItem("name").getNodeValue();
				if (!command.equals(""))
					return command;
			}
		}
		return "";
	}
}

Tak a to je celé. Vytvořený kód můžeme otestovat touto testovací třídou:


import javax.swing.JFrame;
import javax.swing.JMenuBar;

public class SwingMenuBuilderExample {

	public static void main(String[] args) {
		JFrame mainFrame = new JFrame("Menu builder example");
		XmlMenuBuilder menuBuilder = new XmlMenuBuilder("menu.xml");
		JMenuBar menuBar = menuBuilder.getMenuBar();
		mainFrame.setJMenuBar(menuBar);

		mainFrame.setSize(640, 480);
		mainFrame.setVisible(true);
	}

}

Proč používat XML?

Pokud jste dočetli až sem, možná se divíte, proč to dělat tak složitě, když stačilo menu vytvořit někde přímo v kódu. Jasně, určitě by to bylo rychlejší, ale v momentě, kdy byste potřebovali menu upravit, museli byste hrabat v kódu(což přináší nebezpečí zanesení nových chyb) a všechno znovu kompilovat. Při vytváření menu z XML souboru (nebo jakého koliv jiného textového souboru) vám tyto starosti odpadají. Předělání menu bude poté otázkou okamžiku a riziko zanesení chyb bude malé.

Nakonec bych ještě dodal, že přiložené kusy kódu nejsou úplně dokonalé. Určitě bych doporučil místo přímého používání XmlMenuBuilder třídy používat nějaké rozhraní (vždy programujte proti rozhraní!), které bude XmlMenuBuilder implementovat. Díky tomu pak můžete vyměnit lehce způsob, jakým bude menu vytvořeno. Pokud v kódu najdete nějakou chybu, dejte mi prosím vědět v komentářích. Tento kód jsem sice otestoval, ale je možné, že mi nějaká chybka unikla. Nakonec přikládám zabalený Eclipse projekt, který můžete jednoduše v Eclipsu naimportovat. Projekt stahujte ZDE.

25. 10. 2008 , 11:18

Kniha Java 5.0 – Novinky jazyka a upgrade aplikací zdarma ke stažení

Kategorie: Programování // přidat komentář » 97 shlédnutí

Pokud se zajímáte o programování v Javě, mohla by vás tato kniha zajímat. Kniha je sice již staršího data, nicméně si myslím, že i přesto může být užitečná. Java ve verzi 5 přišla se spoustou novinek a je dobré o nich vědět. Kniha byla uvolněna ke stažení zdarma, protože už se doprodala.

Tuto knihu jsem ještě nečetl, nicméně autor Rudolf Pecinovský je zárukou kvalitního obsahu, takže pokud vás toto téma zajímá, doporučuju si knihu přečíst.

Odkaz na stažení knihy najdete na http://knihy.pecinovsky.cz/java5novinky/

15. 10. 2008 , 17:47

Nová fotogalerie

Kategorie: Fotografování, Programování // 7 komentářů » 157 shlédnutí

Tak a je to tu zase. Překopal jsem celou fotogalerii. Nejdříve jsem myslel, že NextGEN gallery (plugin do wordpressu) mi bude vyhovovat, ale po několika měsících jsem přišel na to, že to byl omyl. Mnoha lidem tato galerie (a další ji podobné) určitě vyhovuje, ale na mě byl proces vkládání obrázků moc složitý. Když jsem chtěl vložit fotku do galerie, musel jsem ji v editoru upravit (zmenšit, přidat rámeček), otevřít administraci wordpressu a novou fotku tam vložit do určité galerie. To je pro mě prostě moc složité a vedlo to k tomu, že v galerii nepřibývaly žádné nové fotky.

Rozhodl jsem se, že to chce změnu. Využil jsem teď volného času (měl jsem několik dní nemocenskou) a začal jsem vymýšlet novou galerii. Nová galerie měla být jednoduše spravovatelná a taky by měla být co nejvíce zautomatizovaná. Hned jsem se chytl příležitosti a začal jsem se učit Python (celkem mě štvalo, že neumím žádný skriptovací jazyk). Po třech dnech učení vznikl jednoduchý skript, který za mě udělá téměř všechnu práci s galerií. Pro inspiraci popíšu, jak to teď funguje:

  • V XML souboru mám v přehledné struktuře uloženy fotky rozdělené do alb. Každé album má své jméno a může obsahovat fotky. Každá fotka obsahuje název fotky a datum pořízení (pro kontrolu, jestli se jedná opravdu o požadovanou fotku). Já pracuju pouze s tímto souborem a galerii tvořím pomocí tohoto XML souboru.
  • Skript tento soubor zpracuje a začne jednotlivé fotky vyhledávat ve vybraném adresáři (v adresáři, kde mám uloženy všechny fotky)
  • Až fotku nalezne, použije na ni některé úpravy (aktuálně pouze zmenšení a přidání rámečku)
  • Upravenou fotku uloží(s vybranou kvalitou) do dočasného adresáře na disku
  • Až jsou všechny fotky zpracované, začne je posílat na FTP server

To je vše. O zobrazení fotek se poté stará Minishowcase gallerie, která zobrazuje fotky přímo z daného umístění na FTP. To znamená, že webová galerie je pouze nástroj na zobrazení mých fotek. Pokud budu chtít použít pro zobrazení galerie něco jiného, stačí najít už fungující aplikaci, která bude zobrazovat fotky z daného umístění.

Krása toho všeho je ta automatizace. Pokaždé, když budu měnit galerii (její strukturu, nebo fotky v ni umístěné), stačí upravit jeden soubor a spustit skript. Navíc mám fotky uložené pouze jako originály (plus to co mám vygenerované na webu), takže když provedu změny na původních fotkách, změny se poté projeví i v galerii na webu.

Zní to jednoduše, zní to krásně a hlavně to funguje. Bohužel je to jen narychlo splácaný kus kódu, takže to není určene pro veřejnost. Tohle řešení mě ale dost zaujalo, proto jsem si přidal do seznamů plánovaných projektů i tento generátor galerie. Chce to ale kompletně překopat, přidat tomu nějaké to GUI a umožnit jednoduchou konfiguraci. Ještě by to chtělo umět PHP(teda ne že by to byl problém, ale do webového vývoje se mi moc nechce) a mohl bych k tomu dodělat i nějaký ten zobrazovač galerie. No uvidíme, třeba z toho vznikne nějaké komplexní řešení :)

13. 9. 2008 , 15:19

Originální nabídka práce

Kategorie: Programování, Ze života // 2 komentářů » 180 shlédnutí

Pokud jste někdy procházeli nabídky práce, určitě jste si všimli určitého stereotypu a nudnosti jednotlivých nabídek. Teď jsem ale našel opravdu originální nabídku na pozici java developera. No posuďte sami:

public class Life {

       ....

       public boolean roadToHappiness(ExceptionalDeveloper you)
       {

             if( you.love("Java") && you.love("Challenges") && you.want("Success"))
             {
                   Job dreamJob = applyToZeebra(you.getCV());
                   you.setJob(dreamJob);
             }

             return you.isHappy();

       }

       private Job applyToZeebra(CV yourCV)
       {
             Job newDreamJob = sendEmail("joao@zeebra.cz",yourCV);
             return newDreamJob;
       }

       ....
}

Převzato ze stránky zeebra.cz
7. 9. 2008 , 10:05

Eclipse mě neustále překvapuje

Kategorie: Programování // 4 komentářů » 214 shlédnutí

Právě jsem zjistil, že si Eclipse poradí lehce i s otevíráním dokumentů vytvořených v Microsoft Wordu. Krásně a jednoduše a rychle tak můžete editovat tyto .doc(x) soubory přímo z Eclipsu, aniž byste museli přepínat mezi dalšími okny. Maličkost, ale potěší.

EclipseWord

Easy Localization - jednoduchý nástroj pro lokalizaci vaších Java projektů

Kategorie: Programování // 2 komentářů » 158 shlédnutí

Pokud vyvýjíte nějakou aplikaci, určitě jste se setkali s problémem lokalizace textů do několika jazyků. Ono to v podstatě není ani problém, spíše taková otrava :) Proto jsem vytvořil jednoduchou třídu LanguageManager, která poslouží k vytvoření jazykově nezávislé aplikace. Informace o překladech se ukládají do jediného XML souboru. Pro jednodušší vytváření lokalizací jsem vytvořil navíc jednoduchý nástroj LanguageEditor, který dokáže tyto XML soubory vytvářet a upravovat. Pro více informací navštivte domovskou stránku projektu

http://projects.dadajax.net/projects/easy-localization/ nebo http://sourceforge.net/projects/easyloc/. Na sourceforge.net jsou umístěny zdrojové soubory, takže se jimi můžete inspirovat. Projekt byl vypuštěn pod BSD licencí.

Tento projekt zaujme jen některé Java programátory. Můj další projekt (který začnu dnes navrhovat) bude už ale použitelný pro Větší okruh lidí. Zatím nebudu prozrazovat detaily, ale pokud se nesetkám s neřešitelným problémem, tak z mého příštího projektu budou mít radost především lidé, co často používají rapidshare ;)

6. 8. 2008 , 8:00

Jak se stát dobrým programátorem

Kategorie: Programování // 11 komentářů » 412 shlédnutí

Máte pocit, že pořád nemáte to něco, co by z vás dělalo dobrého programátora? Během programování musíte neustále zjišťovat všechny informace z knih nebo internetu a práce vám jde strašně pomalu? Tohle určitě zažil každý začínající programátor. Existuje jednoduchá cesta jak z toho ven. Jak udělat z “opisovače tutoriálu” mistra v oboru.

FOTO0170 Ta zázračná rada je vlastně velmi jednoduchá. Programujte! Tím teď nemyslím jednoduché aplikace, které se často objevují v tutoriálech. Mám na mysli kompletní aplikace, které budou mít nějaký účel a budou něčemu sloužit. Mnozí z vás si řeknou, že se mi to lehce řekne. Vždyť takový začátečník neví co by mohl naprogramovat (v rámci svých schopností) a nebo se bojí, že by to naprogramoval špatně. Ale já to znám moc dobře, ještě nedávno jsem taky takový začátečník byl.

Jak z toho tedy ven? Nejdříve bych zmínil tu možnost, kdy se programátor snaží vymyslet nějaký program, který by mohl začít vytvářet, ale nic ho nenapadá. Ono je to někdy těžké, když je někdo začátečník, tak si nedokáže představit, co vše potřebuje k vytvoření té či oné aplikace. Většina nápadů tedy končí v koši s nálepkou “nedokážu udělat”. Časem se to bude zlepšovat, ale ze začátku přemýšlejte nad něčím jednodušším, co zvládnete dokončit. Nápady hledejte všude - v rodině, mezi kamarády nebo se zamyslete nad svými potřebami.

Horší je druhá varianta. Programátor ví co chce udělat, ale neví jak začít. Vždy když začne tak brzo skončí a začne odznova. Proč? Protože si uvědomí, že jeho řešení nebylo nejlepší, že bylo špatné. Nemějte proto tyhle předsudky. Pravda je ale taková, že nic z toho co v začátcích uděláte nebude dobře. Vždy bude existovat lepší řešení a kdybyste ho neustále hledali, program by nikdy nevznikl. Chybama se člověk učí, tím se řiďte. Dělejte chyby, dělejte spoustu chyb. Z každé chyby si ale musíte vzít ponaučení. Uděláte sice chybový program (malá poznámka: žádný program není bez chyby), ale uděláte ho. Ne jako někteří, kteří se budou patlat s tutoriály a budou umět napsat “perfektní” řadící algoritmus.

Read it all..

20. 5. 2008 , 8:00

Je java vhodná pro desktop?

Kategorie: Programování // 7 komentářů » 503 shlédnutí

javalogo Java se stala velmi oblíbeným jazykem. Je plně postavena na principech objektově orientovaného programování a svou jednoduchostí si získala srdce nejednoho developera. Objevuje se v mobilních zařízeních, na webových stránkách, v různých podnikových aplikacích a tak podobně. Jak je to ale s jejím uplatněním na desktopech?

Read it all..

19. 5. 2008 , 18:12

Na čem zrovna dělám

Kategorie: Programování, Ze života // 7 komentářů » 277 shlédnutí

Momentálně se snažím využít svůj čas na maximum. Začínám na sobě více pracovat a pokouším se využívat veškerý volný čas k užitečným věcem. To můžete taky vidět větší intenzitou článků zde na blogu. Krom toho jsem se taky rozhodl (teprve včera večer), že začnu zase pracovat na hře.

Detaily o hře zatím neprozradím, protože ještě nejsou vymyšlené. Co ale můžu říct? Hra bude pravděpodobně vyvíjená v javě (o které vyjde zítra článek). Tímto článkem se Vás chci zeptat, co všechno by vás zajímalo z hlediska vývoje her? Rád bych se o získané zkušenosti taky podělil, proto pokud Vás vývoj her nějak zajímá, uveďte prosím v komentářích co byste se rádi dozvěděli.

Kromě samotného vývoje her se budu snažit sepsat nějaké zkušenosti s věcmi okolo vývoje. Od návrhu projektu, jeho realizace, jeho správy a podobně. Budu se snažit popisovat různé nástroje pro ulehčení vývoje a možné chyby, kterým je dobré se vyvarovat. Hra bude s velkou pravděpodobností vyvíjená jako opensource, takže může být zajímavá nejen pro hráče, ale taky pro programátory.

Nečekejte žádné rady profesionála, tím rozhodně nejsem a ještě dlouho nebudu. Začínám na sobě pracovat, proto doufám, že budu mít co nabídnout a mé rady budou správné. Pokud Vás tedy něco z této oblasti zajímá, zkuste napsat pod článek komentář. Když to bude v mých silách, pokusím se vyhovět :)

8. 11. 2007 , 17:46

Vývoj her v jazyku Java

Kategorie: Programování // přidat komentář » 241 shlédnutí

Musím upozornit na velmi výhodnou nabídku. Tato kniha má přes 700 stran a nyní je ve slevě za super cenu 99Kč! S poštovným a balným mě to vyšlo na necelé dvě stovky, a musím říct že se mi to vyplatilo. Sice v javě moc nedělám, ale výhodou je že to není moc závislé na javě, jde spíše o obecné principy předvedené v tomto jazyku. Už v samotném úvodu se píše: Tato kniha vlastně ani není o vytváření javovských her – ve skutečnosti je o tvorbě her, které jsou náhodou napsány v Javě.

Proto pokud se o vývoj her zajímáte, nebo to máte v plánu, koupi této knížky silně doporučuju. Když jsem jí tak prolistoval tak vypadá po obsahové stránce hodně dobře. Nechybí programování grafiky, umělé inteligence a spoustu dalších věcí.

A kde že se dá získat? Já ji koupil tady: www.grada.cz

12. 7. 2007 , 12:27

Jak naprogramovat hru

Kategorie: Programování // přidat komentář » 355 shlédnutí

Nejsem žádný dobrý programátor, žádnou hru jsem zatím nevytvořil, ale rád bych se s váma podělil o mé prozatímní zkušenosti. Snad se to někomu bude hodit a nebude dělat stejné chyby jako já.

Jak začít

Pokud chcete vytvořit hru, měli by jste mít už zkušenosti s programováním. Pokud nemáte za sebou několik větších projektů (něco víc než Hello word ;) ) nemá cenu se do tvorby hry pouštět. Nejhorší možný přístup je ten, že budete kopírovat cizí kódy co najdete na netu, a z toho budete skládat hru. V čem je to špatné? Programování totiž není o tom vědět jen „jak to udělat?“ ale hlavně jak a proč to takhle udělat?. Když člověk pochopí proč použít právě tento postup, jaké to má výhody, jak to funguje, může později vyřešit podobný problém docela lehce. Pokud to člověk nepochopí, a jen to zkopíruje, musí počítat s tím, že pokud narazí na podobný problém, nedokáže ho sám vyřešit a bude muset hledat zdlouhavě řešení.

Read it all..

17. 6. 2007 , 20:38

Stargate game

Kategorie: Hry, Programování // přidat komentář » 345 shlédnutí

Tak nějak mi vadí, že neexistuje žádná dobrá hra na motivy seriálu Hvězdná brána (neboli Stargate). Proto jsem se asi před rokem rozhodl že takovou hru udělám. Neměl jsem žádné velké iluze o tom jak hra bude vypadat, měla to být jenom taková arkádovka. Přesto to nevyšlo a já jsem vývoj ukončil.

Ze začátku jsem byl dost optimistický, podařilo se mi několik pro mě úspěšných věcí. Hra měla vypadat tak, že hráč ovládá Ha’tak a kolem něho létají další nepřátelské hataky, které na hráče útočily. To se zdálo jako jednoduchý úkol, ale byl nad mé síly. Sice jsem překonal neznalost analytické geometrie (pojem vektor mi byl cizí), ale i přesto jsem s pomocí několika lidí na fóru českých her dokázal zprovoznit pohyb střel :)

Počáteční nadšení opadlo ve chvíli, kdy jsem měl nějaký malý základ hotový, ale potom jsem už nevěděl „jak dál“. Stejně většinu kódu jsem kopíroval z jiných zdrojových kódu, takže jsem stejně moc dobře nechápal jak to funguje. Alespoň mě to poučilo, že do tvorby her se mám pustit, až budu mít větší znalosti a až budu mít za sebou nějaký větší projekt.

Hru jsem programoval v Delphi7 a komponentou Asphyre. Aby to nebyl úplně zbytečný článek, tak tu hodím screenshot a odkaz na stažení té hry.

Stahujte ZDE

Jo a ještě k ovládání:
pohyb:šipky
střelba:kliknutí levým tlačítkem
konec:ALT+F4

21. 2. 2007 , 16:25

Tvorba Instalátoru

Kategorie: Programování, Různé // přidat komentář » 258 shlédnutí

Vytvořili jste nějaký zajímavý program a teď ho chcete rozšířit? Jestli ano, určitě budete chtít vytvořit nějaký instalátor pro snadnější instalaci vaší aplikace. Ti lepší si instalátor naprogramují sami, ale pro ty ostatní je i jiná možnost, a to použít nějaký již hotový instalátor.

Úvod máme za sebou, teď se pojdmě podívat na nějaký ten nástroj pro tvorbu instalátorů. Vybral jsem si nástroj NSIS. Je to open source, a byl vyvinut firmou Nullsoft (tvůrce Winampu). Je to komplexní nástroj pro tvorbu instalátorů, navíc je rozšiřitelný díky podpoře pluginů. Ma spoustu funkcí, v tomto článku se budu věnovat pouze vytvořením jednoduchého instalátoru, který přidá zástupce na plochu a do nabídky START. Program půjde odinstalovat z nabídky „Přidat nebo ubrat programy“.

Read it all..