2004.10_Eclipse i Java–program do obliczania sum kontrolnych_[Programowanie].pdf

(923 KB) Pobierz
439034754 UNPDF
dla programistów
Eclipse i Java
– program
do obliczania sum
kontrolnych
Marek Sawerwain
dziwie przenośną, nie mamy
dużego wyboru. Obecnie
najbardziej dojrzałą platfor-
mą, właściwą dla tego typu projektu,
jest Java . Zapewnia ona pożądaną
przez nas cechę, czyli uruchamianie
jednego kodu binarnego na różnych
platformach sprzętowo-programowych.
Jedynym konkurencyjnym rozwiąza-
niem o podobnych możliwościach jest
Mono , ale nie jest to produkt tak doj-
rzały, jak Java, rozwijana już od ponad
dziesięciu lat.
Od dłuższego czasu możemy korzy-
stać z darmowego środowiska dewe-
loperskiego dla Javy o nazwie Eclipse ,
którego najnowsza wersja 3.0 została
wydana 25 czerwca 2004 roku. Możliwo-
ści tego pakietu, napisanego oczywiście
w Javie, są niemałe. Najważniejszym ich
elementem jest modularna architektura,
pozwalająca dodawać nowe funkcje do
środowiska za pomocą wtyczek (ang.
plugins ).
Po zainstalowaniu i uruchomieniu
pakietu Eclipse może on wydawać
się kolejnym darmowym edytorem
do kodu źródłowego, choć o sporych
możliwościach: podświetlanie składni,
podpowiedzi w kodzie czy dodatkowe
okno z drzewem wszystkich metod i pól
klas, nad którymi aktualnie pracujemy.
Możemy poczuć się nieco rozczarowani.
Siła Eclipse wyraża się jednak dostęp-
nymi wtyczkami, gdyż po ich zainsta-
lowaniu otrzymujemy bardzo wygodne
narzędzie RAD, w którym interfejs użyt-
kownika budujemy za pomocą myszki.
Oczywiście, nadal mamy pełną kontrolę
na kodem źródłowym interfejsu użyt-
kownika, np. gdy zmienimy tekst
wyświetlany przez etykietę w kodzie
źródłowym, to ta zmiana nastąpi rów-
nież w edytorze wizualnym.
W tym artykule chciałbym przedsta-
wić środowisko Eclipse , ale aby nasza
prezentacja nie była tylko teoretyczna,
napiszemy nieskomplikowaną aplika-
cję do obliczania wartości hash dla
danych tekstowych i plików, czyli gra-
ficzny odpowiednik programu z konsoli
o nazwie Md5sum .
Na płycie CD/DVD
Na płycie CD/DVD znajduje się
Eclipse i Java, kod źródłowy
tworzonego programu oraz
wszystkie listingi z artykułu.
Instalacja środowiska
Eclipse
Pakiet Eclipse nie jest jeszcze dostępny
w popularnych dystrybucjach Linuksa.
Trzeba samodzielnie ściągnąć odpo-
wiednie pakiety ze strony domowej pro-
jektu (oczywiście, na płytach CD/DVD
znajdują się wszystkie potrzebne pliki
instalacyjne). Obecnie ostatnia stabilna
wersja jest oznaczona numerem 3.0.
Najlepiej ściągnąć pakiet Eclipse SDK .
Zawiera on dokumentację oraz przykła-
dy, ale nie ma w nim maszyny wirtualnej
języka Java. Musimy zaopatrzyć się w nią
ściągając odpowiedni pakiet ze strony
Suna. Najlepszą wersją będzie Java SDK ,
chociaż wersja JRE jest wystarczająca,
gdyż Eclipse posiada własny kompilator.
W momencie pisania tego tekstu stabilna
wersja Javy nosi numer 1.4.2_05 i właśnie
najlepiej jej używać.
W przypadku Linuksa istnieją dwie
odmiany Eclipse: dla biblioteki Motif
(ewentualnie Lesstif ) oraz dla biblioteki
GTK+ 2 . W tym artykule będziemy opie-
rać się na tej drugiej.
O autorze
Autor zajmuje się tworzeniem
oprogramowania dla WIN32
i Linuksa. Zainteresowania: teoria
języków programowania oraz
dobra literatura. Kontakt z auto-
rem: autorzy@lpmagazine.org
68 październik 2004
C hcąc napisać aplikację praw-
439034754.028.png 439034754.029.png 439034754.030.png 439034754.031.png 439034754.001.png 439034754.002.png
Eclipse i Java
dla programistów
Instalacja Javy
Pakiet instalacyjny Javy, dostarczany
przez Suna, występuje w dwóch wer-
sjach: jako pakiet RPM i pakiet BIN.
Instalację dowolnej wersji jak zwykle
wykonujemy z konta root .
Instalacja pakietu RPM sprowadza
się do wydania polecenia:
rpm -iv j2sdk-1_4_2_<ref_version>- S
linux-i586.rpm
Po ściągnięciu pliku w formacie ZIP
musimy go rozpakować. Będzie nam
w tym celu potrzebny program Unzip .
Pobrany pakiet możemy rozpakować do
dowolnego katalogu, np.:
identyczna z głównym pakietem. Jeśli
pakiet główny Eclipse został rozpakowa-
ny w katalogu /opt , to instalacja VE prze-
biega przykładowo w taki sposób:
mkdir /opt ; cd /opt
unzip eclipse-SDK-3.0-linux-gtk.zip
cd /opt
unzip emf-sdo-runtime-2.0.0.zip
unzip GEF-runtime-3.0.zip
unzip VE-runtime-1.0M2.zip
Po rozpakowaniu zostanie utworzony
katalog eclipse , a w nim znajdziemy
gotowe środowisko pracy. Program uru-
chamiamy poprzez wydanie polecenia
eclipse. Oczywiście, w systemie musi
być zainstalowana Java. Jak to zrobić oraz
kilka przydatnych rad zawiera ramka
Instalacja Javy .
Środowisko Eclipse w podstawowej
wersji nie oferuje graficznego edyto-
ra interfejsu. Aby z niego skorzystać,
musimy ściągnąć odpowiednie wtyczki.
Można to zrobić na dwa sposoby.
Jeśli mamy dostęp do Internetu,
wystarczy skorzystać z funkcji aktuali-
zacji Eclipse poprzez Sieć. Wybieramy
z menu Help/Software Updates opcję
Find and Install . Po krótkiej chwili (pro-
gram szuka nowych plików) wybieramy
pakiet o nazwie VE , czyli Visual Editor
(ewentualnie VEP – Visual Editor Pro-
ject ). Gdy powstawał ten tekst, wersja
stabilna była dość stara, ale można
skorzystać z tzw. stabilnego strumie-
nia wersji pakietu VE, np. o numerze
1.0M2. Wersja ta, choć ma prawo spra-
wiać kłopoty, jest znacznie bogatsza
w możliwości.
Alternatywą jest samodzielne zain-
stalowanie odpowiednich pakietów.
Pakiet VE występuje tylko w jednej wersji
wspólnej dla platform Win32 i Linux.
Istnieje również pakiet SDK, ale jest on
tylko istotny dla osób, które chciałyby
rozszerzyć możliwości VE. Do edytora
dostępne są również przykłady, które
szczerze polecam początkującym adep-
tom Javy. Jeśli nie są nam potrzebne
przykłady, to interesuje nas tylko pakiet
Visual Editor Runtime .
Pakiet VE wymaga do poprawne-
go działania dwóch innych wtyczek
o nazwach EMF Build oraz GEF Build
3.0 . Na płytach CD/DVD znajdują się
wszystkie potrzebne archiwa. Ich insta-
lacja jest bardzo prosta. Podobnie jak w
przypadku Eclipse, wystarczy je rozpako-
wać programem Unzip . Wszystkie archi-
wa zawierają pliki w katalogu eclipse , co
oznacza, że ich struktura katalogowa jest
Po uruchomieniu środowiska Eclipse,
wtyczka VE będzie już dostępna i gotowa
do pracy.
gdzie zapis <ref_version> oznacza nu-
mer rewizji. Obecnie dostępna jest
rewizja o numerze 05 i tę najlepiej zain-
stalować, chyba, że dostępna będzie
wersja o wyższej rewizji. Jednak, co
może dziwić, pakiet RPM i tak pier-
wotnie otrzymujemy w postaci pakietu
binarnego. Po jego ściągnięciu jeste-
śmy zmuszeni wykonać dwie dodatko-
we czynności. Należy nadać mu prawo
wykonywania:
chmod a+x j2sdk-1_4_2_<ref_version>- S
linux-i586-rpm.bin
Plan programu
Po instalacji środowiska i dodatkowych
wtyczek poświęcimy chwilę, aby zapla-
nować nasze dalsze działania. Ogólny
schemat naszego programu do wyzna-
czania odcisków prezentuje Rysunek 1.
W naszym programie istnieją tylko cztery
główne zdarzenia: wybór pliku, wyzna-
czenie wartości odcisku, wyczyszczenie
pól edycyjnych oraz zakończenie pracy
programu. Obliczenie wartości odcisku
jest uzależnione od wyboru użytkowni-
ka, gdyż można nakazać obliczyć odcisk
algorytmem MD5 bądź SHA1. Ponadto,
obliczenia mogą zostać przeprowadzone
a następnie uruchomić:
./j2sdk-1_4_2_<ref_version>-linux- S
i586-rpm.bin
Po zakończeniu działania otrzymamy go-
towy do instalacji pakiet RPM.
Drugi sposób instalacji, czyli insta-
lacja z pakietu binarnego, jest przezna-
czona dla bardziej zaawansowanych
użytkowników. Podobnie jak poprzednio,
musimy nadać prawo wykonywania
pliku:
chmod a+x j2sdk-1_4_2_<ref_version>- S
linux-i586.bin
Czym są odciski
(wartości hash)?
Stosuje się kilka określeń dla tego typu
wartości. Mówimy o odciskach plików,
wartościach hash , ale także o warto-
ściach funkcji skrótu bądź o sumie, np.
suma MD5. Istnieje szereg algorytmów
do wyznaczania odcisków. Algorytmy te
reprezentują tzw. funkcje jednokierun-
kowe (ang. one-way functions ), gdyż
na podstawie otrzymanej wartości nie
można odtworzyć danych, z których
został wygenerowany odcisk. Odcisk
jest prawie niepowtarzalny. Wystar-
czy zmienić jeden bajt danych, aby
otrzymać inną wartość skrótu. Istnieje
pewne prawdopodobieństwo (zniko-
me, ale jednak), że dla dwóch różnych
zestawów danych otrzymamy iden-
tyczne wartości hash . Mimo tej uwagi,
algorytmy tego typu znakomicie nadają
się do weryikacji, czy plik, ściągnięty
przez nas z Internetu, jest poprawny.
Najpopularniejszymi algorytmami są
użyte w artykule MD5 i SHA1, ale ist-
nieje wiele innych. Dobrym przykładem
jest popularny klient sieci P2P eDonkey .
“Osiołek” używa modyikacji algorytmu
MD4 (starsza odmiana aktualnie stoso-
wanego MD5).
Plik uruchamiamy i odpowiadamy na
kilka pytań. Jednym z nich będzie pyta-
nie o katalog docelowy – podajemy np.
/opt . W katalogu docelowym zostanie
utworzony podkatalog o nazwie zależ-
nej od wersji, którą instalujemy. Gdy
będzie to wersja 1.4.2_05, to katalog
ten będzie nosił nazwę: j2sdk1.4.2_05 .
Tak zainstalowana Java nie jest dla
nas zbyt przydatna, ponieważ za
każdym razem należy podawać pełną
ścieżkę do plików java , javac oraz
pozostałych. Rozwiązaniem jest dopi-
sanie dodatkowej ścieżkę do zmiennej
PATH . Najlepiej zrobić to w pliku /etc/
bashrc :
export PATH=$PATH:/opt/j2skd1.4.2_05/bin
www.lpmagazine.org
69
439034754.003.png 439034754.004.png 439034754.005.png
 
