0% found this document useful (0 votes)
28 views

Java POO Curs11

This document discusses Swing graphical user interface programming in Java. It covers topics like using tables, handling events on tables, trees and cells, custom renderers and editors, and basic graphics concepts like drawing, fonts and colors. Examples are provided for initializing and populating tables from data, listening to cell and selection events, rendering custom nodes in trees, and performing basic drawing on a Canvas.

Uploaded by

Cedric Dabija
Copyright
© Attribution Non-Commercial (BY-NC)
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
28 views

Java POO Curs11

This document discusses Swing graphical user interface programming in Java. It covers topics like using tables, handling events on tables, trees and cells, custom renderers and editors, and basic graphics concepts like drawing, fonts and colors. Examples are provided for initializing and populating tables from data, listening to cell and selection events, rendering custom nodes in trees, and performing basic drawing on a Canvas.

Uploaded by

Cedric Dabija
Copyright
© Attribution Non-Commercial (BY-NC)
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 38

Interfa a grafic!

cu utilizatorul - Swing

Programare Orientat! pe Obiecte

Tabele
Ini ializarea String[] coloane = {"Nume", "Varsta", "Student"}; Object[][] elemente = { {"Ionescu", new Integer(20), Boolean.TRUE}, {"Popescu", new Integer(80), Boolean.FALSE}}; JTable tabel = new JTable(elemente, coloane);

Folosirea unui model


