Swing A API de Java 2D disponibiliza um pacote robusto com ferramentas de desenho para desenvolvimento de grficos elegantes e profissionais de alta qualidade. Estas funcionalidades foram introduzidas como parte do JFC (Java Foundation Classes) no Java 2. Nesta seo iremos ter uma viso geral de vrias capacidades do Java 2D para desenhar formas bidimensionais, controlar cores e fontes. Um dos atrativos iniciais do Java foi seu suporte a imagens grficas que permitia aos programadores aprimorar visualmente seus aplicativos. Java 2D http://docs.oracle.com/javase/tutorial/2d/ Swing Atualmente, o Java possui muitas capacidades mais sofisticadas de desenho como parte do Java 2D. Esta API permite realizar as seguintes tarefas: Desenhar linhas, retngulos, elipses, curvas e outras formas geomtricas; Preencher estas formas com cores slidas ou gradientes e texturas; Desenhar texto com opes de controle sobre a fonte e o processo de renderizao; Desenhar imagens, com a opo de executar operaes com filtros; Java 2D Swing Um mecanismo para deteco de coliso de formas, texto e imagens; Suporte a impresso de documentos complexos; Controle sobre a qualidade de renderizao.
Este pacote permite o desenvolvimento de interfaces ricas e complexas, programas sofisticados de desenho e editores de imagens. Java 2D Swing Utilizao de Java 2D para produzir grficos complexos:
Utilizao de Java 2D para realizar operaes de filtragem em imagens: Java 2D Swing Antes de comear a fazer desenhos com Java 2D necessrio entender o sistema de coordenadas da tela. Este sistema permite posicionar um pixel (um ponto de cor) em uma localizao especfica na janela. Pixel a menor unidade de resoluo do monitor de vdeo. O sistema de coordenadas da tela pode ser visto como uma variao do sistema de coordenadas do plano cartesiano, onde a origem (0,0) localizada no canto superior esquerdo. Java 2D Swing Para posicionar um pixel na janela, que uma superfcie 2D, utilizamos a notao do plano de coordenadas cartesiano (x, y) para referenciar uma posio especfica, onde: x especifica o deslocamento horizontal a partir da origem; y especifica o deslocamento vertical a partir da origem; Java 2D Swing Java 2D Origem do sistema de coordenadas Swing Atravs do sistema de coordenadas podemos especificar o local exato de desenho das formas geomtricas: Java 2D Swing A figura a seguir mostra uma parte da hierarquia de classes do Java 2D que inclui vrias das classes grficas bsicas e as vrias classes e interfaces que investigaremos durante as aulas: Java 2D Swing A classe Color contm mtodos e constantes para manipular cores. A classe JComponent contm o mtodo paintComponent(), que utilizado para pintar um componente na tela. A classe Font contm mtodos e constantes para manipular fontes. A classe FontMetrics contm mtodos para obter informaes de fonte. A classe Graphics contm mtodos para desenhar strings, linhas, retngulos e outras formas.
Java 2D Swing A classe Graphics2D, que extende a classe Graphics, utilizada para desenhar com a API Java 2D. A classe Polygon contm mtodos para criar polgonos. A metade inferior da figura lista vrias classes e interfaces da API Java 2D. A classe BasicStroke ajuda a especificar as caractersticas do desenho de linhas. As classes GradientPaint e TexturePaint ajudam a especificar as caractersticas para preencher formas com cores ou padres.
Java 2D Swing As classes GeneralPath, Line2D, Arc2D, Ellipse2D, Rectangle2D e RoundRectangle2D representam vrias formas 2D disponibilizadas pelo Java. Java 2D Swing Demo 1 class CustomPanel extends JPanel { public void paintComponent(Graphics g) { // Chama o paintComponent() da superclasse para pintar primeiro super.paintComponent(g);
// Desenha o primeiro retangulo esquerda g.drawRect(0, 0, 200, 50);
// Desenha o segundo retangulo direita g.drawRect(200, 100, 100, 200); } } http://docs.oracle.com/javase/7/docs/api/java/awt/Graphics.html Swing Exerccio 1 Swing Um contexto grfico o que nos permite desenhar na tela. Entretanto, somente atravs de um objeto Graphics que conseguimos realizar esta tarefa. Ele gerencia um contexto grfico e desenha pixels na tela que representam texto e outros objetos grficos, como por exemplo: linhas, elipses, retngulos e outros polgonos. O objeto Graphics contm mtodos para desenhar, manipular fontes, cores e coisas do tipo. A classe Graphics uma classe abstract. Ou seja, no possvel instanciar um objeto deste tipo. Contextos Grficos e Objetos Grficos Swing Quando o Java implementada em cada plataforma, criada subclasse de Graphics apropriada para aquela plataforma que implementa as capacidades de desenho. Lembre-se das aulas anteriores, onde vimos que a classe Component a superclasse de muitas classes de java.awt. A classe JComponent, oferecida no pacote javax.swing, fornece o mtodo paintComponent() que pode ser utilizado para desenhar imagens grficas: public void paintComponent(Graphics g) Contextos Grficos e Objetos Grficos Swing public void paintComponent(Graphics g)
O mtodo acima recebe um objeto Graphicscomo um argumento. Este objeto passado para o mtodo pelo sistema sempre que um componente Swing (lightweight) precisa ser pintado. O programador raramente invoca este mtodo no cdigo diretamente, porque toda a parte grfica do Java baseada em eventos. Contextos Grficos e Objetos Grficos Swing Ao criar uma GUI, a JVM inicializa uma thread de despacho de evento (Event Dispatch Thread EDT), que utilizada para processar todos os eventos GUI. A partir de ento, todo o desenho e manipulao dos componentes da GUI so realizados por esta thread. Quando um aplicativo GUI executado, o continer de aplicativo chama o mtodo paintComponent() (na EDT) para cada componente lightweight a medida que a GUI exibida na tela. Contextos Grficos e Objetos Grficos Swing Assim, para que paintComponent() seja chamado novamente, deve ocorrer um novo evento, como a janela ser redimensionada, ou quando um componente da GUI coberto por uma outra janela, forando assim o redesenho da GUI. Se voc precisar invocar paintComponent() no cdigo, como por exemplo, para atualizar os elementos grficos desenhados em um componente Swing, voc deve invocar o mtodo repaint(), que por sua vez, se encarrega de efetuar uma chamada a paintComponent(): public void repaint(); Contextos Grficos e Objetos Grficos Swing Demo 2 class CustomPanel extends JPanel { public void paintComponent(Graphics g) { super.paintComponent(g);
// Desenha um retangulo g.drawRect(0, 0, 200, 50); // Desenha uma linha g.drawLine(80, 100, 230, 220); // Desenha uma elipse g.drawOval(250, 250, 75, 90); } } http://docs.oracle.com/javase/7/docs/api/java/awt/Graphics.html Swing Exerccio 2 Swing Exerccio 3 Swing Exerccio 4 Escreva o mtodo drawTriangle() conforme as especificaes a seguir: Modificador e Tipo Mtodo e Descrio private void drawTriangle(Graphics g, int x1, int y1, int x2, int y2, int x3, int y3) Desenha um tringulo a partir de 3 pontos 2D. // corpo drawTriangle(g, 100, 410, 200, 250, 300, 410); // face g.drawOval(100, 50, 190, 200); // mos g.drawOval(100, 260, 42, 42); g.drawOval(260, 260, 42, 42); // boca g.drawLine(183, 216, 215, 230); // armao do culos g.drawLine(100, 133, 290, 133); // lentes dos culos g.drawRect(132, 122, 50, 38); g.drawRect(215, 122, 50, 38); Swing Exerccio 4 (continuao) Swing Demo 3 class CustomPanel extends JPanel { public void paintComponent(Graphics g) { super.paintComponent(g); // fundo (background) Color azulcalcinha = new Color(173, 236, 255); g.setColor(azulcalcinha); g.fillRect(0, 0, 400, 400); // corpo g.setColor(new Color(0, 255, 0)); drawTriangle(g, 100, 410, 200, 250, 300, 410); // face g.setColor(new Color(250, 212, 147)); g.fillOval(100, 50, 190, 200); ... Swing Exerccio 5 Swing Exerccio 6 Swing The power of the docs! java.awt.Graphics http://docs.oracle.com/javase/7/docs/api/java/awt/Graphics.html public void paintComponent(Graphics g) { super.paintComponent(g); this.setBackground(Color.WHITE);
// set new drawing color using integers g.setColor( new Color( 255, 0, 0 ) ); g.fillRect(15, 25, 100, 20); g.drawString("Current RGB: " + g.getColor(), 130, 40); ...