Pokazywanie postów oznaczonych etykietą java. Pokaż wszystkie posty
Pokazywanie postów oznaczonych etykietą java. Pokaż wszystkie posty

piątek, 11 czerwca 2010

Rysowanie szachownicy


Demo aplikacji, które ma na celu przedstawić podstawy rysowania z użyciem biblioteki Qt Jambi.

Artykuł: Przedstawienie rysowania w Qt Jambi.
Źródło: download

czwartek, 10 czerwca 2010

Własny widget w Qt Jambi

Pierw należy dziedziczyć od kontrolki, a następnie należy wykonać implementacje. Przykład ukazuje utworzenie kontrolki na bazie QFrame.


import com.trolltech.qt.gui.*;

public class BlueFrame extends QFrame {
public BlueFrame(QWidget parent)
{
super(parent);
setStyleSheet("background-color:blue");
}

public static void main(String[] args) {
System.out.println("BlueFrame.java");
}
}


Kluczowym ruchem jest uruchomienie Project->Properties i oznaczenie Utworzonej klasy jako plugin. W tym celu klikamy na checkbox w kolumnie "Enable plugin".



Teraz pracując z Qt Designerem możemy wybrać naszą klasę z palety kontrolek i osadzić ją na formie.


Dla programujących w języku C++
Uruchom designera. Wstaw na formę pierw podstawową kontrolkę Qt z której dziedziczy twój widget.
W tym przypadku jest to QFrame. Następnie kliknij prawym klawiszem na jego powierzchnię.
Pojawi się menu kontekstowe, a w nim opcja zastąp. Wybierz ją. Następnie pojawi się okno dialogowe widżetów zastępczych.

Wprowadź nazwę zastępczej klasy. Kliknij przycisk "Dodaj". Oznacz checkbox w kolumnie nagłówek globalny. Teraz skompiluj program.

Obsługa I/O w Javie na przykładzie java.io

To co drażniące może być w Javie przy przejściu z innych języków. To liczne zestawienie klas do obsługi I/O (wejścia/wyjścia). Możesz się o tym przekonać odwiedzając stronę http://java.sun.com/j2se/1.4.2/docs/api/java/io/package-tree.html. Same książki nie ułatwiają ich wykorzystania ponieważ uwaga skupiona jest na zobrazowaniu listy ważniejszych klas wraz z opisem i przykładowym kodem. Pojawia się wiele wątpliwości, przy zapisie poniższego kodu:
try {
InputStream in = new BufferedInputStream(
new FileInputStream("magiczne liczby.txt"));
} catch (IOException e) {
e.printStackTrace();
}
Dlaczego teraz muszę tworzyć kilka obiektów, by móc przeczytać sobie plik? Czy to kaprys projektantów mający utrudnić życie kodującym w Javie?

Środkiem potrzebnym do uzyskania odpowiedzi jest wzorzec projektowy "dekorator". To on wyraża relacje jaka istnieje między wspomnianymi klasami. Znając go zrozumiesz korzystanie z wielu podobnych schematów.

Opis szczegółowy wzorca znajdziesz w książce Head First Design Patterns, a także na stronie http://marioosh.5dots.pl/2009/02/wzorce-projektowe-decorator/, aby go pojąć niezbędne jest zrozumienie polimorfizmu.

Przejdźmy do rzeczy, spójrz na poniższy rysunek:



Klasa OutputStream (zielona ramka) oraz klasa FilterOutputStream (czerwona ramka) służą istnieniu relacji we wzorcu dekoratora, to dzięki nim możliwe jest zestawienie klas o którym powiem za chwilę. W tym wątku przedstawię tylko możliwość korzystania z gotowej relacji. Jeżeli chcesz umieć utworzyć własną relacje dekoratora to zajrzyj do lektury.

Najistotniejsza rzecz polega na użyciu składnika (niebieska ramka) i opakowaniu go w dekoratory (fioletowa ramka). Sam dekorator na nic się nie przyda. Jednak użycie go na składniku powoduje, że sam składnik zyskuje nowe możliwości. Mieszanie składnika z dekoratorami pozwala utworzyć obiekt, który będzie zawierał porządne przez nas cechy. W ten sposób z wielu prostych klas można tworzyć złożony obiekt dostosowany do naszych potrzeb.

Co więcej, istnieje możliwość tworzenia nowych własnych dekoratorów. W przykładzie utworzę dekorator pozwalający usunąć z wejścia cyfry. Przepuszcza tylko białe znaki i litery. Należy w tym celu utworzyć klasę, która będzie dziedziczyć od FileOutputStream. Klasę nazwałem AlphaStream.



Implementacja:

Plik: AlphaStream.java
import java.io.*;

public class AlphaStream extends FilterInputStream {
public AlphaStream(InputStream in){
super(in);
}

@Override
public int read() throws IOException{
int c;

while ((c = super.read()) != -1) {
if (Character.isLetter(c) || Character.isWhitespace(c))
return c;
}
return -1;
}
}

Plik: Main.java
import java.io.*;

public class Main {

public static void main(String[] argc) {
try{
InputStream in = new AlphaStream(
new BufferedInputStream(System.in));
String buff = "";
int c;
while((c = in.read()) >= 0){
buff += (char)c;
}
System.out.println(buff);
}
catch( IOException e) {
e.printStackTrace();
}
}

}

Instalacja Qt Jambi w Eclipse

Instalacja Eclipse
- pobierz: "Eclipse IDE for Java Developers"
- rozpakuj pobrany plik w docelowej lokalizacji
- utwórz katalog dla projektów Java
- uruchom Eclipse, by sprawdzić czy działa
- wprowadź ścieżkę katalogu dla projektów Java
- zamknij Eclipse

Instalacja Qt Jambi
- pobierz: "Binaries" zależne od platformy
- rozpakuj "Binaries" w docelowej lokacji
- zapisz w notatniku ścieżkę do głównego katalogu "Binaries"
Integracja Eclipse z Qt Jambi
- pobierz: "Eclipse Integration" zależne od platformy
- rozpakuj: "Eclipse Integration"
- zawartość katalogu plugins skopiuj do katalogu eclipse/plugins

Konfiguracja
- uruchom Eclipse
- uruchom Window->Preferences
- pojawi się okno dialogowe preferencji
- W polu Jambi Location wprowadź ścieżkę do rozpakowanego katalogu "Binaries"

Test
- uruchom File->Project...
- pojawi się Okno dialogowe nowego projektu
- wybierz Qt Jambi Project (Using Designer Form)
- nadaj projektowi nazwę, np. HelloQt
- pojawi się okno wyboru okna gui
- wprowadź "MainWindow" do pola Name
- wybierz foremkę "Main Window"
- otwórz plik MainWindow.java
- powinieneś otrzymać kod taki sam jak poniżej:

import com.trolltech.qt.gui.*;

public class MainWindow extends QMainWindow {

Ui_MainWindow ui = new Ui_MainWindow();

public static void main(String[] args) {
QApplication.initialize(args);

MainWindow testMainWindow = new MainWindow();
testMainWindow.show();

QApplication.exec();
}

public MainWindow() {
ui.setupUi(this);
}

public MainWindow(QWidget parent) {
super(parent);
ui.setupUi(this);
}
}

- teraz kliknij Ctrl+F11, aby skompilować i uruchomić program