Spis treści

REVEAL theme=simple&disableLayout=0&transition=none&controls=1&show_progress_bar=1&build_all_lists=0&show_image_borders=0&horizontal_slide_level=2&enlarge_vertical_slide_headers=0&show_slide_details=1&open_in_new_window=1&size=1024×768

<html> <style type=„text/css”> p { text-align: left; } .reveal { font-size: 30px; } .reveal section { width: 96%; margin: 0 auto; } .reveal .slides { width: 60% !important; } .reveal ul, .reveal ol { margin-left: 1.5em; } .reveal pre code {

height: 100%;
max-height: 100%;
box-sizing: border-box;

} </style> </html>

Graficzne interfejsy użytkownika - AWT

AWT - Abstract Window Toolkit

Hierarchia klas AWT - najważniejsze elementy

Hierarchia klas AWT

Component i Container

Komponenty AWT - szybki przegląd

Kontenery AWT i okna

Praca z Frame - minimalny szkielet

import java.awt.*;
import java.awt.event.*;
 
public class MainWindow {
    public static void main(String[] args) {
        Frame frame = new Frame("AWT - Demo");
        frame.setSize(500, 300);
        frame.setLayout(new FlowLayout());
        frame.add(new Label("Witaj w AWT"));
 
        frame.addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent e) {
                frame.dispose();
                System.exit(0);
            }
        });
 
        frame.setVisible(true);
    }
}

LayoutManager

Najczęstsze układy: FlowLayout, BorderLayout, GridLayout

Panel p = new Panel(new GridLayout(2, 2));
p.add(new Button("A"));
p.add(new Button("B"));
p.add(new Button("C"));
p.add(new Button("D"));

Model zdarzeń AWT

Przepływ:

  1. użytkownik wykonuje akcję (np. kliknięcie przycisku),
  2. AWT tworzy obiekt zdarzenia (np. ActionEvent),
  3. zarejestrowany listener otrzymuje callback i wykonuje logikę.

Najważniejsze interfejsy listenerów

Klasy adapterów - mniej kodu boilerplate

frame.addWindowListener(new WindowAdapter() {
    @Override
    public void windowClosing(WindowEvent e) {
        System.exit(0);
    }
});

Trzy style obsługi zdarzeń

  1. Osobna klasa implementująca listener (najczytelniejsze przy większym kodzie)
  2. Klasa wewnętrzna (łatwy dostęp do pól klasy zewnętrznej)
  3. Klasa anonimowa / lambda (krótki kod, gdy logika jest mała)
Button b = new Button("Policz");
TextField tf = new TextField(10);
 
b.addActionListener(e -> {
    String text = tf.getText().trim();
    System.out.println("Dane: " + text);
});

Rysowanie w AWT: Graphics + Canvas

class DrawingCanvas extends Canvas {
    @Override
    public void paint(Graphics g) {
        g.setColor(Color.BLUE);
        g.drawString("AWT Canvas", 20, 30);
        g.setColor(Color.RED);
        g.fillOval(20, 50, 120, 80);
    }
}

paint() vs repaint()

Dobre praktyki i typowe pułapki

Ćwiczenia praktyczne

Zadanie 6: Minutnik w AWT

Stwórz w bibliotece AWT prostą aplikację typu minutnik, która odlicza czas od wartości podanej przez użytkownika do 0.

Wymagania:

lub wyświetleniem komunikatu w oknie dialogowym.

Przykładowy wygląd aplikacji:

Minutnik AWT - przykładowy interfejs

Materiały dodatkowe