dla programistów
�����
że pozwala szybko zbudować interfejs
– stosowanie menedżerów wyglądu
wymaga czasem wzajemnego osadza-
nia elementów interfejsu, co oznacza
konieczność dokładniejszego jego
zaplanowania. Mówiąc krótko, trzeba się
zastanowić nad tym, co chcemy otrzy-
mać. Podstawową wadą usunięcia mene-
dżera wyglądu jest fakt, że komponenty
przy zmianie wymiaru okna nie będą się
samoczynnie centrować.
Na Rysunku 4 widać dwa okna.
Oprócz podstawowego okna naszej
aplikacji, będziemy również stosować
okno wyboru pliku. Dodanie tego
okna wymaga dopisania definicji nowej
zmiennej na początku ciała klasy:
�����������
�������������
����������
�������������
������������
�����
��� ��������
�����������������
����������
���
������
����
������������
������������������
����������
����
Rysunek 1. Schemat programu
private javax.swing.JPanel jContentPane S
= null;
dla danych tekstowych bądź dla danych
z pliku. Jak widać, struktura programu
nie jest skomplikowana. Po tej krótkiej
chwili refleksji zaczynamy tworzyć nasz
program.
trzy główne systemy GUI: AWT, Swing
oraz SWT. Pod względem wydajności
najlepszy jest SWT, ale my skorzysta-
my ze Swing, który stał się standar-
dem wśród aplikacji Javy. Tym samym,
jako obiekt bazowy używamy ramki
( Frame ). Zwróćmy uwagę, że przy
wybieraniu innych typów zmienia się
wartość pola superclass . W naszej apli-
kacji w tym polu edycyjnym powinna
znajdować się następująca wartość:
javax.swing.Frame .
Wpisanie tej linijki kodu spowoduje, że
Eclipse, oprócz projektowanego przez
nas okna, będzie wyświetlał także okno
wyboru pliku. Nie jest to zbyt duża wada
i można przyzwyczaić się do takiego
rozwiązania.
Pozostaje nam teraz ustawienie
wszystkich komponentów na formatce.
Dodanie nowego komponentu powo-
duje generowanie nowej funkcji, której
zadaniem jest utworzenie kontrolki.
Pamiętajmy o nazwaniu poszczególnych
widgetów, przy czym nie ustalamy
własności name , ale field name . W ten
sposób zmienne reprezentujące kompo-
nenty będą posiadały znaczące nazwy,
co ma zasadnicze znaczenie – nasz kod
będzie czytelny dla każdego innego pro-
gramisty.
Tworzenie projektu i klasy
głównej
Pracę nad programem rozpoczynamy
od utworzenia projektu. Z menu File
wybieramy pozycję New , a z listy, która
się nam ukaże, opcję Project . Otrzymu-
jemy okno, w którym zebrano wszystkie
dostępne typy projektów. Nas interesuje
Java Project . Po wybraniu projektu
naciskamy przycisk Next . Ukaże się
nam okno podobne do tego z Rysun-
ku 2. Uzupełniamy tylko jedno pole,
oznaczone jako Project Name , w które
wpisujemy nazwę naszego projektu, np.
HashCalc .
Po utworzeniu projektu (wystar-
czy wcisnąć przycisk Finish ) należy
utworzyć klasę główną, reprezentującą
podstawowe okno naszej aplikacji.
Ponownie z menu File wybieramy opcję
New , lecz na liście, która się nam ukaże,
wskazujemy Visual Class . Jeśli nie ma
takiej możliwości, oznacza to, że nie
mamy zainstalowanej wtyczki VE. Po
wybraniu Visual Class zobaczymy okno
podobne do tego z Rysunku 3. Pierwszą
rzeczą, którą należy zrobić, to nazwać
okno (pole Name ). Klasę nazywamy
tak jak projekt: HashCalc . Następnie
z listy Style wybieramy klasę bazową
naszego okna. Mamy do dyspozycji
Interfejs użytkownika
Po utworzeniu projektu i szkieletu
klasy rozpoczynamy tworzenie inter-
fejsu. Korzystamy z kontrolek Swing ,
choć możemy wykorzystywać również
AWT. System Swing, podobnie jak inne
systemy GUI w Uniksach, dostarcza
specjalnych obiektów, dbających o
równomierne rozłożenie komponentów.
Jeśli z pewnych powodów nie lubimy
stosować menedżerów wyglądu i zależy
nam na samodzielnym zarządzaniu
widgetami, to należy usunąć ten mecha-
nizm. Wybieramy widok projektowane-
go okna, klikamy gdzieś na jego środku
i przechodzimy do okna własności (ang.
properties ). Odszukujemy własność
Layout i z listy wyboru wybieramy war-
tość null .
W ten sposób pozbyliśmy się mene-
dżera wyglądu. Teraz każdy komponent
przez nas położony możemy dowol-
nie przemieszczać oraz zmieniać jego
wymiary. Takie rozwiązanie ma tę zaletę,
Poprawki w kodzie
interfejsu
Gdy interfejs naszej aplikacji jest już
zaprojektowany, to musimy jeszcze
wprowadzić małe poprawki, związa-
ne z widgetem JComboBox . Wybieramy
w nim, czy wartość odcisku ma być
wyznaczona dla pliku, czy dla danych
tekstowych. W kodzie źródłowym
zmienna tego komponentu nosi nazwę
TypeComboBox. Pełen kod tej metody
jest bardzo krótki, a przedstawia
go Listing 1. Względem oryginalnej
metody, wygenerowanej przez śro-
dowisko Eclipse, różni się ona tylko
następującą linią kodu:
TypeComboBox = new JComboBox(type_items);
70
październik 2004
439034754.006.png 439034754.007.png 439034754.008.png 439034754.009.png 439034754.010.png 439034754.011.png
 
