You are on page 1of 85

Programao

Aplicada - Java
ECOM04
Prof. Airton Motoki Tamakoshi
airton.motoki@gmail.com

Prof. Andr Bernardi


andrebernardi@unifei.edu.br
andreber@gmail.com
Aula 03
Graphics e Java 2D
Viso Geral
Viso geral
Java apresenta recursos que possibilitam desenhar objetos
de forma nativa.

A forma como os desenhos so utilizados em java varia


conforme a classe responsvel.

A classe Graphics a mais utilizada na literatura.


Viso geral
Alm dos pacotes de classes nativas existem outros
pacotes que possibilitam trabalhar com a parte grfica
(2D e 3D)
Diversos pacotes disponveis apresentam como foco o
desenvolvimento de jogos.
A grande maioria dos recursos adicionais (de
terceiros) disponibilizado de forma gratuita.
Viso geral
Noticia Relacionada:

Materia da gamedeveloper:

A tecnologia por trs de Minecraft

http://gamedeveloper.com.br/a-tecnologia-por-tras-de-minecr
aft/

Publicado em 22/10/2011
Viso geral
Minecraft

Desenvolvido inicialmente em Java


Multiplataforma (Windows, MacOS, Linux, Solaris)
LWJGL (Lightweight Java Game Library)
JOrbis (Ogg decoder)
3D Sound System (som para ambientes
tridimensionais).
Viso geral
Os desenhos em Java funciona de forma similar ao sistema
de coordenadas cartesianas (x, y).

A maior diferena que o eixo y est invertido


Viso geral
Antes de iniciar o desenvolvimento necessrio entender
alguns conceitos sobre a parte grfica da linguagem Java:

JFrame
JPanel
Graphics
JFrame
JFrame
JFrame a classe que permite exibir e trabalhar com o
conceito de janela.

A forma mais fcil de criar uma Janela por meio da


herana

public class Janela extends JFrame{

public Janela(){
System.out.println("Meu Frame");
}
}
JFrame
No cdigo anterior quando executado nada apresentado.

Para apresentar o Frame necessrio definir alguns


parmetros atravs dos mtodos:

setDefaultCloseOperation(int i);
setSize(int largura, int altura);
setVisible(true);
add(Component c);
JFrame

setDefaultCloseOperation(int i);
setDefaultCloseOperation(int i);

Define a ao tomada pelo programa quando fechar a


janela

JFrame.EXIT_ON_CLOSE
JFrame.DO_NOTHING_ON_CLOSE
JFrame.HIDE_ON_CLOSE
JFrame.DISPOSE_ON_CLOSE
JFrame

setSize(int largura, int altura);


setSize(int largura, int altura);

Define as dimenses da janela (largura e altura)

setVisible(true);
setVisible(true);

Torna o Frame visvel


JFrame

add(Component c);
add(Component c);

Adiciona um elemento na Janela. possvel adicionar


apenas um elemento.

super(String
super(String str) str);

Adiciona nome na Janela. Chamada super(String str) a


chamada do construtor da super classe JFrame(String str)
JFrame
Podemos redefinir nosso construtor da classe Janela como:

public class Janela extends JFrame{

public Janela(){
super("Minha Janela");
this.setDefaultCloseOperation
(JFrame.DISPOSE_ON_CLOSE);
this.setSize(400, 400);
this.add(new JTextField("Texto"));
this.setVisible(true);
}
}
JFrame

A ordem em que os elementos so


adicionados e os parmetros so
definidos interfere na apresentao da
Janela.
JFrame

public class Janela extends JFrame{

public Janela(){
this.setDefaultCloseOperation
(JFrame.DISPOSE_ON_CLOSE);
this.setSize(400, 400);
this.setVisible(true);
this.add(new JTextField("Texto"));
}
}
JPanel
JPanel
JPanel um componente de interface grfica que nada mais
que um container de componentes.

Pode possuir diversos componentes dentro, o que


inclui outros JPanels.

Alm de aglomerar componentes o JPanel permite organizar


de forma grfica a disposio dos elementos.

Por meio da disposio de layout (Veremos em outra


aula)
JPanel
public class Janela extends JFrame{

private JPanel panel = new JPanel();

public Janela(){
this.setDefaultCloseOperation
(JFrame.DISPOSE_ON_CLOSE);
this.setSize(400, 400);
this.add(panel);
this.setVisible(true);
}
}
JPanel
Tambm possvel extender a classe JPanel da mesma
forma como realizado com o JFrame.

