Presentation is loading. Please wait.

Presentation is loading. Please wait.

Layouts and Graphics. component - container - layout Un Container contiene [0 o +] Components Il Layout specifica come i Components sono disposti nel.

Similar presentations


Presentation on theme: "Layouts and Graphics. component - container - layout Un Container contiene [0 o +] Components Il Layout specifica come i Components sono disposti nel."— Presentation transcript:

1 Layouts and Graphics

2 component - container - layout Un Container contiene [0 o +] Components Il Layout specifica come i Components sono disposti nel Container Un Container è un Component (quindi il contenimento è ricorsivo) Un Component ha una Graphics associata

3 Layouts Gestione del Layout Vedi anche: http://java.sun.com/docs/books/tutorial/uiswing/layout/index.html

4 Layouts

5

6

7 http://java.sun.com/docs/books/tutorial/uiswing/layout/spring.html

8 class YellowWindow package it.unitn.science.prog2.guiApp; import java.awt.*; import javax.swing.*; public class YellowWindow extends JFrame { private JPanel contentPane; public YellowWindow() { try { jbInit(); } catch(Exception e) { e.printStackTrace(); } } private void jbInit() throws Exception { contentPane=(JPanel)this.getContentPane(); this.setSize(new Dimension(400, 300)); contentPane.setBackground(Color.YELLOW); }

9 class App package it.unitn.science.prog2.guiApp; import javax.swing.*; import java.awt.*; public class App { JFrame finestra=null; public static void main(String[ ] a){ new App(); } public App() { // aggiungere qui: set look&feel (vedi oltre) this.setupGraphicEnvironment(); }

10 class App private void setupGraphicEnvironment() { finestra = new YellowWindow(); //new MyWindow // trova le dimensioni dello schermo e della finestra Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); Dimension frameSize = finestra.getSize(); // assicurati che la finestra non sia più grande dello schermo if (frameSize.height > screenSize.height) frameSize.height = screenSize.height; if (frameSize.width > screenSize.width) frameSize.width = screenSize.width;

11 class App // centra la finestra nello schermo finestra.setLocation((screenSize.width - frameSize.width) / 2, (screenSize.height - frameSize.height) / 2); // fai in modo che la chiusura della finestra // termini l'applicazione finestra.setDefaultCloseOperation(JFrame. EXIT_ON_CLOSE ); // rendi la finestra visibile finestra.setVisible(true); }

12 BorderLayout In YellowWindow cambio il metodo jbInit: private void jbInit() throws Exception { JPanel f=(JPanel)this.getContentPane(); JButton north, south, east, west, center; north = new JButton("North"); east = new JButton("East"); west = new JButton("West"); center = new JButton("Center"); south = new JButton("South"); f.setLayout(new BorderLayout(2, 2)); f.add(north, BorderLayout.NORTH); f.add(south, BorderLayout.SOUTH); f.add(east, BorderLayout.EAST); f.add(west, BorderLayout.WEST); f.add(center, BorderLayout.CENTER); this.setSize(300,300); }

13 FlowLayout In YellowWindow cambio il metodo jbInit: private void jbInit() throws Exception { JPanel f=(JPanel)this.getContentPane(); JButton one, two, three, four, five, six; one = new JButton("one"); two = new JButton("two"); three = new JButton("three"); four = new JButton("four"); five = new JButton("five"); six = new JButton("six"); f.setLayout(new FlowLayout()); f.add(one); f.add(six); f.add(five); // attenzione allordine! f.add(two); f.add(three); f.add(four); // aggiungo five per la seconda volta: - la prima viene eliminata ! f.add(five); this.setSize(300,300); }

14 BorderLayout In YellowWindow cambio il metodo jbInit: private void jbInit() throws Exception { JPanel f=(JPanel)this.getContentPane(); f.setLayout(new GridLayout(3,4)); JButton b[]=new JButton[10]; // VETTORE DI 10 BOTTON for (int k=0; k<10; k++){ b[k]=new JButton(); // Integer.toString(int a) traduce lintero a in una String b[k].setLabel(Integer.toString(k)); f.add(b[k]); } this.setSize(300,300); }

15 BorderLayout In YellowWindow cambio il metodo jbInit: private void jbInit() throws Exception{ JPanel f=(JPanel)this.getContentPane(); CardLayout cl=new CardLayout(); f.setLayout(cl); JPanel p[ ]=new JPanel[5]; Color c[ ]={Color.red,Color.orange,Color.green,Color.blue,Color.pink}; for (int k=0;k<5; k++){ p[k]=new JPanel(); p[k].setBackground(c[k]); f.add(Integer.toString(k),p[k]); // il primo parametro è una stringa con la quale riferirsi al componente aggiunto } this.setSize(300,300); this.setVisible(true); while (true) { // ciclo infinito try { Thread.sleep(800); // dormi per 500 millisecondi } catch (Exception e) { } cl.next(f); // richiama il prossimo componente }

16 Posizionamento assoluto: Null Layout It's possible to set the layout manager to null: no layout control. You might do this to position an object on the display at some absolute coordinates. This is almost never the right approach. Components might have different minimum sizes on different platforms, and your interface would not be very portable. import java.awt.*; public class Applicazione { public static void main(String s[]) {Applicazione a=new Applicazione()} Applicazione() { JFrame g= new JFrame ("Finestra controllata da BORDER Layout"); JPanel f=(JPanel)(g.getContentFrame(); f.setSize(200,200); // Dimensione della finestra f.setLocation(50,100); // Posizione della finestra JButton b=new JButton(("Push me"); f.setLayout(null); f.add(b); b.setSize(25,75); // Dimensiono il Bottone b.setLocation(10,100); // Posiziono il bottone nella finestra g.setVisible(true); }

17 Custom Painting Gestione della Grafica customizzata Vedi anche: http://java.sun.com/docs/books/tutorial/uiswing/14painting/index.html

18 Metodi grafici di Graphics drawLine()Draws a line drawRect()Draws a rectangle fillRect()Draws a filled rectangle drawRoundRect()Draws a rounded-corner rectangle fillRoundRect()Draws a filled, rounded-corner rectangle draw3DRect()Draws a highlighted, 3D rectangle fill3DRect()Draws a filled, highlighted, 3D rectangle drawArc()Draws an arc fillArc()Draws a filled arc drawOval()Draws an oval fillOval()Draws a filled oval drawPolygon()Draws a polygon, connecting endpoints fillPolygon()Draws a filled polygon drawPolyline()Draws a line connecting a polygon's points

19 Il sistema di coordinate

20 import java.awt.*; import javax.swing.*; import java.awt.event.*; public class TestPattern { public static void main(String[] args) { new TestPattern(); } public TestPattern() { startGraphics(); } public void startGraphics();{ JFrame f = new JFrame("TestPattern"); f.setSize(300,300); f.setContentPane(new MyPanel()); f.setVisible(true); } Disegno Grafico

21 class MyPanel extends JPanel { int theta = 45; int delta = 90; public void paintComponent(Graphics g) { super.paintComponent(g); int width = getSize().width; int height = getSize().height; int hWidth = width / 2; int hHeight = height / 2; int x = (width - hWidth)/2; int y = (height - hHeight)/2; g.setColor(Color.black); g.fillRect(0, 0, size().width, size().height); int[] polyx = {0, width / 2, width, width / 2}; int[] polyy = {height / 2, 0, height / 2, height}; Polygon poly = new Polygon(polyx, polyy, 4); g.setColor(Color.yellow) g.fillPolygon(poly); g.setColor(Color.red); g.fillRect(x, y, hWidth, hHeight); g.setColor(Color.green); g.fillOval(x, y, hWidth, hHeight); g.setColor(Color.blue); g.fillArc(x, y, hWidth, hHeight, theta, delta); g.setColor(Color.white); g.drawLine(x, y, x + hWidth, x + hHeight); } Disegno Grafico

22 Animazione Click!

23 class MyPanel extends JPanel implements MouseListener{ int theta = 45; int delta = 90; public void paintComponent(Graphics g) {... } public void mouseClicked(MouseEvent e) { theta=theta-90; this.repaint(); } public void mouseEntered(MouseEvent e) {} public void mouseExited(MouseEvent e) {} public void mousePressed(MouseEvent e) {} public void mouseReleased(MouseEvent e) {} } MyPanel() {this.addMouseListener(this);} } Animazione Double buffering dietro le quinte!

24 Repainting NON SI CHIAMA MAI ESPLICITAMENTE LA paintComponent(Graphics g)! [ nè la paint(Graphics g) ] Si chiama sempre, solo la repaint() NON SI IMPLEMENTA MAI LA REPAINT! La repaint viene chiamata anche dal sistema quando lo ritiene opportuno (resize, unhide...)

25 class MyPanel extends JPanel implements MouseListener{ public void paintComponent(Graphics g) { super.paintComponent(g); int rval, gval, bval; for (int j = 30; j < (this.size().height -25); j += 30) for (int i = 5; i < (this.size().width -25); i+= 30) { rval = (int)Math.floor(Math.random() * 256); gval = (int)Math.floor(Math.random() * 256); bval = (int)Math.floor(Math.random() * 256); g.setColor(new Color(rval,gval,bval)); g.fillRect(i,j,25,25); g.setColor(Color.black); g.drawRect(i-1,j-1,25,25); }... } Colore Double buffering dietro le quinte!

26 Animazione Click! Resize!

27 Insets protected void paintComponent(Graphics g) {... Insets insets = getInsets(); int currentWidth = getWidth() - insets.left - insets.right; int currentHeight = getHeight() - insets.top - insets.bottom;... /* First painting occurs at (x,y), where x is at least insets.left, and y is at least insets.top. */... }

28 Come avviene il painting 1. background (if opaque) 2. custom painting (if any) 3. border (if any) 4. children (if any) paintComponent The main method for painting. By default, it first paints the background if the component is opaque. Then it performs any custom painting. paintBorder Tells the component's border (if any) to paint. Do not invoke or override this method. paintChildren Tells any components contained by this component to paint themselves. Do not invoke or override this method.

29 Regole When implementing custom painting code for a component, keep these rules in mind: Your custom painting code should be in a method with the signature protected void paintComponent(Graphics). To gain access to the power of the 2D graphics API, you can cast the Graphics parameter into a Graphics2D object.2D graphics API You can use a border to paint the outside edges of your component. Except when painting the background of the component, you should avoid painting over the border area of the component. You can determine this area using the getInsets method. Your component must honor the opaque property. If your component is opaque, it must paint its complete area using an opaque color or colors. If its opaque property is false, then you have the option of not painting over the entire component.

30 class MyPanel extends JPanel { public void paintComponent(Graphics g) { super.paintComponent(g); Font f = new Font("TimesRoman", Font.PLAIN, 18); FontMetrics fm = getFontMetrics(f); g.setFont(f); String s = "This is a plain font"; int xstart = (getSize().width – fm.stringWidth(s))/2; g.drawString(s, xstart, 25); Font fb = new Font("TimesRoman", Font.BOLD, 18); Font fi = new Font("TimesRoman", Font.ITALIC, 18); Font fbi=new Font("TimesRoman",Font.BOLD +Font.ITALIC, 18); g.setFont(fb); g.drawString("This is a bold font", 10, 50); g.setFont(fi); g.drawString("This is an italic font", 10, 75); g.setFont(fbi); g.drawString("This is a bold italic font", 10, 100); }... } Fonts


Download ppt "Layouts and Graphics. component - container - layout Un Container contiene [0 o +] Components Il Layout specifica come i Components sono disposti nel."

Similar presentations


Ads by Google