ModelTabel model = new ModelTabel(); JTable tabel = new JTable(model); ... class ModelTabel extends AbstractTableModel { String[] coloane = {"Nume", "Varsta", "Student"}; Object[][] elemente = { {"Ionescu", new Integer(20), Boolean.TRUE}, {"Popescu", new Integer(80), Boolean.FALSE}}; public int getColumnCount() {return coloane.length;} public int getRowCount() {return elemente.length;} public Object getValueAt(int row, int col) { return elemente[row][col]; } public String getColumnName(int col) { return coloane[col]; } public boolean isCellEditable(int row, int col) { // Doar numele este editabil return (col == 0); } }

Tratarea evenimentelor
1. Generate de editarea celulelor public class Listener implements TableModelListener { public void tableChanged(TableModelEvent e) { // Aflam celula care a fost modificata int row = e.getFirstRow(); int col = e.getColumn(); TableModel model = (TableModel)e.getSource(); Object data = model.getValueAt(row, col); ... } } ... tabel.getModel().addTableModelListener(new Listener());

Tratarea evenimentelor
2. Generate de selectarea liniilor class Listener implements ListSelectionListener { public void valueChanged(ListSelectionEvent e) { if (e.getValueIsAdjusting()) return; ListSelectionModel model = (ListSelectionModel)e.getSource(); int index = model.getMinSelectionIndex(); // Linia cu numarul index este prima selectata ... } } } ... tabel.setSelectionMode(ListSelectionModel.SINGLE_SE LECTION); ListSelectionModel model = tabel.getSelectionModel(); model.addListSelectionListener(new Listener());

Tratarea evenimentelor
3. Generate de selectarea coloanelor class colSL implements ListSelectionListener { public void valueChanged(ListSelectionEvent e) { if (e.getValueIsAdjusting()) return; ListSelectionModel model = (ListSelectionModel)e.getSource(); int index = model.getMinSelectionIndex(); // coloana cu numarul index este prima selectata ... } } } ... ListSelectionModel colSM= tab.getColumnModel().getSelectionModel(); colSM.addListSelectionListener(new colSL());

Folosirea unui renderer


public class MyRenderer extends JLabel implements TableCellRenderer { public Component getTableCellRendererComponent(..) { ... return this; } }

Folosirea unui editor


public class MyEditor extends AbstractCellEditor implements TableCellEditor { public Object getCellEditorValue() { // Returneaza valoarea editata ... } public Component getTableCellEditorComponent(...) { // Returneaza componenta de tip editor ... } }

Arbori
String text = "Radacina"; DefaultMutableTreeNode root = new DefaultMutableTreeNode(text); DefaultMutableTreeNode numere = new DefaultMutableTreeNode ("Numere"); DefaultMutableTreeNode siruri = new DefaultMutableTreeNode ("Siruri"); for(int i=0; i<3; i++) { numere.add(new DefaultMutableTreeNode(new Integer(i))); siruri.add(new DefaultMutableTreeNode("Sirul " + i)); } root.add(numere); root.add(siruri); JTree tree = new JTree(root);

Tratarea evenimentelor
class Listener implements TreeSelectionListener { public void valueChanged(TreeSelectionEvent e) { // Obtinem nodul selectat DefaultMutableTreeNode node = (DefaultMutableTreeNode) tree.getLastSelectedPathComponent(); if (node == null) return; // Obtinem informatia din nod Object nodeInfo = node.getUserObject(); ... } } ... // Stabilim modul de selectie tree.getSelectionModel().setSelectionMode( TreeSelectionModel.SINGLE_TREE_SELECTION); // Adaugam un ascultator tree.addTreeSelectionListener(new Listener());

Personalizarea nodurilor
TreeCellRenderer setRootVisible setShowsRootHandles: dac! nodurile de pe primul nivel au simboluri care s! permit! expandarea sau restrngerea lor. putClientProperty: stabile$te diverse propriet! i, cum ar fi modul de reprezentare a rela iilor (liniilor) dintre nodurile p!rinte $i fiu: tree.putClientProperty("JTree.lineStyle", "Angled"); // sau "Horizontal", "None" Specificarea unei iconi e ImageIcon leaf = createImageIcon("img/leaf.gif"); ImageIcon open = createImageIcon("img/open.gif"); ImageIcon closed = createImageIcon("img/closed.gif"); DefaultTreeCellRenderer renderer =new DefaultTreeCellRenderer(); renderer.setLeafIcon(leaf); renderer.setOpenIcon(open); renderer.setClosedIcon(closed); tree.setCellRenderer(renderer);

Desenarea

Programare Orientat! pe Obiecte

Desenarea
Conceptul de desenare Metoda paint Suprafe e de desenare Folosirea fonturilor Folosirea culorilor Folosirea imaginilor Mecanismul de double-buffering Tip!rirea

Conceptul de desenare
Un program Java care are interfa ! grafic! cu utilizatorul trebuie s! deseneze pe ecran toate componentele sale care au o reprezentare vizual!. Desenarea componentelor se face automat: 1. la afi$area pentru prima dat!; 2. la opera ii de minimizare, maximizare, redimensionare a suprafe ei de afi$are; 3. ca r!spuns al unei solicit!ri explicite a programului.
l

Metode: void paint(Graphics g) - Deseneaz! o component!. void update(Graphics g) - Actualizeaz! starea grafic! a unei componente. a. $terge componenta prin supradesenarea ei cu culoarea fundalului; b. stabile$te culoarea (foreground) componentei; c. apeleaz! metoda paint pentru a redesena componenta. void repaint() - Execut! explicit un apel al metodei update pentru a actualiza reprezentarea grafic! a unei componente.

Metoda paint
l l

toate desenele care trebuie s! apar! pe o suprafa ! de afi$are se realizeaz! n metoda paint Responsabil! cu desenarea unei componente

import java.awt .*; Import javax.swing.*; class Fereastra extends JFrame { public Fereastra ( String titlu ) { super ( titlu ); setSize (200 , 100) ; setDefaultCloseOperation(EXIT_ON_CLOSE); } public void paint ( Graphics g) { super.paint(g); g. setFont (new Font (" Arial ", Font .BOLD , 11)); g. setColor ( Color .red ); g. drawString (" Aplicatie DEMO ", 5, 35); } } public class TestPaint { public static void main ( String args []) { Fereastra f = new Fereastra (" Test paint "); f. show (); } }

Suprafe e de desenare
Clasa Canvas: - Este o clas! generic! din care se deriveaz! subclase pentru crearea suprafe elor de desenare (plan$e). - Plan$ele nu pot con ine alte componente grafice, ele fiind utilizate doar ca suprafe e de desenat sau ca fundal pentru anima ie. - Desenarea pe o plan$a se face prin supradefinirea metodei paint a acesteia.
l

class Plansa extends Canvas implements ...Listener { //Eventual, unul sau mai multi constructori public Plansa() { ... } // Metode de desenare a componentei public void paint(Graphics g) { ... } // Metodele folosite de gestionarii de pozitionare public Dimension getPreferredSize() { // Dimensiunea implicita a plansei return ...; } public Dimension getMinimumSize() { return ... } public Dimension getMaximumSize() { return ... } // Implementarea metodelor interfetelor de tip //Listener ... }

Folosirea clasei Canvas


import java . awt .*; import java . awt. event .*; import javax . swing .*; class Plansa extends Canvas { Dimension dim = new Dimension (100 , 100) ; private Color color [] = { Color .red , Color . blue }; private int index = 0; public Plansa () { this . addMouseListener (new MouseAdapter () { public void mouseClicked ( MouseEvent e) { index = 1 - index ; repaint (); } }); } public void paint ( Graphics g) { g. setColor ( color [ index ]); g. drawRect (0, 0, dim .width , dim. height ); g. setColor ( color [1 - index ]); g. fillOval (0, 0, dim .width , dim. height ); }

Folosirea clasei Canvas


public Dimension getPreferredSize () { return dim ; } } class Fereastra extends JFrame { public Fereastra ( String titlu ) { super ( titlu ); setSize (200 , 200) ; setDefaultCloseOperation(EXIT_ON_CLOSE); add (new Plansa () , BorderLayout . CENTER ); } } public class TestCanvas { public static void main ( String args []) { new Fereastra (" Test Canvas "). show (); } }

Contextul grafic de desenare


l

Un context grafic este un obiect de tip Graphics folosit pentru desenare: pe o por iune de ecran la imprimant! ntr-o zon! virtual! de memorie. Metode: primitive grafice: desenarea de figuri geometrice, texte $i imagini stabilirea propriet! ilor contextului grafic: culoare, font originea coordonatelor suprafa a vizibil! modul de desenare

Propriet! ile contextului grafic

Primitive grafice
Desenarea textelor - drawString drawString("Hello", 10, 20); l Desenarea figurilor geometrice Linie: drawLine, drawPolyline Dreptunghi simplu: drawRect, fillRect, clearRect Dreptunghi cu chenar: draw3DRect Dreptunghi cu chenar ridicat sau adncit: fill3DRect Dreptunghi cu col uri: drawRoundRect Dreptunghi cu col uri rotunjite: fillRoundRect Poligon: drawPolygon, fillPolygon Oval (Elips!) drawOval, fillOval Arc circular sau eliptic: drawArc, fillArc
l

Folosirea fonturilor
Parametrii unui font Numele fontului: Helvetica Bold, Arial, Bold Italic, etc. Familia din care face parte fontul: Helvetica, Arial, etc. Dimensiunea fontului (n!l imea sa) Stilul fontului: ngro$at (bold), nclinat (italic); Metrica fontului. Clase: Font, FontMetrics Stabilirea unui font: setFont

Clasa Font
l l

Incapsuleaz! toate informa iile fontului, mai pu in metrica sa. Font(String name, int style, int size) new Font("Dialog", Font.PLAIN, 12); new Font("Arial", Font.ITALIC, 14); new Font("Courier", Font.BOLD, 10); Pentru componente etichetate Label label = new Label("Un text"); label.setFont(new Font("Dialog", Font.PLAIN, 12)); In metoda paint(Graphics g) g.setFont(new Font("Courier", Font.BOLD, 10)); g.drawString("Alt text", 10, 20); Lista fonturilor instalate: Font[] fonturi = GraphicsEnvironment. getLocalGraphicsEnvironment().getAllFonts();

Lucrul cu fonturi
import java . awt .*; import javax.swing.*; class Fonturi extends Canvas { private Font [] fonturi ; Dimension canvasSize = new Dimension (400 , 400) ; public Fonturi () { fonturi = GraphicsEnvironment . getLocalGraphicsEnvironment (). getAllFonts (); canvasSize . height = (1 + fonturi . length ) * 20; } public void paint ( Graphics g) { String nume ; for (int i=0; i < fonturi . length ; i ++) { nume = fonturi [i]. getFontName (); g. setFont (new Font (nume , Font .PLAIN , 14)); g. drawString (i + ". " + nume , 20, (i + 1) * 20); } }

Lucrul cu fonturi
public Dimension getPreferredSize () { return canvasSize ; } } class Fereastra extends JFrame { public Fereastra ( String titlu ) { super ( titlu ); setDefaultCloseOperation(EXIT_ON_CLOSE); ScrollPane sp = new ScrollPane (); sp.add(new Fonturi()); sp. setSize (200 , 200) ; add (sp , BorderLayout . CENTER ); pack (); } } class TestAllFonts { public static void main ( String args []) { new Fereastra ("All fonts "). show (); } }

Clasa FontMetrics
Informa ii despre metrica unui font. public void paint(Graphics g) { FontMetrics fm = g.getFontMetrics(); } Metode getHeight stringWidth charWidth

Clasa FontMetrics
Metrica unui font const! n urm!toarele atribute pe care le au caracterele sale: Linia de baz!: este linia dup! care sunt aliniate caracterele unui font; Linia de ascenden !: linia superioara pe care nu o depaseste nici un caracter din font Linia de descenden !: linia inferioar! sub care nu coboar! nici un caracter din font; Ascendentul: distan a ntre linia de baz! $i linia de ascenden !; Descendentul: distan a ntre linia de baz! $i linia de descenden !; L! imea: l! imea unui anumit caracter din font; Distan a ntre linii (leading): distan a optim! ntre dou! linii de text scrise cu acela$i font. In!l imea: distan a dintre liniile de baz! (leading+ascent+descent); exemplu
l

Folosirea culorilor
Red Green Blue Alpha (0'255,0.0 ' 1.0) l Clase: Color, SystemColor l Constante Color rosu = Color.red; Color galben = Color.yellow; Color fundal = SystemColor.desktop; l Constructori // Exemple de folosire a constructorilor: Color alb = new Color(255, 255, 255); Color negru = new Color(0, 0, 0); Color rosuOpac = new Color(255, 0, 0); Color rosuTransparent = new Color(255, 0, 0, 128); l Metode brighter, darker, getRed, etc
l

Folosirea culorilor
int r = rValue.getValue(); int g = gValue.getValue(); int b = bValue.getValue(); int a = aValue.getValue(); color = new Color(r, g, b, a); repaint(); ... public void paint(Graphics g) { g.setColor(Color.black); g.setFont(new Font("Arial", Font.BOLD, 12)); String text = ""; text += " R=" + color.getRed(); text += " G=" + color.getGreen(); text += " B=" + color.getBlue(); text += " A=" + color.getAlpha(); g.drawString(text, 0, 30); g.setColor(color); g.fillRect(0, 0,canvasSize.width, canvasSize.height); }

Folosirea imaginilor
Aceasta este o imagine:

Formate permise: gif sau jpeg Clasa: Image Afi$area unei imagini: 1. Crearea unui obiect de tip Image; 2. Afi$area propriu-zis! ntr-un context grafic;

Folosirea imaginilor
Crearea unui obiect Image Toolkit toolkit = Toolkit.getDefaultToolkit(); Image image1 = toolkit.getImage("poza.gif"); Image image2 = toolkit.getImage( new URL("http://www.infoiasi.ro/~acf/poza.gif")); l Afi$area unei imagini Image img = Toolkit.getDefaultToolkit().getImage("taz.gif"); g.drawImage(img, 0, 0, this); g.drawImage(img, 0, 200, 100, 100, this); g.drawImage(img, 200, 0, 200, 400, Color.yellow, this); //Formatul cel mai general: boolean drawImage(Image img, int x, int y, int width, int height, Color bgcolor, ImageObserver observer)
l

Monitorizarea nc!rc!rii imaginilor


l

Interfa a ImageObserver boolean imageUpdate (Image img, int flags, int x, int y, int w, int h ) flags:ABORT, ALLBITS, ERROR, HEIGHT, WIDTH, PROPERTIES // Imaginea este completa (flags & ALLBITS) != 0 // Eroare sau transfer intrerupt (flags & ERROR | ABORT ) != 0 public boolean imageUpdate(Image img, int flags, int x, int y, int w, int h) { // Desenam doar daca toti bitii sunt disponibili if (( flags & ALLBITS) != 0) repaint(); // Daca sunt toti bitii nu mai sunt necesare // noi update-uri return ( (flags & (ALLBITS | ABORT)) == 0);

Mecanismul de double-buffering
l

implic! realizarea unui desen n memorie $i apoi transferul s!u pe ecran, pentru a elimina efectul nepl!cut de clipire (flickering) rezultat atunci cnd sunt efectuate redesen!ri repetate la intervale mici de timp (crearea de anima ii).

// Supradefinim update pentru a elimina stergerea desenului public void update(Graphics g) { paint( g ); } public void paint(Graphics g) { // Desenam in memorie pe un obiect de tip Image // w si h sunt dimensiunile desenului Image img = createImage(w, h); Graphics gmem = img.getGraphics(); // Realizam desenul folosind gmem gmem.setColor(...); gmem.fillOval(...); ... // Transferam desenul din memorie pe ecran // desenand de fapt imaginea creata g.drawImage(img, 0, 0, this); gmem.dispose(); }

Tip!rirea componentelor
java.awt.print l Interfa a Printable public int print(Graphics g, PageFormat pf, int pageIndex) throws PrinterException { // Descrierea imaginii obiectului // Poate fi un apel la metoda paint: paint(g) if (ceva nu este in regula) { return Printable.NO_SUCH_PAGE; } return Printable.PAGE_EXISTS; } Etapele tip!ririi: 1. Crearea unei sesiuni de tip!rire: PrinterJob.getPrinterJob 2. Specificarea obiectului care va fi tip!rit: setPrintable; 3. Op ional, ini ierea unui dialog cu utilizatorul pentru precizarea unor parametri lega i de tip!rire: printDialog; 4. Tip!rirea efectiv!: print.
l

Tip!rirea unei componente


import java .io .*; import java . awt .*; import java . awt. event .*; import java . awt. print .*; import javax.swing.*; class Plansa extends Canvas implements Printable { Dimension d = new Dimension (400 , 400) ; public Dimension getPreferredSize () { return d; } public void paint ( Graphics g) { g. drawRect (200 , 200 , 100 , 100) ; g. drawOval (200 , 200 , 100 , 100) ; g. drawString (" Hello ", 200 , 200) ; } public int print ( Graphics g, PageFormat pf , int pi) throws PrinterException { if (pi >= 1) return Printable . NO_SUCH_PAGE ; paint (g); g. drawString (" Numai la imprimanta ", 200 , 300) ; return Printable . PAGE_EXISTS ; } }

Tip!rirea unei componente


class Fereastra extends JFrame implements ActionListener { private Plansa plansa = new Plansa (); private JButton print = new JButton (" Print "); public Fereastra ( String titlu ) { super ( titlu ); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); add (plansa , BorderLayout . CENTER ); JPanel south = new JPanel (); south.setLayout(new FlowLayout()); south .add( print ); add (south , BorderLayout . SOUTH ); print . addActionListener ( this ); pack (); } public void actionPerformed ( ActionEvent e) { // 1. Crearea unei sesiuni de tiparire PrinterJob printJob = PrinterJob . getPrinterJob (); // 2. Stabilirea obiectului ce va fi tiparit printJob . setPrintable ( plansa );

Tip!rirea unei componente


// 3. Initierea dialogului cu utilizatorul if ( printJob . printDialog ()) { try { // 4. Tiparirea efectiva printJob . print (); } catch ( PrinterException ex) { System . out. println (" Exceptie la tiparire !"); ex. printStackTrace ();} } } } class TestPrint { public static void main ( String args []) throws Exception { Fereastra f = new Fereastra (" Test Print "); f. show (); } }

Tip!rirea textelor
l

Flux c!tre lpt1 sau /dev/lp. import java .io .*; import java . awt .*; class TestPrintText { public static void main ( String args []) throws Exception{ // pentru Windows PrintWriter imp = new PrintWriter ( new FileWriter ("lpt1 ")); /* pentru UNIX PrintWriter imp = new PrintWriter (new FileWriter ( "/dev/lp "));*/ imp . println (" Test imprimanta "); imp . println (" ABCDE "); imp . close (); } }

You might also like