Criaremos duas classes:

Frame extends JFrame


Content extends JPanel
JPanel

public class Content extends JPanel{

private JLabel label1, label2;

public Content(){
super();
label1 = new JLabel("Label01");
label2 = new JLabel(" =) ");
this.add(label1);
this.add(label2);
}
}
JPanel

public class Frame extends JFrame{

private Content content = new Content();

public Frame(){
super("Minha Janela");
this.setDefaultCloseOperation(...);
this.setSize(400, 400);
this.add(content);
this.setVisible(true);
}
}
Graphics
Graphics
A classe Graphics um contexto que habilita o desenho em
uma tela em java.

O contexto faz referncia a um objeto em java, ou seja, o


local onde o desenho apresentado.

Normalmente o desenho realizado em um JPanel.


Graphics

public class Content extends JPanel{

@Override
public void paint(Graphics grphcs) {
super.paint(grphcs);
grphcs.setColor(Color.BLACK);
grphcs.drawLine(0, 0, 400, 400);
}
}
Graphics
O contexto Graphics pode ser acessado por meio da
sobrescrita do mtodo paint() e paintComponent() da classe
JPanel.

@Override
public void paint(Graphics grphcs){
super.paint(grphcs);
//...
}
Graphics

Nota: O mtodo paint invocado a todo momento em que a


UI observa alguma alterao na interface grfica.

Devido a essa peculiaridade o recomendado no colocar


algoritmos que demoram para serem executados dentro do
mtodo paint().
Graphics
A classe Graphics permite realizar diversos tipos de
desenho.

Alm dos desenhos possvel fazer a impresso de String


de forma customizada e inserir imagens.

Dentre os possveis controle, podemos destacar:

Cores (classe Color)


Fontes (classe Font)
Desenhos (mtodos draw)
Color
Color
Como o prprio nome j indica, permite trabalhar com cores
de forma simplificada.

Utiliza como base o modelo RGB

A cor pode ser definida por uma constante ou por meio dos
valores em RGB.
Color
Construtores:

Color(int red, int green, int blue)

Color(float red, float green, float blue)


Color
Mtodos:

public int getRed()

public int getGreen()

public int getBlue()

Mtodos para obter o valor inteiro do espectro especificado


Color
Constantes:
static Color black
static Color BLACK black == BLACK
static Color blue
static Color BLUE
static Color cyan
static Color CYAN
static Color DARK_GRAY
static Color darkGray

Total de 13 cores
JColorChooser
JColorChooser
Alm da classe Color, um recurso muito comum a classe
JColorChooser.

Por meio do mtodo esttico showDialog permite que o


usurio escolha uma cor para ser utilizada

input de Cor

Que retorna um objeto da classe Color para programa


JColorChooser
JColorChooser
JColorChooser
A interface do mtodo :

JColorChooser.showDialog(Content, String, Color);

Exemplo:

Color c = JColorChooser.showDialog(null,
"Escolha", Color.RED);
Font
Font
Outra classe que permite alterar a esttica de um programa.

A classe Font apresenta recursos que permite alterar a forma


como os textos so apresentados na aplicao.

Similar aos editores de documento (ferramentas Office)


apresenta:

Tipo de fonte
Estilo
Tamanho
Font
A classe Font utilizada por vrios componentes que
possuem texto em sua formao.

Como por exemplo JLabel, JTextField e JTextArea

Os exemplos apresentados possuem o mtodo:

setFont(Font f)
Font
O objeto Font instanciado pelo construtor:

new Font(String name, int style, int size)

Exemplo:

Font f = new Font(Font.SERIF, Font.PLAIN, 12)


Font
Font name:

Font.SERIF

Font.MONOSPACED

Font.SANS_SERIF

Ou a String do nome da fonte disponvel no computador.


Font
Font style:

Font.BOLD
Font.PLAIN
Font.ITALIC
Font.BOLD+Font.ITALIC

Font size:
int = tamanho da fonte
Font
Extra: Buscando todas as fontes disponveis no computador

GraphicsEnvironment ge = GraphicsEnvironment
.getLocalGraphicsEnvironment();
String[] names =
ge.getAvailableFontFamilyNames();

