Java POO Curs11
Java POO Curs11
cu utilizatorul - Swing
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);
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());
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
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 ... }
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
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
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 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 (); } }