programowanie_GUI 160 Kb May 31 2008 05:31:51 PM
Transkrypt
programowanie_GUI 160 Kb May 31 2008 05:31:51 PM
Tworzenie elementów graficznych
Elementy graficzne w Javie pozwalające tworzyć
Graficzny Interfejs Użytkownika (GUI) możemy
podzielić na dwie grupy:
● AWT (Abstract Window Toolkit) – bibliotek klas
służąca do prostego programowania interfejsu
użytkownika
● SWING – część zestawu narzędzi JFC (Java
Fundation Class) służące do tworzenia
graficznego interfejsu użytkownika
SWING – zasada działania
Elementy interfejsu użytkownika tworzone są
na powierzchni pustych okien (tzw. ramek frame). Tworzenie polega na „rysowaniu” przez
klasy SWING'a poszczególnych elementów
interfejsu.
Rozwiązanie takie chociaż wolniejsze od AWT
posiada bogatszy zestaw elementów interfejsu
oraz charakteryzuje się znacznie mniejszą
zależnością od platformy.
Podstawą są ramki – klasa JFrame
Podstawowym
elementem tworzącym
interfejs użytkownika
jest ramka. Ramkę
tworzymy przez
stworzenie obiektu
klasy JFrame (SWING)
lub Frame (AWT). W
dalszej części ćwiczeń
będziemy korzystać ze
SWING'a.
Object
Component
Container
JComponent
Window
JPanel
Frame
JFrame
Tworzenie prostej ramki
class MojaRamka extends JFrame{
public MojaRamka() {
setSize(300,200);
}
}
public static void main(String[] args){
MojaRamka ramka = new MojaRamka();
ramka.setDefaultCloseOperation(
JFrame.EXIT_ON_CLOSE);
ramka.setVisible(true);
}
Manipulowanie ramką 1
Wybrane metody dziedziczone po Frame:
●
SetIconImage) - pobiera objekt typu
Image i uzywa go jako ikonkę ramki.
●
setTitle – zmienia tekst na pasku
tytułowym okna. Argumentem jest String.
●
setResizeable – określa czy użytkownik
może zmienić rozmiar okna. Pobiera wartość
boolean
Manipulowanie ramką 2
Wybrane metody dziedziczone po Component :
● setLocation(x, y) – określa położenie
lewego górnego rogu okna,
● setSize(szer, wys) – określa rozmiar
okna,
● setBounds(x, y, szer, wys) – określa
obydwa powyższe parametry na raz.
Wybrane metody klasy Component
Uwaga: poniższe metody dotyczą wszystkich klas
dziedziczących po klasie Component.
●
●
●
●
●
●
●
getLocation – zwraca położenie lewego górnego narożnika
danego komponentu, względem otaczajacego go pojemnika.
getLocationOnScreen – jw. Tylko względem ekranu,
getSize – pobiera aktualny rozmiar komponentu,
setVisible – określa czy dany element (w tym ramka) jest
widoczny.
setEnable – włącza/wyłącza komponent
isShowing – zwraca wartość boolean mówiącą o tym czy dany
element jest widoczny na ekranie
isEabling – zwraca czy dany element jest aktywny.
Wybrane metody klasy Window
(java.awt.Window)
●
●
toFront – przesuwa okno na pierwszy plan,
toBack – przesuwa okno na ostatni plan.
Klasa Toolkit – określanie rozmiaru ekranu
(java.awt.Toolkit)
Korzystamy z zestawu narzędzi dostępnych w kalsie Toolkit,
jedną z metod dostępych w zestawie narzędzi jest getScreenSize.
Metoda ta zwraca obiekt klasy dimension, który przechowuje
rozmiary ekranu w zmiennych width i height.
T o o lk it to o l = T o o lk it.g e tD e fa u ltT o o lk it();
D im e n s io n s c r e e n D im e n s io n = to o l.g e tS c r e e n S iz e ();
s e tS iz e (s c r e e n D im e n s io n .w id th /2 , s c r e e n D im e n s io n .h e ig h t/2 );
s e tL o c a tio n (s c r e e n D im e n s io n .w id th /4 , s c r e e n D im e n s io n .h e ig h t/4 );
JFrame – struktura wewnętrzna
JFrame
Obiekty klasy JFrame
mają dosyć złożoną
strukturę. Możemy w
prawdzie rysować w
objecie ramki, ale nie
jest to praktyka
zalecana, w
rzeczywistości ramki
są pojemnikami na
inne komponenty.
Tytuł okna
JRoot
JLayeredPane
Powierzchnia szklana
Pow.
zawartości
Klasa JPanel
Elementem którym będziemy się zajmować
obecnie będzie powierzchnia zawartości.
Będziemy dodawać do niej pojedynczy panel na
którym będziemy mogli rysować, pisać i dodawać
inne elementy. Panele są obiektami klasy JPanel.
Dodawanie komponentu do pow. zawartości.
Aby dodać komponent do powierzchni zawartości
używamy następującego kodu:
Container pojemnik = getContentPane();
Component k = ...(tutaj określamy komponent);
pojemnik.add(k);
*) Komponentem może być Panel (JPanel), Przycisk(JButton), itp.
Przykład tworzenia i dodawania panelu
import java.awt.*;
import javax.swing.*;
public class dodajemypanel {
public static void main(String[] args) {
RamkaZPanelem ramka = new RamkaZPanelem();
ramka.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
ramka.setVisible(true);
}
}
class RamkaZPanelem extends JFrame {
public RamkaZPanelem(){
setTitle("Ramka z Panelem");
setSize(Toolkit.getDefaultToolkit().getScreenSize().width,Toolkit.getDefaultToolkit().getScreenSize().height);
PanelZTekstem panel = new PanelZTekstem();
Container pojemnik = getContentPane();
pojemnik.add(panel);
}
}
class PanelZTekstem extends JPanel {
public void paintComponent(Graphics g) {
super.paintComponent(g);
}
}
g.drawString("To jest nasz pierwszy tekst w panelu", 100,100);
Zmiana kroju pisma, wielkości znaków oraz koloru
wyświetlanego tekstu.
Zmiana domyslnego kroju czcionki realizowana jest przez
metodę setFont(Font);
metoda ta przyjmuje jako argumenty obiekty klasy Font
(java.awt.Font)
...
Font czcionka = new Font("Havletica",Font.BOLD|Font.ITALIC,25);
setFont(czcionka);
...
Zmianę koloru wyświetlanego tekstu uzyskujemy za
pomocą metody:
setColor(Color). Argumenty to obiekty klasy Color
(java.awt.Color);
Kod przykładu w całości
import java.awt.*;
import javax.swing.*;
class MojPanel extends JPanel {
public void paintComponent(Graphics g){
public class RamkaPanelTekst {
super.paintComponent(g);
Font czcionka = new Font("Havletica",Font.BOLD|
public RamkaPanelTekst() {
Font.ITALIC,25);
}
g.setFont(czcionka);
g.setColor(Color.red);
public static void main(String[] args) {
g.drawString("Ala ma kota", getWidth()/2,getHeight()/2);
MojaRamka ramka = new MojaRamka();
}
ramka.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); }
ramka.setVisible(true);
ramka.setTitle("Moja ramka z tekstem");
}
}
}
class MojaRamka extends JFrame {
public MojaRamka(){
Dimension screenSize =
Toolkit.getDefaultToolkit().getScreenSize();
setSize(screenSize.width/2,screenSize.height/2);
setLocation(screenSize.width/4,screenSize.height/4);
MojPanel panel = new MojPanel();
Container pojemnik = getContentPane();
pojemnik.add(panel);
}
Obsługa zdarzeń
Obsługę zdarzeń w Java realizujemy za pomocą tzw.
Obiektów „słuchaczy”.
● Słuchacz jest instancją klasy, która interpretuje
specjalny interfejs nazywany „interfejsem słuchacza”
● Obiekty będące źródłem zdarzeń (np. Przyciski)
potrafią rejestrować obiekty „słuchaczy” i wysyłać im
obiekty reprezentujące zdarzenia
● Źródła zdarzeń są tak skonstruowane, że wysyłają
obiekty zdarzeń do wszystkich zarejestrowanych
słuchaczy
● Obiekty słuchaczy wykorzystują informacje zawarte w
zdarzeniach do określenia reakcji na dane zdarzenie
Obsługa zdarzeń – przyciski – etap 1
Tworzymy szkielet programu - definiujemy klasę ramki
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class Przyciski {
public Przyciski() {
}
public static void main(String[] args) {
RamkaNaPrzyciski ramka = new RamkaNaPrzyciski(300,150);
ramka.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
ramka.setVisible(true);
}
}
class RamkaNaPrzyciski extends JFrame {
RamkaNaPrzyciski(int szer, int wys){
setTitle("Obsługa zdarzeń - przyciski");
setSize(szer,wys);
}
}
Obsługa zdarzeń – przyciski – etap 2
Tworzymy własną klasę PanelZPrzyciskami i umieszczmy w nim przyciski
class PanelZPrzyciskami extends JPanel {
PanelZPrzyciskami(){
JButton PrzyciskZielony = new JButton("Zielono mi !!!");
JButton PrzyciskCzerwony = new JButton("Czerwono mi !!!");
add(PrzyciskZielony);
add(PrzyciskCzerwony);
}
}
Dodajemy do klasy RamkaNaPrzyciski objekt klasy PanelZPrzyciskami
...
// dodajemy panel do powierzchni zawartości
Container pojemnik = getContentPane();
PanelZPrzyciskami panel = new PanelZPrzyciskami();
pojemnik.add(panel);
...
Obsługa zdarzeń – przyciski – etap 3
Tworzymy klasę wewnętrzna klasy JPanel implementującą klasę ActionListener
class SluchaczPrzycisku implements ActionListener {
SluchaczPrzycisku(Color c){
KolorTla = c;
}
public void actionPerformed(ActionEvent zdarzenie) {
setBackground(KolorTla);
}
}
Color KolorTla;
Tworzymy obiekty „słuchaczy” dla przycisków i integrujemy je z przyciakami w
klasie reprezentującej panel z przyciskami
// tworzymy objekty "słuchaczy" dla przycisków w klasie
SluchaczPrzycisku SluchaczZielonego = new
SluchaczPrzycisku(Color.GREEN);
SluchaczPrzycisku SluchaczCzerwonego = new
SluchaczPrzycisku(Color.RED);
//Przypisujemy je do przycisków
PrzyciskZielony.addActionListener(SluchaczZielonego);
PrzyciskCzerwony.addActionListener(SluchaczCzerwonego);
Całość kodu
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
class PanelZPrzyciskami extends JPanel {
PanelZPrzyciskami(){
JButton PrzyciskZielony = new JButton("Zielono mi !!!");
public class Przyciski {
JButton PrzyciskCzerwony = new JButton("Czerwono mi !!!");
add(PrzyciskZielony);
public Przyciski() {
add(PrzyciskCzerwony);
}
// tworzymy objekty "słuchaczy" dla przycisków
SluchaczPrzycisku SluchaczZielonego = new
SluchaczPrzycisku(Color.GREEN);
public static void main(String[] args) {
SluchaczPrzycisku SluchaczCzerwonego = new
RamkaNaPrzyciski ramka = new RamkaNaPrzyciski(300,150);
ramka.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); SluchaczPrzycisku(Color.RED);
//Przypisujemy je do przycisków
ramka.setVisible(true);
PrzyciskZielony.addActionListener(SluchaczZielonego);
}
PrzyciskCzerwony.addActionListener(SluchaczCzerwonego);
}
class RamkaNaPrzyciski extends JFrame {
RamkaNaPrzyciski(int szer, int wys){
setTitle("Obsługa zdarzeń - przyciski");
setSize(szer,wys);
// dodajemy panel do powierzchni zawartości
Container pojemnik = getContentPane();
PanelZPrzyciskami panel = new PanelZPrzyciskami();
pojemnik.add(panel);
}
}
}
}
class SluchaczPrzycisku implements ActionListener {
SluchaczPrzycisku(Color c){
KolorTla = c;
}
public void actionPerformed(ActionEvent zdarzenie) {
setBackground(KolorTla);
}
Color KolorTla;
}
Modyfikacja
1.) Proszę dodać do poprzedniego projektu
dodatkowy przycisk zmieniający tło na niebieskie.
2.) Wykorzystując metodę System.exit(0) dodać
przycisk „Wyjście” zamykający okienko.
(należy utworzyć dodatkową klasę „słuchacza” do
obsługi tego zdarzenia).