for(int x = 0; x < names.length; x++)


System.out.println(names[x]);
Font
A classe Font tambm utilizada pela classe Graphics.

A partir do momento em que uma fonte na classe Graphics


(setFont) toda string impressa ser apresentada com a fonte
definida.

protected void paintComponent(Graphics g) {


super.paintComponent(g);
g.setFont(
new Font(Font.SERIF, Font.BOLD, 12));
g.drawString("SERIF BOLD 12", 20, 50);
}
Draw
Draw
Draw no uma classe, um conjunto de mtodo da
classe Graphics, responsvel pelo desenho na interface
grfica.

O desenho realizado com base:

Nas coordenadas (x, y)


Dimenses (largura, altura)
Arco
Draw
public void drawLine(int x1, int y1, int x2, int
y2)

public void drawRect(int x, int y, int width, int


height)

public void clearRect(int x, int y, int width,


int height)

public void fillRect(int x, int y, int width, int


height)
Draw
public void drawRoundRect(int x, int y, int
width, int height, int arcWidth, int arcHeight)

public void fillRoundRect(int x, int y, int


width, int height, int arcWidth, int arcHeight)

public void draw3DRect(int x, int y, int width,


int height, boolean b)
Draw
public void fill3DRect(int x, int y, int width,
int height, boolean b)

public void drawOval(int x, int y, int width, int


height)

public void fillOval(int x, int y, int width, int


height)
Draw
public void drawArc(int x, int y, int width, int
height, int startAngle, int arcAngle)

public void fillArc(int x, int y, int width, int


height, int startAngle, int arcAngle)
Draw
public void drawPolygon(int xPoints[], int
yPoints[], int points)

public void drawPolyline(int xPoints[], int


yPoints[], int points)

public void drawPolygon(Polygon p)

public void fillPolygon(int xPoints[], int


yPoints[], int points)

public void fillPolygon(Polygon p)


Draw

public class Content extends JPanel{

private int r[] = {...};


private int g[] = {...};
private int b[] = {...};

private int cX = 300;


private int cY = 350;
Draw

@Override
public void paint(Graphics g) {
super.paint(g);

int raio = 250;


this.setBackground(Color.WHITE);
for (int i = r.length; i > 0; i--){
Draw
// define a cor
g.setColor(new Color(r[i-1],
g[i-1], b[i-1]));
// arco de 0 a 180 graus
g.fillArc(cX-raio, cY-raio, raio*2,
raio*2, 0, 180);
raio = raio-2;
}
}
}
Draw
API Java2D
API Java2D
Alm dos recursos nativos da classe Graphics podemos
acessar recursos da biblioteca Graphics2D.

Para utilizar o Graphics2D necessrio obter a partir de um


contexto grfico (Graphics).

public void paint(Graphics grphcs) {


super.paint(grphcs);
Graphics2D g2d = (Graphics2D) grphcs;
}
API Java2D
Existem vrias similaridades entre o Graphics e Graphics2D,
a maior diferena que o Graphics2D permite:

Realizar operaes 2D com mais facilidade


Rotao das figuras
Shapes
Gradiente
Textura
API Java2D - Mtodos
public void translate(int x, int y)

Move x e y

public void rotate(double rad)

Rotao das figuras com eixo em (0, 0)

public void rotate(double rad, int x, int y)

Rotao das figuras com eixo em (x, y)


API Java2D - Shapes
Os Shapes aceitos pertencem ao pacote

java.awt.geom
Ellipse2D.Double
Rectangle2D.Double
RoundRectangle2D.Double
Arc2D.Double
Line2D.Double
API Java2D - Shapes
Para utilizar as estruturas do pacote java.awt.geom
necessrio instanciar o objeto desejado, com os parmetros
adequados.

Os parmetros dos shapes so as dimenses do objeto

Os shapes so utilizados juntamente com a classe


Graphics2D, por meio do mtodo draw.

Todos os efeitos aplicados a classe Graphics2D so


aplicados tambm aos shapes.
API Java2D - Shapes

public void paint2D_01(Graphics2D g2d) {


g2d.setPaint(new GradientPaint(5, 30,
Color.RED, 35, 100, Color.BLACK, true));
g2d.fill(new Ellipse2D.Double(5, 30, 65,
100));
}
API Java2D - Shapes

