Artykuł będzie stanowił drugą część tematu o "paintComponent" w "Swing" 2️⃣. Pokażę Ci co nam daje rzutowanie typu "Graphics" na "Graphics2D" w "Swing" 😲. Możesz w ten sposób otworzyć sobie drogę do jeszcze więcej metod rysujących 😊! Zapraszam!
"GRAPHICS2D" W "SWING" KRYJE W SOBIE WIĘCEJ METOD DO RYSOWANIA PO PANELU!
Materiał kontynuuje zagadnienie metody "paintComponent", także jeżeli w tym momencie drapiesz się po głowie, przeczytaj najpierw część wprowadzającą 📖.
DOSTĘP DO "GRAPHICS2D"
Jak już wiesz i miałeś(-aś) okazję zobaczyć postać metody, posiada jeden parametr typu "Graphics". To właśnie dzięki niemu, możesz narysować konkretną figurę lub wskazany obrazek na obszar panelu (komponentu "JPanel") 👍. Nawet w parametrze, Java może zaskoczyć swoimi sekretami 😏...
"Graphics" zapewnia większość metod przeznaczonych do rysowania figur, lecz to nie są wszystkie, z jakich możemy skorzystać 😳. Wykonując rzutowanie parametru na typ "Graphics2D", możesz uzyskać dostęp do jeszcze większej liczby metod rysujących 😄! Wystarczy, że w metodzie "paintComponent", wstawisz taką oto instrukcję 👇:
var graphics2D = (Graphics2D)graphics;Rzutując na klasę "Graphics2D" w "Swing" (która, jak łatwo się domyślić, jest klasą dziedziczącą od "Graphics"), dysponujemy o wiele większą liczba metod manipulujących obrazem.
Swoją drogą, możesz ominąć wstawiania typu danych podczas definiowania zmiennej lokalnej, korzystając ze słowa kluczowego "var" ℹ️.
PRZYKŁAD KODU ŹRÓDŁOWEGO
A teraz szybki przykład kodu, który w większości przyjmuje identyczną postać, jak w poprzednim artykule 😉.
KLASA "MAIN"
public class Main {
public static void main(String[] args) {
SwingUtilities.invokeLater(MainJFrame::new);
}
}Ta sama klasa uruchomieniowa, jak poprzednio 🙂.
KLASA "MAINJFRAME"
import java.awt.*;
import javax.swing.*;
public class MainJFrame extends JFrame {
private final MainJPanel mainJPanel = new MainJPanel();
public MainJFrame() {
configureFrame();
addPanelToFrame();
}
private void configureFrame() {
setTitle("Rysowanie przez metodę paintComponent w Swing");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);
setResizable(false);
setSize(512, 512);
setLocationRelativeTo(null);
}
private void addPanelToFrame() {
getContentPane().add(BorderLayout.CENTER, mainJPanel);
}
}Ta sama nasza klasa "JFrame", jak poprzednio 😁!
KLASA "MAINJPANEL"
import java.awt.*;
import java.awt.geom.Line2D;
import javax.swing.*;
public class MainJPanel extends JPanel {
@Override
protected void paintComponent(Graphics graphics) {
super.paintComponent(graphics);
var graphics2D = (Graphics2D)graphics;
graphics2D.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
graphics2D.setStroke(new BasicStroke(4));
graphics.setColor(Color.BLUE);
graphics.drawOval(16, 16, 480, 450);
drawLine(graphics2D);
}
private void drawLine(Graphics2D graphics2D) {
var x = 32;
var y = 16;
var width = 512 - x*2;
graphics2D.setColor(Color.RED);
graphics2D.draw(new Line2D.Float(x, y, x + width, y));
}
}Zmiany są jedynie w tej klasie 😉. Po wykonaniu rzutowania typu na "Graphics2D", możemy skorzystać z wielu dodatkowych metod niedostępnych w typie "Graphics" 💡. Wstawiłem 3 następujące przykłady (zachęcam do zajrzenia do dokumentacji, jeśli interesują Cię szczegóły 😀) 👇:
- "setRenderingHint" (jednym zdaniem, wpływanie na poszczególne atrybuty grafiki, takie jak wygładzanie krawędzi figur, wygładzanie krawędzi tekstu, "dithering" i inne),
- "setStroke" (regulacja "grubości" linii figur),
- "draw" (rysowanie dowolnej figury jako typ "Shape" - tutaj jest rysowanie linii).
W powyższym przykładzie, wywołanie metody "setRenderingHint" z podanymi parametrami, przyniesie bardzo przyjemny efekt wizualny w postaci wygładzonych krawędzi rysowanych figur, dzięki czemu nasza elipsa z poprzedniej części, będzie wyglądać przepięknie 🤩!
Dla rysowania linii metodą "draw", zdefiniowałem osobną metodę ("drawLine"). Ponieważ "draw" umożliwia rysowanie dowolnego niestandardowego obiektu, trzeba normalnie utworzyć obiekt typu "Shape" (albo dziedziczący po nim). Dodajemy konstruktor tworzący zwykłą linię rysującą odcinek pomiędzy dwoma punktami (po 2 parametry na punkt ℹ️), natomiast taki zapis pozwala nam na wstawienie współrzędnych zmiennoprzecinkowych 👍! Gdybyśmy chcieli użyć metody "drawLine" do rysowania linii i wstawić ułamkowe wartości, wystąpiłby błąd kompilacji ⚠️. "Line2D.Float" (jak również "Double"), wymaga importu pakietu "java. awt.geom.Line2D".
Uruchomienie powyższego programu, przyniesie taki efekt końcowy 👇:
![]() |
Wygląd narysowanych figur na nałożonym komponencie "JPanel" przy użyciu typu "Graphics2D" w "Swing".
Cudnie 😅!
CO MOŻE CI ZAOFEROWAĆ "GRAPHICS2D"?
Poniżej zostawiam kilka przykładów mogących Cię zaciekawić możliwościami jakie zawiera klasa "Graphics2D" w "Swing" 👇:
- "fill" (rysowanie dowolnej figury typu "Shape" wypełnionej od środka),
- "rotate" (obracanie figurami rysowanymi w kolejnych wywołaniach),
- "translate" (przesunięcie całego płótna o podaną liczbę pikseli w obu osiach).
Tych metod jest o wiele więcej, natomiast nie ma sensu powielać oficjalnej dokumentacji Oracle w tej sprawie 😅.
To tyle 😊!
NASTĘPNY ARTYKUŁ: FlowLayout w Swing. Układ komponentu JPanel