Eclipse i Java
dla programistów
DataTextField.setText("");
MD5TextField.setText("");
SHA1TextField.setText("");
int state;
state = getJfc().showOpenDialog(this);
if (state == jFileChooser. S
APPROVE_OPTION) {
DataTextField.setText(jFileChooser. S
getSelectedFile().getAbsolutePath());
}
Cała metoda tworząca przycisk CleanBtn
została przedstawiona na Listingu 2. Czy-
telników, którzy po raz pierwszy widzą
Javę, zapewne dziwi deklaracja action-
Performed . Tworzymy w ten sposób
potrzebny obiekt i od razy przeciążamy
odpowiednią metodę, choć lepiej powie-
dzieć, że definiujemy metodę anonimo-
wą.
Funkcja getJfc zwraca obiekt okna,
więc mogliśmy wywołać metodę show-
OpenDialog , a także tworzy okno, jeśli
potrzeba. Gdy okno zostanie zamknię-
te, to wartość wynikową metody show-
OpenDialog umieszczamy w zmiennej.
Następnie sprawdzamy, czy jest ona
równa wartości jFileChooser.APPRO-
VE_OPTION . Jeśli tak, to oznacza to, że
użytkownik wskazał plik oraz zatwier-
dził ten fakt przyciskiem OK w oknie
wyboru pliku. Pozostało nam tylko
przenieść pełną ścieżkę wybranego
pliku do komponentu DataTextField .
Zajmijmy się teraz funkcją getJfc .
Podczas budowy interfejsu każdy kom-
ponent położony na formatce powoduje
utworzenie funkcji z przedrostkiem get .
Ponieważ samodzielnie zdefiniowaliśmy
zmienną okna wyboru, to aby utrzymać
tę samą notację, dla porządku powinni-
śmy utworzyć odpowiednią funkcję get .
Sposób działania tej funkcji jest nastę-
pujący: jeśli wartość zmiennej jFileCho-
oser wynosi null , to należy utworzyć
nowy obiekt; to dokładnie robi każda
z funkcji z przedrostkiem get . Pełną treść
funkcji getJfc zawiera Listing 3. Dodat-
Rysunek 2. Tworzenie nowego projektu
W przypadku przycisku Koniec
(zmienna EndBtn ) chcemy doprowadzić
do zakończenia pracy programu. Wystar-
czy wywołać standardową metodę exit ,
co sprowadza się do jednej linii kodu
umieszczonej w treści actionPerformed :
Oryginalna metoda nie przekazuje żad-
nych danych w argumencie konstruk-
tora JComboBox . W naszej podaliśmy
tablicę elementów, którą ma zawierać
nasz ComboBox . Definicję tej tablicy
(podobnie jak okna wyboru plików)
umieszczamy na początku ciała klasy
HashCalc :
System.exit(0);
Wybór pliku
W naszej aplikacji posługujemy się
dodatkowym oknem, przeznaczonym do
wyboru pliku. Okno to zdefiniowaliśmy
już wcześniej, dopisując odpowiednią
deklarację na początku ciała klasy Hash-
Calc .
Wywołanie okna nastąpi po wybra-
niu przycisku z trzema kropkami, który
znajduje się obok pola edycyjnego Data-
TextField . Obsługa zdarzenia dla tego
przycisku to wywołanie innej metody o
nazwie SetFileName . Ta metoda nie jest
zbyt długa:
private String[] type_items={"dane S
tekstowe","dane z pliku"};
Przyciski
„Czyść” i „Koniec”
Po trywialnych zmianach w kodzie
interfejsu możemy przystąpić do
implementacji zachowań naszych
przycisków. Na początek zajmijmy się
przyciskiem „Czyść” (w kodzie nosi on
nazwę CleanBtn ). Zgodnie z naszymi
założeniami, ma on czyścić zawartość
trzech pól edycyjnych (pola danych
bądź nazwy pliku oraz dwóch pól,
w których są umieszczane wartości
hash ).
Aby dodać nową obsługę zdarzenia,
wystarczy w oknie JavaBeans wskazać
potrzebny komponent i nacisnąć lewy
przycisk myszy. Pokaże się niewielkie
menu, w którym wybieramy podmenu
Events i z następnej listy opcję action-
Performed . Zostaniemy przeniesieni
do edytora, a kursor zostanie umiesz-
czony w treści wygenerowanej metody.
Powinna się tam znajdować jedna
linijka kodu, wyświetlająca komunikat
tekstowy. Ponieważ przycisk ma czyścić
pola edycyjne, to wystarczą następujące
trzy linijki wstawione zamiast oryginal-
nej treści:
Rysunek 3. Tworzenie klasy reprezentującej okno główne aplikacji
www.lpmagazine.org
71
439034754.012.png 439034754.013.png 439034754.014.png 439034754.015.png 439034754.016.png 439034754.017.png 439034754.018.png 439034754.019.png 439034754.020.png 439034754.021.png
dla programistów
obsługujący tę sytuację przedstawia się
następująco:
if(TypeComboBox.getSelectedIndex()==0) {
if(doMD5Calc) CalcMD5HashFromString();
if(doSHA1Calc) CalcSHA1HashFromString();
}
W drugim przypadku otrzymujemy
jedynkę. Tym razem będziemy wyzna-
czać wartość hash dla danych zawartych
w pliku. Zmienna DataTextField zawiera
pełną ścieżkę pliku, który został wybrany
przez użytkownika:
if(TypeComboBox.getSelectedIndex()==1) {
if(doMD5Calc) CalcMD5HashFromFile();
if(doSHA1Calc) CalcSHA1HashFromFile();
}
Rysunek 4. Projektowanie okna programu HashCalc
Wyznaczanie wartości
hash dla danych
tekstowych
W zależności od wyboru użytkownika,
wartość odcisku może zostać wyznaczo-
na dla pliku bądź dla ciągu znaków.
Wywołujemy dwie różne funkcje dla tych
przypadków. Zajmijmy się funkcją obli-
czającą skrót MD5 dla ciągu tekstowe-
go. Jej nazwa to CalcMD5HashFromString ,
a treść znajduje się na Listingu 4.
Znajdujemy się w bardzo dobrej sytuacji,
ponieważ nie musimy samodzielnie zajmo-
wać się implementacją algorytmu MD5.
Biblioteka standardowa Javy zawiera odpo-
wiednie klasy. Na początek deklarujemy
zmienną reprezentującą obiekt liczący odcisk:
kowo, wyłączamy możliwość zaznacze-
nia więcej niż jednego pliku.
własność zaprzeczenia. Jeśli od początku
działania programu odpowiedni przy-
cisk wyboru jest zaznaczony, a zmienna
posiada wartość logiczną true , to gdy
użytkownik kliknie na przycisku, spo-
woduje jego odznaczenie i wykonanie
operacji zaprzeczenia – zmianę wartości
zmiennej z true na false . Dokładnie o to
nam chodziło – ponowne kliknięcie na
przycisku spowoduje jego zaznaczenie
i zmianę wartość logicznej z fałszu na
prawdę.
Teraz możemy oprogramować obsłu-
gę przycisku Oblicz hash (zmienna o
nazwie HashCalcBtn ). Na początek spraw-
dzamy, czy pole DataTextField zawiera
jakieś dane:
Wybór algorytmów,
czyli przyciski wyboru
md5 i sha1
Nasz program pozwala na wybór algoryt-
mów, dla których ma zostać wyznaczona
wartość hash . Wybór algorytmu odbywa
się za pomocą widgetów checkbox .
Implementację rozpoczynamy od dekla-
racji dwóch zmiennych:
private boolean doMD5Calc = true;
private boolean doSHA1Calc = true;
MessageDigest md=null;
Wartością domyślną jest true , co ozna-
cza, że po uruchomieniu programu
wyznaczanie odcisku ma następować
dla obydwu algorytmów (wartości tych
zmiennych są sprawdzane w obsłudze
przycisku Oblicz hash ). Z tego powodu
zwracamy uwagę podczas projektowania
interfejsu, aby domyślnie obydwa przyci-
ski wyboru (o nazwach MD5CheckBox oraz
SHA1CheckBox ) były zaznaczone.
Użytkownik może dowolnie wybie-
rać pomiędzy tymi dwoma algorytma-
mi. Aby to umożliwić, należy utworzyć
obsługę zdarzenia itemStateChanged dla
przycisków wyboru. Kod, który należy
podać, to jedna linia programu, np.
dla algorytmu MD5: doMD5Calc=!do-
MD5Calc; .
Ponieważ zmienna doMD5Calc jest
typu logicznego, to wykorzystujemy tutaj
if(DataTextField.getText(). S
compareTo("")==0) return;
W drugim kroku deklarujemy tablicę
b , w której znajduje się ciąg tekstowy,
na podstawie którego wyznaczymy
odcisk. Wykorzystamy metodę getBy-
tes , która zmieni typ String na ciąg
bajów:
Jeśli powyższy test powiedzie się, oznacza
to, że komponent DataTextField jest pusty
i nie przeprowadzamy żadnych obliczeń.
Następnie sprawdzamy, jaka wartość
została wybrana w kontrolce TypeCombo-
Box . Wykorzystujemy metodę getSelec-
tedIndex . Wartości zwracane tą metodą
odpowiadają dokładnie tablicy elemen-
tów, którą wcześniej zadeklarowaliśmy.
W pierwszym przypadku otrzymuje-
my zero. Jest to pierwszy element tablicy,
na którym znajduje się wartość dane
tekstowe . Wybranie tej wartości oznacza
obliczanie wartości hash z ciągu znaków
podanych przez użytkownika. Kod
Listing 1. Metoda tworząca komponent
TypeComboBox
private JComboBox getTypeComboBox () {
if ( TypeComboBox == null ) {
TypeComboBox = new
TypeComboBox . setBounds ( 13 , S
56 , 125 , 21 ) ;
TypeComboBox . setSelectedIndex ( 0 ) ;
}
return TypeComboBox ;
}
72
październik 2004
S
JcomboBox ( type_items ) ;
439034754.022.png 439034754.023.png 439034754.024.png 439034754.025.png 439034754.026.png 439034754.027.png
 
Zgłoś jeśli naruszono regulamin