1. Úvod – co toto téma řeší
Téma kombinuje dvě oblasti: grafiku v Javě (kreslení do okna, tvary, text, obrázky) a
práci s databází pomocí rozhraní JDBC. Cílem je umět vysvětlit principy a ukázat
jednoduché příklady kódu.
- Java grafika: AWT/Swing, třída
Graphics, Graphics2D, vykreslování tvarů a obrázků.
- Databáze: připojení k databázi, SQL dotazy,
Statement, PreparedStatement, ResultSet.
2. Java grafika – základní principy
2.1 AWT a Swing
Pro klasickou desktopovou grafiku se v Javě používají hlavně knihovny AWT a Swing.
Kreslení probíhá do komponent (např. JPanel) pomocí objektu Graphics.
- AWT (Abstract Window Toolkit) – základní okna, komponenty, třída
Graphics.
- Swing – novější GUI knihovna, komponenty jako
JFrame, JPanel, JButton…
- Kreslení se typicky provádí v metodě
paintComponent(Graphics g) u potomka JPanel.
2.2 Kreslení v paintComponent(Graphics g)
Pro vlastní kreslení vytvoříme třídu, která dědí z JPanel, a přepíšeme metodu
paintComponent. Vždy voláme super.paintComponent(g), aby se panel správně vyčistil.
import javax.swing.*;
import java.awt.*;
public class Platno extends JPanel {
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g); // vyčištění pozadí
// základní tvary
g.drawLine(10, 10, 200, 200);
g.drawRect(50, 50, 100, 80);
g.drawOval(50, 150, 100, 100);
// změna barvy a vyplněný obdélník
g.setColor(Color.RED);
g.fillRect(200, 50, 120, 80);
// text
g.setColor(Color.BLACK);
g.drawString("Ahoj grafiko!", 50, 280);
}
}
2.3 Vytvoření okna a přidání plátna
Pro zobrazení grafiky vytvoříme JFrame, nastavíme velikost, přidáme instanci našeho panelu a okno zobrazíme.
public class OknoGrafika {
public static void main(String[] args) {
JFrame okno = new JFrame("Grafika v Javě");
okno.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
okno.setSize(400, 400);
okno.add(new Platno()); // naše třída s paintComponent
okno.setLocationRelativeTo(null); // vycentrování
okno.setVisible(true);
}
}
Princip: Swing se stará o překreslování komponent. Kdykoli je potřeba překreslit okno,
zavolá se metoda paintComponent(), kde máme vlastní kreslení.
3. Základní grafické operace
3.1 Základní metody třídy Graphics
| Metoda |
Popis |
drawLine(x1, y1, x2, y2) |
nakreslí úsečku mezi dvěma body |
drawRect(x, y, w, h) |
obrys obdélníku |
fillRect(x, y, w, h) |
vyplněný obdélník |
drawOval(x, y, w, h) |
elipsa vepsaná do obdélníku |
drawString(text, x, y) |
vykreslení textu |
setColor(Color c) |
nastavení aktuální barvy kreslení |
setFont(Font f) |
nastavení písma pro text |
3.2 Double buffering
Double buffering znamená, že se kreslí nejdříve do skrytého bufferu a až hotový obraz se
překreslí na obrazovku. Tím se zabrání blikání. Swing to ve výchozím stavu řeší automaticky, takže
programátor se o to většinou starat nemusí.
4. Java2D – rozšířená grafika
4.1 Graphics2D
Třída Graphics2D je rozšířením Graphics a umožňuje pokročilejší operace:
tloušťka čáry, transformace, antialiasing, složitější tvary.
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2 = (Graphics2D) g;
// tlustší čára
g2.setStroke(new BasicStroke(5));
g2.setColor(Color.BLUE);
g2.drawLine(20, 20, 200, 20);
}
4.2 Transformace – rotace, škálování, posun
Pomocí transformací můžeme objekt otočit, zvětšit/zmenšit nebo posunout.
Graphics2D g2 = (Graphics2D) g;
// rotace o 45° kolem bodu (100, 100)
g2.rotate(Math.toRadians(45), 100, 100);
g2.drawRect(80, 80, 100, 50);
4.3 Antialiasing
Antialiasing vyhlazuje hrany tvarů a textu, aby nebyly „zubaté“.
Graphics2D g2 = (Graphics2D) g;
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
5. Práce s obrázky v Javě
5.1 Načtení obrázku
Obrázky lze načítat pomocí třídy ImageIO do objektu BufferedImage.
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
BufferedImage img = ImageIO.read(new File("obrazek.png"));
5.2 Vykreslení obrázku
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawImage(img, 0, 0, null); // vykreslení v původní velikosti
}
5.3 Změna velikosti při vykreslení
g.drawImage(img, 0, 0, 200, 200, null); // šířka 200, výška 200
6. Práce s databází v Javě – JDBC
6.1 Co je JDBC
JDBC (Java Database Connectivity) je rozhraní, které umožňuje Javě komunikovat s relačními
databázemi (MySQL, PostgreSQL, SQLite, Oracle…). Programátor používá jednotné API, konkrétní databáze dodává
svůj JDBC driver.
Myšlenka: Java aplikace posílá SQL dotazy přes JDBC driver do databáze a získává výsledky
jako ResultSet.
6.2 Základní kroky práce s JDBC
- Načtení JDBC driveru (většinou automaticky přes knihovnu).
- Vytvoření připojení – objekt
Connection.
- Vytvoření SQL dotazu –
Statement nebo PreparedStatement.
- Provedení dotazu –
executeQuery() nebo executeUpdate().
- Zpracování výsledků – objekt
ResultSet.
- Uzavření připojení a uvolnění zdrojů.
7. Připojení k databázi
7.1 Připojení k MySQL
Příklad připojení k databázi skola na lokálním MySQL serveru:
import java.sql.*;
public class PripojeniMySQL {
public static void main(String[] args) throws Exception {
String url = "jdbc:mysql://localhost:3306/skola";
String user = "root";
String pass = "";
Connection con = DriverManager.getConnection(url, user, pass);
System.out.println("Připojeno k databázi!");
con.close();
}
}
7.2 Připojení k SQLite
U SQLite se připojujeme k souboru databáze:
Connection con = DriverManager.getConnection("jdbc:sqlite:moje.db");
Pozor: Aby připojení fungovalo, musí být v projektu správně přidán JDBC driver
(např. mysql-connector-j pro MySQL, sqlite-jdbc pro SQLite).
8. SQL dotazy přes JDBC
8.1 SELECT – načtení dat
Pro dotazy, které vrací data (SELECT), používáme metodu executeQuery(), která vrací
ResultSet.
String sql = "SELECT * FROM studenti";
Statement st = con.createStatement();
ResultSet rs = st.executeQuery(sql);
while (rs.next()) {
String jmeno = rs.getString("jmeno");
int vek = rs.getInt("vek");
System.out.println(jmeno + " (" + vek + ")");
}
8.2 INSERT – vložení dat
Pro změnové dotazy (INSERT, UPDATE, DELETE) používáme executeUpdate(), která vrací počet
ovlivněných řádků.
String sql = "INSERT INTO studenti (jmeno, vek) VALUES ('Adam', 20)";
int radky = st.executeUpdate(sql);
System.out.println("Vloženo řádků: " + radky);
8.3 UPDATE – úprava dat
String sql = "UPDATE studenti SET vek = 21 WHERE jmeno = 'Adam'";
st.executeUpdate(sql);
8.4 DELETE – smazání dat
String sql = "DELETE FROM studenti WHERE jmeno = 'Adam'";
st.executeUpdate(sql);
9. PreparedStatement – bezpečnější dotazy
Třída PreparedStatement umožňuje používat v SQL dotazu parametry (otazníky) a
hodnoty doplňovat až v kódu. Je to:
- bezpečnější – chrání proti SQL injection,
- přehlednější – oddělení SQL a dat,
- efektivnější – databáze může dotaz znovu použít.
9.1 Příklad INSERT s PreparedStatement
String sql = "INSERT INTO studenti (jmeno, vek) VALUES (?, ?)";
PreparedStatement ps = con.prepareStatement(sql);
ps.setString(1, "Karel");
ps.setInt(2, 19);
ps.executeUpdate();
9.2 Příklad SELECT s parametrem
String sql = "SELECT * FROM studenti WHERE vek > ?";
PreparedStatement ps = con.prepareStatement(sql);
ps.setInt(1, 18);
ResultSet rs = ps.executeQuery();
while (rs.next()) {
System.out.println(rs.getString("jmeno"));
}
SQL injection: Pokud skládáme SQL dotaz řetězcem z uživatelského vstupu
(např. "... WHERE jmeno = '" + vstup + "'" ), může útočník vložit škodlivý SQL kód.
PreparedStatement tomu brání tím, že parametry posílá odděleně.
10. ResultSet a uzavření zdrojů
10.1 Čtení hodnot z ResultSet
Z ResultSet čteme hodnoty podle názvu sloupce nebo indexu (od 1).
while (rs.next()) {
String jmeno = rs.getString("jmeno");
int vek = rs.getInt("vek");
double prumer = rs.getDouble("prumer");
boolean aktivni = rs.getBoolean("aktivni");
}
10.2 Uzavření zdrojů
Po skončení práce je nutné zavřít všechny zdroje – ResultSet, Statement a
Connection.
rs.close();
st.close();
con.close();
Dobrá praxe: V moderní Javě se často používá konstrukce
try-with-resources, která se postará o automatické zavření zdrojů.
11. Shrnutí tématu 9
Java grafika
- AWT/Swing – kreslení do
JPanel v metodě paintComponent().
- Třída
Graphics – čáry, obdélníky, elipsy, text.
Graphics2D – tloušťka čáry, transformace, antialiasing.
- Práce s obrázky –
BufferedImage, ImageIO.read(), drawImage().
Práce s databází (JDBC)
- JDBC – rozhraní pro komunikaci s databází.
- Připojení přes
DriverManager.getConnection().
- SQL dotazy –
Statement, executeQuery(), executeUpdate().
PreparedStatement – parametry, bezpečnost proti SQL injection.
ResultSet – čtení výsledků, uzavření zdrojů.