public void paint2D_02(Graphics2D g2d) {


g2d.setPaint(Color.red);
g2d.setStroke(new BasicStroke(10.0f));
g2d.draw(new Rectangle2D.Double(80, 30, 65,
100));
}
API Java2D - Shapes

public void paint2D_03(Graphics grphcs) {


BufferedImage buffImage = new BufferedImage
(10, 10, BufferedImage.TYPE_INT_RGB);
Graphics2D gg = buffImage.createGraphics();
gg.setColor(Color.yellow);
gg.fillRect(0, 0, 10, 10);
gg.setColor(Color.black);
gg.drawRect(1, 1, 6, 6);
API Java2D - Shapes

g2d.setPaint(new TexturePaint(buffImage,
new Rectangle(10, 10)));
g2d.fill(new RoundRectangle2D.Double(155,
30, 75, 100, 50, 50));
}
API Java2D - Shapes

public void paint2D_04(Graphics2D g2d) {


g2d.setPaint(Color.cyan);
g2d.setStroke(new BasicStroke(6.0f));
g2d.draw(new Arc2D.Double(240, 30, 75, 100,
0, 270, Arc2D.PIE));
}
public void paint2D_05(Graphics2D g2d) {
g2d.setPaint(Color.green);
g2d.draw(new Line2D.Double
(395, 30, 320, 150));

g2d.setPaint(Color.yellow);
float d[] = {10, 10};
g2d.setStroke(new BasicStroke
(4, BasicStroke.CAP_ROUND,
BasicStroke.JOIN_ROUND, 10, d, 0));
g2d.draw(new Line2D.Double
(320, 30, 395, 150));
}
API Java2D - Shapes

@Override
public void paint(Graphics grphcs) {
super.paint(grphcs);
Graphics2D g2d = (Graphics2D) grphcs;
paint2D_01(g2d);
paint2D_02(g2d);
paint2D_03(g2d);
paint2D_04(g2d);
paint2D_05(g2d);
}
API Java2D - Shapes
API Java2D - Shapes
GradientPaint(xi, yi, CorI, xf, yf, CorF, cicl )

BufferedImage(lagura, altura,
BufferedImage.TYPE_INT_RGB)
buffImage.createGraphics();

TexturePaint(buffImage, new Rectangle( lagura,


altura ) )

BasicStroke( 4, BasicStroke.CAP_ROUND,
BasicStroke.JOIN_ROUND, 10, dashes, 0 )
GeneralPath
GeneralPath
Alm dos Shapes j disponveis pelo pacote java.awt.geom,
podemos construir um shape personalizado com a classe
GeneralPath

Utilizamos os mtodos:

moveTo(x, y)
lineTo(x, y)
curveTo(x1, y1, x2, y2, x3, y3)
quadTo(x1, y1, x2, y2)
closePath();
GeneralPath
moveTo(x, y)

Define um ponto (x, y)

lineTo(x, y)

Conecta o ltimo ponto at (x,y)

curveTo(x1, y1, x2, y2, x3, y3)

Conecta o ltimo ponto at (x3,y3) com base na curva


de Bzier
GeneralPath
quadTo(x1, y1, x2, y2)

Conecta o ltimo ponto at (x2, y2) com uma curva


quadratica

closePath()

Finaliza a figura conectando o ltimo ponto ao primeiro


GeneralPath
GeneralPath

public void paint(Graphics grphcs) {


super.paint(grphcs);
Graphics2D g2d = (Graphics2D) grphcs;

Random random = new Random();

int x[] = {55, 67, 109, 73, 83, 55, 27,


37, 1, 43};
int y[] = {0, 36, 36, 54, 96, 72, 96,
54, 36, 36};
GeneralPath

GeneralPath star = new GeneralPath();


g2d.translate(200, 200);

// Definindo o shape da estrela


star.moveTo(xPoints[0], yPoints[0]);
for (int c = 1; c < size; c++) {
star.lineTo(x[c], y[c]);
}
star.closePath();
GeneralPath

// desenha o shape de forma circular


for (int count = 1; count <= 20; count++) {
g2d.rotate(Math.PI / 10.0);
Color color = new Color(
random.nextInt(256),
random.nextInt(256),
random.nextInt(256))
g2d.setColor(color);
g2d.fill(star);
}
}
GeneralPath
Dvidas???

You might also like