Στοιχεία της εφαρμογής
Οι εφαρμογές μπορούν διαχωριστούν ανάλογα με την μέθοδο διεπαφής με τον χρήστη σε
- Εφαρμογές με γραφική διεπαφή (Graphical User Interface, GUI)
- Εφαρμογές περιβάλλοντος γραμμής εντολών (Command-Line Interface, CLI)
Συστατικά εισαγωγής δεδομένων
- Διάλογοι (javax.swing.JDialog
)
και παράθυρα (javax.swing.JWindow και javax.swing.JFrame
).
- Ετικέτες (javax.swing.JLabel και Κουμπιά (javax.swing.JButton
)
- Λίστες επιλογών (πολλαπλών ή μη) (javax.swing.JList και javax.swing.JComboBox
)
Συστατικά εμφάνισης δεδομένων
- Μπάρες προόδου (javax.swing.JProgressBar
)
- Πίνακες (javax.swing.JTable
)
- Ιεραρχικές δομές δένδρων (javax.swing.JTree
)
- Αόρατα συστατικά (διαχειριστές διάταξης)
Επίδειξη συστατικών
Κατεβάστε και τρέξτε το πρόγραμμα
SwingSet2.jar.
Προγραμματιστική διεπαφή συστατικών
Παράθυρο (javax.swing.JFrame, Κλάση)
- Κατασκευαστής: JFrame(String title)
- Ορισμός μεγέθους παραθύρου: setBounds(int x, int y, int width, int height)
- Καθορισμός τίτλου (εκτός του κατασκευαστή): setTitle(String title)
- Καθορισμός δυναμικού μεγέθους (ή οχι): setResizable(boolean resizable)
- Καθορισμός διαχειριστή διάταξης: setLayout(LayoutManager lm)
- Προσθήκη συστατικού:
- add(Component c)
- Εμφάνιση παραθύρου: setVisible(boolean state)
Παράδειγμα: ένα κενό παράθυρο
Το παρακάτω παράδειγμα δημιουργεί ένα κενό παράθυρο, θέτει ως τίτλο το αλφαριθμητικό "Hello, World!"
και το εμφανίζει.
import javax.swing.JFrame;
public class Window {
public static void main(String[] args) {
JFrame jf = new JFrame("Hello, World!");
jf.setBounds(0, 0, 800, 600);
// Remember, the method show() is deprecated
jf.setVisible(true);
}
}
Προσαρμογή στο τοπικό περιβάλλον
Μπορούμε να δώσουμε στην εφαρμογή την αίσθηση εφαρμογής
φτιαγμένης ειδικά για το λειτουργικό περιβάλλον στο οποίο εκτελείται
με τον παρακάτω κώδικα.
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException e) {
e.printStackTrace();
}
Προγραμματιστική διεπαφή συμβάντων
Κουμπιά (javax.swing.JButton)
- Κατασκευαστής: JButton(String title)
- Εναλλακτικός Κατασκευαστής: JButton(String title, Icon icon)
- Προσθήκη Γεγονότος Επιλογής (click event): addActionListernet(ActionListener l)
Διαχειριστές διάταξης
Οι διαχειριστές διάταξης (layout managers) είναι αόρατα συστατικά που καθορίζουν δυναμικά την τοποθέτηση
των ορατών συστατικών (πχ κουμπιά, πίνακες) στην εφαρμογή. Οι κύριοι διαχειριστές διάταξης είναι:
- FlowLayout (java.awt.FlowLayout)
- BorderLayout (java.awt.BorderLayout)
- GridLayout (java.awt.GridLayout)
Προγραμματιστική διεπαφή διάταξης FlowLayout
FlowLayout (java.awt.FlowLayout)
- Κατασκευαστής: FlowLayout(int align) (
FlowLayout.LEFT, RIGHT, CENTER, LEADING, TRAILING )
- Προσθήκη συστατικού: addLayoutComponent(String name, Component comp)
Παράδειγμα διάταξης FlowLayout
java.awt.FlowLayout
import javax.swing.JFrame;
import javax.swing.JButton;
import java.awt.FlowLayout;
public class FlowLayoutDemo {
public static void main(String[] args) {
JFrame jf = new JFrame("Hello, World!");
jf.setBounds(0, 0, 800, 600);
jf.setLayout(new FlowLayout());
jf.add(new JButton("button 1"));
jf.add(new JButton("button 2"));
jf.add(new JButton("button 3"));
// Remember, the method show() is deprecated
jf.setVisible(true);
}
}
Αποτέλεσμα διάταξης FlowLayout
Προγραμματιστική διεπαφή διάταξης BorderLayout
BorderLayout (java.awt.BorderLayout)
- Κατασκευαστής: BorderLayout()
- Προσθήκη συστατικού: addLayoutComponent(Component comp, Object constraints)
Παράδειγμα διάταξης BorderLayout
java.awt.BorderLayout
import javax.swing.JFrame;
import javax.swing.JButton;
import java.awt.BorderLayout;
public class BorderLayoutDemo {
public static void main(String[] args) {
JFrame jf = new JFrame("Hello, World!");
jf.setBounds(0, 0, 800, 600);
jf.setLayout(new BorderLayout());
jf.add(new JButton("north"), BorderLayout.NORTH);
jf.add(new JButton("south"), BorderLayout.SOUTH);
jf.add(new JButton("center"), BorderLayout.CENTER);
jf.add(new JButton("west"), BorderLayout.WEST);
jf.add(new JButton("east"), BorderLayout.EAST);
// Remember, the method show() is deprecated
jf.setVisible(true);
}
}
Αποτέλεσμα διάταξης BorderLayout
Προγραμματιστική διεπαφή διάταξης GridLayout
GridLayout (java.awt.GridLayout)
- Κατασκευαστής: GridLayout(int rows, int cols)
- Προσθήκη συστατικού: addLayoutComponent(String name, Component comp)
Παράδειγμα διάταξης GridLayout
java.awt.GridLayout
import javax.swing.JFrame;
import javax.swing.JButton;
import java.awt.GridLayout;
public class GridLayoutDemo {
public static void main(String[] args) {
JFrame jf = new JFrame("Hello, World!");
jf.setBounds(0, 0, 800, 600);
jf.setLayout(new GridLayout(3, 2));
jf.add(new JButton("(1, 1)"));
jf.add(new JButton("(1, 2)"));
jf.add(new JButton("(2, 1)"));
jf.add(new JButton("(2, 2)"));
jf.add(new JButton("(3, 1)"));
jf.add(new JButton("(3, 2)"));
// Remember, the method show() is deprecated
jf.setVisible(true);
}
}
Αποτέλεσμα διάταξης GridLayout
Προγραμματισμός με συμβάντα
Η διαδραστικότητα στις εφαρμογές καθορίζεται από προκαθορισμένα συμβάντα. Η νοοτροπία τους είναι πολύ απλή:
- Επιλέγεται ένα γεγονός στο οποίο θέλουμε να επέμβουμε (πάτημα ένος πλήκτρου κτλ)
- Υλοποιόντας την κατάλληλη διεπαφή, γράφουμε το κομμάτι κώδικα που θέλουμε να εκτελεστεί για το συγκεκριμένο γεγονός
- Συσχετίζουμε το κομμάτι αυτό κώδικα με τη λίστα γεγονότων του συστατικού
Τα γεγονότα είναι προκαθορισμένα και αφορούν είσοδο από το πληκτρολόγιο ή το ποντίκι, μετακινήσεις ή διαφοροποίηση του
μεγέθους παραθύρων κτλ. Συνήθως οι κλάσεις που τα υλοποιούν βρίσκονται στο πακέτο
java.awt.event.*.
Παράδειγμα προγραμματισμού με συμβάντα
import javax.swing.JFrame;
import javax.swing.JButton;
import javax.swing.JOptionPane;
import java.awt.BorderLayout;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
public class EventDemo {
class AlertAction implements ActionListener {
private JFrame parent;
AlertAction(JFrame parent) {
this.parent = parent;
}
@Override public void actionPerformed(ActionEvent e) {
JOptionPane.showMessageDialog(parent, "information", "Button Pressed!!", JOptionPane.INFORMATION_MESSAGE);
}
}
public EventDemo() {
JFrame jf = new JFrame("Hello, World!");
JButton jb = new JButton("Click Me!");
jf.setBounds(0, 0, 800, 600);
jf.setLayout(new BorderLayout());
jf.add(jb, BorderLayout.CENTER);
jb.addActionListener(new AlertAction(jf));
// Remember, the method show() is deprecated
jf.setVisible(true);
}
public static void main(String[] args) {
new EventDemo();
}
}
Αποτέλεσμα προγραμματισμού με συμβάντα
Συντεταγμένες γραφικών
- Η ανάλυση των εφαρμογών καθορίζεται κουκίδες (pixels)
- Κάθε χιλιοστό έχει περίπου 3 κουκίδες
- Η ανάλυση ορίζεται από τον αριθμό των κουκίδων στον κατακόρυφο και τον οριζόντιο άξονα, πχ. 800x600 σημαίνει ότι έχουμε 800 κουκίδες στον οριζόντιο και 600 στον κατακόρυφο άξονα.
- Τυπικές αναλύσεις είναι 1280x1024, 1920x1080 (Full-HD), 3840 2160 (4k, UHD-1)
- Τα προγράμματα της Java χρησιμοποιούν το παραπάνω σύστημα συντεταγμένων για να τοποθετούν τα παράθυρα και τα συστατικά μέσα σε αυτά.
- Επίσης όλες οι συναρτήσεις χαμηλού επιπέδου λειτουργούν με βάση αυτή την σύμβαση
Συντεταγμένες γραφικών (διάγραμμα)
Κλάση προγραμματιστικής διεπαφής χαμηλού επιπέδου
java.awt.Graphics
- Η κλάση java.awt.Graphics περιέχει την κατάσταση που χρειάζονται οι μέθοδοι σχεδίασης (επιφάνεια, χρώμα, γραμματοσειρά, σύστημα συντεταγμένων, τρόπος σχεδίασης, κ.λπ.)
- Η κλάση java.awt.Graphics δεν έχει δημόσιο κατασκευαστή. Συνήθως αποκτούμε πρόσβαση στο αντικείμενο Graphics κάποιου συστατικού μέσω της μεθόδου paint(Graphics g) ή update(Graphics g)
Μέθοδοι χαμηλού επιπέδου
- Καθορισμός χρώματος: setColor(Color c)
- Καθορισμός γραμματοσειράς: setFont(Font f)
- Σχεδίαση ευθείας γραμμής: drawLine(int x1, int y1, int x2, int y2)
- Σχεδίαση κύκλου: drawOval(int x, int y, int width, int height)
- Σχεδίαση κύκλου με χρώμα: fillOval(int x, int y, int width, int height)
- Σχεδίαση παραλληλογράμμου: drawRect(int x, int y, int width, int height)
- Σχεδίαση παραλληλογράμμου με χρώμα: fillRect(int x, int y, int width, int height)
- Σχεδίαση εικόνας: drawImage(Image img, int x, int y, ImageObserver observer)
Παράδειγμα: Σχεδίαση κειμένου
Όλες οι συναρτήσεις χαμηλού επιπέδου υλοποιούνται στην κλάση
java.awt.Graphics.
- Για να σχεδιαστεί κείμενο χρησιμοποιούμε την συνάρτηση java.awt.Graphics.drawString(String, int, int)
- Για να επιλέξουμε γραμματοσειρά χρησιμοποιούμε την συνάρτηση java.awt.Graphics.setFont(Font) που δέχεται ως παράμετρο την κλάση java.awt.Font
Η κλάση
java.awt.Font διαθέτει κατασκευαστή που δέχεται 3 παραμέτρους:
- Το τύπο της γραμματοσειράς, Sans Serif, Serif κτλ
- Το στυλ της γραματοσειράς, Italic, Bold, κτλ
- Το μέγεθος σε στιγμές (points), 12, 13 κτλ
Κώδικας: Σχεδίαση κειμένου
import javax.swing.JFrame;
import javax.swing.JComponent;
import java.awt.BorderLayout;
import java.awt.Graphics;
import java.awt.Font;
public class TextDemo {
class GraphicPane extends JComponent {
public GraphicPane() {
super();
}
@Override public void paint(Graphics g) {
g.setFont(new Font(Font.SANS_SERIF, Font.ITALIC, 14));
g.drawString("Hello, World!", 30, 30);
}
}
public TextDemo() {
JFrame jf = new JFrame("Hello, World!");
GraphicPane gp = new GraphicPane();
jf.setBounds(0,0, 800, 600);
jf.setLayout(new BorderLayout());
jf.add(gp, BorderLayout.CENTER);
// Remember, the method show() is deprecated
jf.setVisible(true);
}
public static void main(String[] args) {
new TextDemo();
}
}
Αποτέλεσμα: Σχεδίαση κειμένου
Παράδειγμα: Χειρισμός χρωμάτων
Ο χειρισμός των χρωμάτων γίνεται μέσω της κλάσης
java.awt.Color.
import javax.swing.JFrame;
import javax.swing.JComponent;
import java.awt.BorderLayout;
import java.awt.Graphics;
import java.awt.Font;
import java.awt.Color;
public class ColorDemo {
class GraphicPane extends JComponent {
public GraphicPane() {
super();
}
@Override public void paint(Graphics g) {
g.setFont(new Font(Font.SANS_SERIF, Font.ITALIC, 14));
g.setColor(Color.ORANGE);
g.drawString("Hello, World! (orange)", 30, 30);
g.setColor(new Color(250, 100, 120));
g.drawString("Hello, World! (red ... almost)", 80, 80);
}
}
public ColorDemo() {
JFrame jf = new JFrame("Hello, World!");
GraphicPane gp = new GraphicPane();
jf.setBounds(0,0, 800, 600);
jf.setLayout(new BorderLayout());
jf.add(gp, BorderLayout.CENTER);
// Remember, the method show() is deprecated
jf.setVisible(true);
}
public static void main(String[] args) {
new ColorDemo();
}
}
Αποτέλεσμα: Χειρισμός χρωμάτων
Παράδειγμα: Σχεδίαση σχημάτων
- Όλες οι συναρτήσεις που αφορούν τη σχεδίαση σχημάτων, είναι υλοποιημένες στην κλάση java.awt.Graphics.
- Υπάρχει δυνατότητα για τη σχεδίαση των βασικών σχημάτων, όπως γραμμές, κύκλους, τετράγωνα κτλ.
- Όλες αυτές οι συναρτήσεις δουλεύουν σε συνδυασμό με τις συναρτήσεις για τον καθορισμό των χρωμάτων, όπως ακριβώς και στη σχεδίαση γραμματοσειρών.
Κώδικας: Σχεδίαση σχημάτων
import javax.swing.JFrame;
import javax.swing.JComponent;
import java.awt.BorderLayout;
import java.awt.Graphics;
import java.awt.Font;
import java.awt.Color;
public class ShapeDemo {
class GraphicPane extends JComponent {
public GraphicPane() {
super();
}
@Override public void paint(Graphics g) {
//// line
g.setColor(Color.BLACK);
// drawLine(int x1, int y1, int x2, int y2)
g.drawLine(0, 0, 100, 100);
//// ovals
g.setColor(new Color(250, 100, 120));
// drawOval(int x, int y, int width, int height)
g.drawOval(30, 30, 100, 200);
// same, but it fills the oval with the current color
g.fillOval(300, 30, 100, 200);
//// Rectangle
g.setColor(Color.BLUE);
// drawRect(int x, int y, int width, int height)
g.drawRect(30, 300, 100, 200);
// fillRect(int x, int y, int width, int height)
g.fillRect(300, 300, 100, 200);
}
}
public ShapeDemo() {
JFrame jf = new JFrame("Hello, World!");
GraphicPane gp = new GraphicPane();
jf.setBounds(0,0, 800, 600);
jf.setLayout(new BorderLayout());
jf.add(gp, BorderLayout.CENTER);
// Remember, the method show() is deprecated
jf.setVisible(true);
}
public static void main(String[] args) {
new ShapeDemo();
}
}
Αποτέλεσμα: Σχεδίαση σχημάτων
Παράδειγμα: Αρχεία εικόνων
Η βιβλιοθήκες που παρέχονται μαζί με το περιβάλλον ανάπτυξης της Java, υποστηρίζουν την επεξεργασία εικόνων
μέσω των πακέτων
java.awt.image.* και
javax.imageio.*.
import javax.swing.JFrame;
import javax.swing.JComponent;
import javax.imageio.ImageIO;
import java.io.File;
import java.io.IOException;
import java.awt.BorderLayout;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
public class ImageDemo {
class GraphicPane extends JComponent {
private BufferedImage bi;
private JFrame parent;
public GraphicPane(JFrame parent) {
this.parent = parent;
try {
// reads a file
this.bi = ImageIO.read(new File("planes.jpg"));
} catch (IOException ioe) {
System.err.println("Could not load image");
}
}
@Override public void paint(Graphics g) {
// drawImage(Image img, int x, int y, ImageObserver observer)
g.drawImage(bi, 0, 0, parent);
}
}
public ImageDemo() {
JFrame jf = new JFrame("Hello, World!");
GraphicPane gp = new GraphicPane(jf);
jf.setBounds(0,0, 800, 600);
jf.setLayout(new BorderLayout());
jf.add(gp, BorderLayout.CENTER);
jf.setVisible(true);
}
public static void main(String[] args) {
new ImageDemo();
}
}
Αποτέλεσμα: Αρχεία εικόνων
Άσκηση: Μία απλή γραφική εφαρμογή
Άσκηση 9
Μπορείτε να κατεβάσετε το αντίστοιχο αρχείο και να στείλετε τους
βαθμούς σας από τους δεσμούς που βρίσκονται στη
σελίδα των ασκήσεων.
Βιβλιογραφία
- Joyce Farrell. Java: Εκμάθηση με πρακτικά παραδείγματα. 2η έκδοση. Εκδόσεις Κριτική, Αθήνα 2024. Κεφ. 14.
- Rogers CadenheadΠλήρες εγχειρίδιο της Java 12Όγδοη έκδοση. Εκδόσεις Μ. Γκιούρδας, Αθήνα 2023. Κεφ. 13, 14.
- Herbert Schildt. Οδηγός της Java 7. 5η έκδοση. Εκδόσεις Γκιούρδας Μ., Αθήνα 2012. Κεφ. 15.
- Harvey M. Deitel και Paul J. Deitel. Java Προγραμματισμός, 6η έκδοση. Εκδόσεις Μ. Γκιούρδας, Αθήνα 2005. Κεφάλαια 11, 12, 20-22.
- Else Lervik και Vegard B. Havdal Java με UML. Εκδόσεις Κλειδάριθμος 2005. Κεφάλαια 13-15.
- Rogers Cadenhead και Laura Lemay Πλήρες εγχειρίδιο της Java 2 Εκδόσεις Μ. Γκιούρδας, Αθήνα 2003. κεφ. 8-13
- Herbert Schildt Herb Schild's Java έτοιμες συνταγές Εκδόσεις Μ. Γκιούρδας, Αθήνα 2009. κεφ. 8
- Max K.
Agoston.
Computer Graphics and Geometric Modeling: Implementation and
Algorithms.
Springer Verlag, 2005.
- Max K.
Agoston.
Computer Graphics and Geometric Modeling: Mathematics.
Springer Verlag, 2005.
- Leen
Ammeraal and Kang Zhang.
Computer Graphics for Java Programmers.
Wiley, 2007.
- Antonio Cavedoni.
Introducing the
new system fonts.
Talk given at Apple WWDC 2015 - Session 804.
- Casey Read
and Ben Fry.
Processing: A Programming Handbook for Visual Designers and
Artists.
MIT Press, Cambridge, MA, 2007.
- Thomas Strothotte and Stefan
Schlechtweg.
Non-Photorealistic Computer Graphics.
Morgan Kaufmann, San Francisco, 2002.
- Edward R. Tufte.
The Visual Display of Quantitative Information.
Graphics Press, Cheshire, CT, 1983.
- Alan
Watt and Fabio Policarpo.
The Computer Image.
Addison Wesley, 1998.
Ευχαριστίες
Ευχαριστίες στο Βασίλη Καρακόιδα για την καθοριστική συνεισφορά του στη
συγγραφή της ενότητας αυτής των σημειώσεων.
Περιεχόμενα