Ponto V!

Home Java Java 2D Pintando no Java 2D
Vinícius Godoy de Mendonça
Pintando no Java 2DImprimir
Escrito por Vinícius Godoy de Mendonça

Usando o Java 2D, podemos desenhar e pintar diretamente, via código. A API fornece uma série de formas básicas, chamadas primitivas e, que servem como tijolos na construção de formas mais completas. Além disso, ele ainda fornece algumas classes para o desenho livre, através de traços e curvas, bem como opções de borda e preenchimento. Nesse artigo, vamos explicar em maiores detalhes esse tipo de desenho.

Desenhando primitivas

O Java 2D fornece uma série de classes, que permitem o desenho das seguintes primitivas: pontos, linhas, curvas, elipses e retângulos. Todas elas fazem parte do pacote java.awt.geom. Todas essas classes tem como ancestral comum a interface Shape, que representa uma forma geométrica qualquer. Qualquer classe que implemente a interface Shape, é capaz de:

  • Dizer qual é o seu bounding box: Ou seja, fornecer uma área retangular onde a forma está exatamente inscrita;
  • Dizer se a forma contém um determinado ponto: e, nesse caso, formas abertas são consideradas fechadas, pontos nas bordas são considerados dentro da forma;
  • Dizer se a forma intercepta um determinado retângulo;
  • Fornecer um objeto do tipo PathIterator: Que descreve como desenhar a forma, linha-a-linha, curva-a-curva;

O objeto Graphics2D é responsável por efetivamente fazer o desenho. Desenhamos usando os métodos draw(Shape), que desenha somente as bordas, ou fill(Shape), para o desenho da forma pintada. Além de usar as classes descritas acima, ele tamb

Technorati Marcas:

ém fornece métodos para o desenho direto dessas formas, como drawRect, fillRect, drawLine.

As classes criadas pelas Sun também vêm com dois tipos de precisão, Float e Double. Para não encher a API de classes de nome similar como FloatPoint2D e DoublePoint2D, a Sun usou uma técnica um tanto exótica. Definiu a classe principal Point2D como abstrata, e criou duas classes internas estáticas públicas, chamadas Float e Double. Portanto, para a criação de uma primitiva, usamos a seguinte construção:

//Precisão de float (32 bits)
Point2D pontoFloat = new Point2D.Float(10,10);

//Precisão de doubles (64 bits)
Point2D pontoDouble = new Point2D.Double(10,10);

Para jogos, geralmente não é necessário usar uma precisão maior que a de um float.

Pontos (Point2D)

A classe Point2D representa um ponto (x,y), no espaço coordenado. Além das versões Point2D.Float e Point2D.Double, o Java ainda fornece a classe Point, para a precisão de inteiros. O construtor padrão de todas as classes, criam um ponto na origem, a coordenada (0,0). É possível alterar a coordenada de um ponto através do método setLocation. Esse método aceita tanto novos valores de x e y, quanto um ponto como parâmetro, cujas coordenadas serão copiadas. Através da classe Point2D também é possível calcular a distância entre dois pontos.

Note que como Point2D não é descrito através de um caminho, já que é apenas um pontinho, ele não é filho de Shape2D.

Linhas (Line2D)

Linha A classe Line2D representa um segmento de reta. Ela é definida por 2 pontos (x1, y1)-(x2,y2). Ela possui vários métodos interessantes para testar interseção de uma reta com outra, de uma reta com um ponto, distância entre um ponto e o segmento de reta, ou mesmo um indicador se um determinado ponto está sobre ou abaixo da reta em questão. Ironicamente, não há um método para obter o tamanho de um segmento de reta, mas isso pode ser facilmente obtido através da classe Point2D. A maior parte dos métodos em distância também pode retornar a distância ao quadrado, muito mais rápida de ser calculada.

// desenha uma linha com precisão de Doubles
Line2D linha = new Line2D.Double(x1, y1, x2, y2);
g2.draw(linha);

Curvas Quadráticas (QuadCurve2D)

Curva quadrática A classe QuadCurve2D implementa a interface Shape e representa uma curva quadrática paramétrica no espaço coordenado (x, y). Curvas quadráticas são formadas por dois pontos, onde a curva começa e termina, e um ponto de controle, que define onde fica a “barriga” da curva. A classe possui diversos métodos úteis, como método para definir o quão plana a curva é, ou para subdividi-la. O método setCurve() é usado para definir os 3 pontos necessários para o desenho de uma curva, de uma só vez.

// Cria uma nova curva com precisão de floats
QuadCurve2D q = new QuadCurve2D.Float();
// Define suas coordenadas e a desenha
q.setCurve(x1, y1, ctrlx, ctrly, x2, y2);
g2.draw(q);

Curvas Cúbicas (CubicCurve2D)

Similar a curva anterior, mas a classe CubicCurve2D possui dois pontos de controle, ao invés de apenas 1. Defini-la é muito similar a curva quadrática, diferindo apenas pela presença do segundo ponto de controle, por exemplo:

Curva cúbica

// Cria uma nova CubicCurve2D.Double
CubicCurve2D c = new CubicCurve2D.Double();
// Define suas coordenadas e a desenha
c.setCurve(x1, y1, ctrlx1, ctrly1, 
   ctrlx2, ctrly2, x2, y2);
g2.draw(c);

Retângulos (Rectangle2D e RoundRectangle2D)

Retângulo Retângulos derivam da classe RectangularShape, que implementa a interface Shape e adiciona alguns métodos úteis, como métodos para pegar os pontos coordenados, o bouding box do retângulo, entre outras coisas. Rectangular shape define todas as formas que são desenhadas com base numa forma retangular, inclusive formas não necessariamente retangulares, como a elipse. Temos duas classes para retângulos, cada uma nas suas versões Float e Double, são elas a Rectangle2D e a RoundRectangle2D. Como você já deve ter deduzido, a única diferença de uma classe para outra é que a RoundRectangle possui bordas arredondadas. Além disso, o Java também disponibiliza a classe Rectangle, para retângulos com precisão inteira.

A criação de um retângulo é simples, basta fornecer as coordenadas x e y do canto superior esquerdo do retângulo, além de sua largura e altura.

// Cria e desenha um retângulo 2D com precisão double
g2.draw(new Rectangle2D.Double(x, y,
                               rectwidth,
                               rectheight));

No caso do retângulo com bordas arredondadas, é necessário também fornecer a largura e a altura do arco das bordas.

// Cria e desenha um retângulo de bordas arredondadas
// com precisão Double
g2.draw(new RoundRectangle2D.Double(x, y,
                                   rectwidth,
                                   rectheight,
                                   10, 10));

Elipses

Elipse A classe Ellipse2D representa uma eclipse inscrita num retângulo, por isso, é também filha de RectangularShape. O retângulo em si não é desenhado. A forma de desenhar uma elipse, é exatamente igual a de um retângulo. Um quadrado, portanto, desenha uma circunferência.

// Desenha uma elipse com precisão double
g2.draw(new Ellipse2D.Double(x, y,
                             rectwidth,
                             rectheight));

Arcos

Para desenhar apenas uma parte de uma elipse, usamos a classe Arc2D.

Arco

É possível desenhar três tipos de arcos:

  • OPEN: Sem uma linha conectando os pontos finais do segmento de arco;
  • CHORD: Com uma linha reta (corda), ligando os pontos finais do segmento de arco;
  • PIE: Com segmentos de reta do início do segmento do arco até o centro da elipse completa, e desse ponto até o fim do segmento de arco.

É possível criar um arco a partir de coordenadas, pontos, da cópia de outros arcos ou a partir de seu centro, usando o método setArcByCenter. O exemplo abaixo usa o construtor padrão, definindo o arco como se faria para um retângulo ou elipse:

// Desenha um arco aberto com precisão Float
g2.draw(new Arc2D.Float(x, y,
                        rectwidth,
                        rectheight,
                        90, 135,
                        Arc2D.OPEN));

Formas arbitrárias

Para criar formas mais complexas do que as descritas até então, tais como estrelas, hexágonos ou naves alienígenas, usa-se uma classe chamada GeneralPath. Essa classe também implementa Shape, e representa uma forma qualquer formada por uma série de linhas e curvas, quadráticas ou cúbicas.

Para construir um GeneralPath, basta chamar o construtor padrão, e então chamar um dos seguintes métodos:

  • moveTo(float x, float y): Move o ponto atual para o ponto fornecido;
  • lineTo(float x, float y): Adiciona um segmento de reta ao path atual;
  • quadTo(float ctrlx, float ctrly, float x2, floaty2): Adiciona um segmento de curva quadrática ao caminho atual;
  • curveTo(float ctrlx1, float ctrly1, float ctrlx2, float ctrly2, float x3, floaty3): Adiciona um segmento de curva cúbica ao caminho atual;
  • closePath(): Liga o primeiro e o último ponto do caminho com uma linha reta.

O exemplo a seguir, mostra como desenhar um polígono usando o GeneralPath:

// desenha um polígono usando GeneralPath
int x1Points[] = {0, 100, 0, 100};
int y1Points[] = {0, 50, 50, 0};
GeneralPath polygon = 
    new GeneralPath(GeneralPath.WIND_EVEN_ODD, x1Points.length);
polygon.moveTo(x1Points[0], y1Points[0]);

for (int index = 1; index < x1Points.length; index++) {
        polygon.lineTo(x1Points[index], y1Points[index]);
};

polygon.closePath();
g2.draw(polygon);

Resultando no seguinte polígono:

Polígono

Também é possível inserir caminhos específicos ao final do seu GeneralPath através do método append. Você não é obrigado a fechar o polígono com closePath().

Definindo as bordas e preenchimento

Vamos ver agora como definir a intensidade e o tipo do pincel nas bordas (Stroke) e o preenchimento das formas (Fill). Fazemos isso alterando o contexto gráfico antes da pintura. Como visto no nosso artigo anterior, antes de alterar o contexto gráfico, é necessário copia-lo para que essas mesmas características não sejam aplicadas a futuras (e indesejadas) partes do programa.

Bordas (Stroke)

O desenho das bordas é definido pela interface Stroke, e o Java já fornece uma implementação padrão dessa interface na classe BasicStroke. Depois de configurado, chama-se o método setStroke da classe Graphics2D, para adotar o novo padrão de desenho nas bordas. Podemos configurar várias propriedades, sendo as principais:

  • Espessura da linha (line width): Representa o tamanho da linha, medido perpendicularmente à sua trajetória. A largura da linha é medido como um valor em float e, no sistema de coordenadas padrão, representa 1/72 polegadas (0,035cm).
  • O estilo da junção (join style): Ou seja, a decoração aplicada quando dos segmentos de reta se encontram. A classe basic stroke suporta três tipos:
    Estilos de junção (join)
  • O estilo do final da linha (end cap stype): Usado quando uma linha acaba. O BasicStroke suporta os seguintes estilos:
    Estilos do final da linha (cap)
  • O estilo do tracejado (dash style): Que representa um padrão de opacidade e transparência, a ser usado em torno de toda a linha. Ele é definido através de um array, onde 0s representa um traço e 1 um espaço. Além dele, temos também a dash phase, que representa o estilo de tracejado usado no início da linha.

O exemplo abaixo, desenha um retângulo tracejado:

final static float dash1[] = {10.0f};
    final static BasicStroke dashed = new BasicStroke(1.0f, 
                                          BasicStroke.CAP_BUTT, 
                                          BasicStroke.JOIN_MITER, 
                                          10.0f, dash1, 0.0f);
g2.setStroke(dashed);
g2.draw(new RoundRectangle2D.Double(x, y,
                                   rectWidth,
                                   rectHeight,
                                   10, 10));

Resultando em:

Retângulo tracejado

Preenchimento (Fill)

Padrões de pintura são definidos pelo atributo paint, do Graphics2D. Da mesma forma que fizemos com o Stroke, criamos um objeto que deriva da interface Paint e então o fornecemos para o método setPaint, do graphics.

As classes Color, GradientPaint e TexturePaint implementam essa interface.

Para criar uma textura em degradée, você define uma posição inicial, uma final, as cores inicial e final. O gradiente muda proporcionalmente da cor inicial até a final, ao longo do segmento de reta definido pelas posições passadas. Por exemplo:

// fill Ellipse2D.Double
redtowhite = new GradientPaint(0,0,color.WHITE,100, 0,color.BLUE);
g2.setPaint(redtowhite);
g2.fill (new Ellipse2D.Double(0, 0, 100, 50));

Observe o desenho explicativo:

Efeito de degradée

O TexturePaint permite que você aplique um padrão, definido por uma imagem. Usa-se um retângulo de âncora, que diz qual é o tamanho que essa textura será aplicado no destino. A imagem a seguir demonstra o uso da técnica:

Textura

Outras considerações

O texto desse tutorial foi fortemente baseado (para não dizer, praticamente uma tradução) do tutorial oficial da Sun. Os códigos fontes foram, efetivamente, copiados de lá, assim como as imagens, que foram apenas traduzidas. Não vi porque alterar muita coisa, ou mudar as explicações, já que elas eram claras, diretas e de uma fonte mais confiável impossível. Apenas complementei algumas coisas, que ficaram obscuras no tutorial original.

Desenhar via código é uma atividade mais lenta que simplesmente pintar imagens prontas, especialmente quando se usa padrões complexos de pintura ou suavização. Entretanto, muitos jogos simples, como o Arkanoid, ou Tetris, podem ser diretamente pintados, sem uma penalidade de performance perceptível.

A grande vantagem é que as classes criadas para fazer o desenho ocupam muito menos espaço do que o desenho em si, se estivesse gravado em arquivos de imagem (jpg, png ou gifs) dentro do seu .jar. Por isso, essa técnica pode ser muito interessante em applets. Elas também não perdem resolução se ampliadas ou reduzidas. Outra opção, que veremos no futuro, é gerar esse desenho num buffer de pintura (definido por uma BufferedImage) e depois apenas desenhar esse buffer. Isso pode penalizar o usuário com um maior consumo de memória e um tempo de loading maior, mas que poderá ser menor do que esperar o download de todas as imagens do jogo, além de ter excelente performance durante o game em si.

Desafio

blinkyVocê consegue, utilizando o que foi visto aqui, desenhar o fantasma do Pacman? Tente fazer isso inicialmente utilizando as primitivas em seqüência, e depois com a classe GeneralPath. Faça curvas suaves, e não pixel art. A resposta para esse desafio veremos na semana que vem.


Comentários (39)
  • Vânio Meurer
    avatar

    Gostei do post, apesar de eu ter precisado dar uma pesquisada fora para conseguir resolver o desafio, porem to gostando bastante do portal.

    Para o desafio:
    desenhei utilizando Ellipse, Rectangle e QuadCurve.
    O resultado:
    View image

    Postei o fonte no meu blog:
    http://www.vaniomeurer.com.br/2009/11/10/desenhando-o-fantasminha-do-p acman-com-java-2d/

  • Vinícius Godoy de Mendonça  - Muito legal
    avatar

    É, você cumpriu o desafio. Será que agora consegue alterar para usar o GeneralPath?

  • João Vitor
    avatar

    Parabens pela iniciativa do site galera. O conteudo dos artigos esta muito bom e muito bem explicado.

    Já fiz o desafio ai tb, soh nao tenho lugar para posta-lo! ^^

    Mais uma vez... parabens!

  • Vânio Meurer  - re:
    avatar
    João Vitor Escreveu:
    Parabens pela iniciativa do site galera. O conteudo dos artigos esta muito bom e muito bem explicado.

    Já fiz o desafio ai tb, soh nao tenho lugar para posta-lo! ^^

    Mais uma vez... parabens!

    Poste seu código no pastebin:
    http://pastebin.com/
    :)

  • Anônimo  - re: Muito legal
    avatar
    Vinícius Godoy de Mendonça Escreveu:
    É, você cumpriu o desafio. Será que agora consegue alterar para usar o GeneralPath?

    View image

    Vinícius Godoy de Mendonça Escreveu:
    É, você cumpriu o desafio. Será que agora consegue alterar para usar o GeneralPath?

    Na figura, o primeiro é utilizando primitiva e o segundo é utilizando GeneralPath:

    View image

    O código fonte:
    http://pastebin.com/f7422ec4f

  • Vânio Meurer  - Opa...
    avatar

    Opa, ficou todo errado o meu comentario anterior :0
    but, o que vale é a intenção :D

  • Vinícius Godoy de Mendonça
    avatar

    Ficou show seu código. B)

  • Bruno Daniel Marinho  - Muito legal pessoal
    avatar

    Neste caso de desenhar o pacman tudo bem usar formas geometicas mais geralmente queremos usar imagens feitas por designer ou mesmo imagens da internet seria legal tambem vermos como renderizar imagens com fundo transparente, mais show mesmo o desenho do pacman.

  • Vinícius Godoy de Mendonça
    avatar

    Sim. Apesar de que é possível usar o Graphics2D para desenhar coisas como barras de vida e alguns efeitos.

    Desenhar diretamente no G2D só realmente se você fizer um jogo que tenha a restrição de ocupar pouco espaço.

  • daniel
    avatar

    tem como fazer um fill na parte de fora do desenho ao invez da de dentro?
    Ou seja, pintar a parte de fora após o desenho estar na tela?
    Excelente tuto.
    Valeu

  • Vinícius Godoy de Mendonça
    avatar

    Que eu saiba não há uma maneira direta de se fazer isso. Você teria que pintar a imagem final usando algum algoritmo de flood fill sobre um ponto específico qualquer.

    Veja mais informações em:
    http://en.wikipedia.org/wiki/Flood_fill
    http://www.codecodex.com/wiki/Implementing_the_flood_fill_algorithm

  • Maicon
    avatar

    Parabéns pelo post

    Estou com o seguinte problema, desenhar linhas paralelas com a classe Line2d, respeitando a distância entre elas em qualquer lugar do plano.

    Já existe alguma solução pronta para isso?

    Att

  • Vinícius Godoy de Mendonça
    avatar

    Não entendi seu problema. As retas saem nos exatos pontos que você definir.

    Por que elas alterariam sua distância no plano? Se ambas tiverem a mesma angulação em relação à um eixo qualquer, elas vão se manter paralelas.

  • Anônimo  - re:
    avatar

    Estou criando as retas da seguinte maneira:

    Na horizontal:

    g2.draw(new Line2D.Double(x1, y1, x2, y2));
    g2.draw(new Line2D.Double(x1, y1 + 40, x2, y2 + 40));

    Na vertical

    g2.draw(new Line2D.Double(x1, y1, x2, y2));
    g2.draw(new Line2D.Double(x1 + 40, y1, x2 + 40, y2));

    Gostaria de uma solução para manter a angulação em qualquer direção no plano, sendo que os pontos serão dinâmicos, escolhidos por envento do mouse.

    Att

  • Vinícius Godoy de Mendonça
    avatar

    E como o usuário vai fazer? Escolher 3 pontos? 2 da reta inicial e um da outra reta?

    Nesse caso, basta calcular o coeficiente angular da primeira reta (nada mais é que o do vetor definido pela primeira reta e o eixo x), e aplicar para a segunda reta.

    O usuário não poderia escolher 2 pontos na segunda reta, pois isso lhe permitiria também definir uma angulação. Se ele tiver que definir um tamanho para o seguimento, faça que essa escolha seja somente após a definição desse terceiro ponto.

  • bonucci  - re:
    avatar

    Boa tarde, ando a tentar dsenahr com o general path um piao, será que me conseguem ajudar?
    Seria possivel mostrarme o codigo?

    Ficam bem pessoal

  • Vinícius Godoy de Mendonça  - Pião com General Path
    avatar

    Oi, posso ajudar sim. Faz o seguinte, abra a dúvida no GUJ:
    http://www.guj.com.br

    No fórum de interface gráfica. Poste lá o seu código até agora, sem esquecer de usar as tags [code]. Seria bom também anexar um screenshot do que tem desenhado até agora, e um desenho da figura que você pretende obter quando o programa estiver pronto.

    Poste o link aqui e te ajudo. Eu sou um dos moderadores do GUJ.

  • Tathiana Ianelli  - Adicionando mais um ponto a um arco
    avatar

    Oi Viny! É a oitathi do guj! Então, eu tô querendo desenhar uma "espécie de curva". O que eu tenho são 15 pontos que definem uma curva..como se fossem ondulações. Eu tava dando uma lida nesse seu artigo e vi que é possivel riar curvas (quadraticas ou cubicas) e depois adicionar outro segumento de curva. Porém, eu não tenho os pontos onde está localizada a barriga da minha curva, por isso eu acho que não posso utilizar essa forma de desenho.
    Penso então que o mais indicado seria eu desenhar uma serie de arcos. O que eu gostaria de saber e se caso esse método seja o mais indicado e se exsite alguma função que adicione um segmento de arco ao arco já existente. Obrigada!!
    :kiss:

  • Vinícius Godoy de Mendonça
    avatar

    É difícil garantir que arcos passem sobre pontos específicos. Você vai ser obrigada a usar a classe de curvas mesmo.

    Veja o próximo artigo, chamado O Fantasma do Pacman, que explica o uso da classe GeneralPath.

    Talvez te ajude.

  • Anônimo  - Mateus PL
    avatar

    Uma das minhas indignações era de todos os métodos de desenho do Java2D só receberem valores inteiros como parâmetro de posicionamento. Agora vi que tem o método Point2D que pode receber valores float e double.

    Uma pergunta, como eu uso o Point2D junto com os outros métodos para desenhar se todos eles ( pelo menos os que aparecem aqui pra mim quando pressiono Ctrl+space no Netbeans ) pedem como parâmetros de x e y valores inteiros?

  • Vinícius Godoy de Mendonça
    avatar

    No caso de pontos, só truncando mesmo. Mas isso dificilmente é um problema, pois pontos são adimensionais.

    Se você quiser desenhar um pequeno círculo, você usa o método draw que recebe um Shape como parâmetro e passa uma elipse mesmo.

  • Andreza
    avatar

    Ola, gostaria de saber como consigo desenhar detro de 1 jPanel do swing, preciso fazer uma cubo, mas não estou conseguindo, ficarei grata se poder me dar algumas dicas

  • Vinícius Godoy de Mendonça
    avatar

    Sim, o processo é basicamente o mesmo. A única diferença é que você sobrescreve o método paintComponent do JPanel, no lugar do paint.

    Dê uma lida completa nos tutoriais de java do Ponto V! (começando pelo básico e depois para os artigos de java2D), que o processo de desenho ficará muito mais claro.

  • Tathiana Ianelli  - Criar uma lista de desenhos 2d com aplhas diferent
    avatar

    Olá Viny, estou quebrando a cabeça há alguns dias pra tentar fazer uma coisa q aparentemente parece bem simples...
    Eu gostaria de fazer um metodo que apartir de uma lista desenhasse objetos na mina lista, mas com o alpha desse objetos decrescendo. Assim, se eu tivesse apenas um objeto na minha lista, ele seria desenhado com o alpha 100%, se eu incluisse na minhha lista um segundo objeto, o primeiro deveria ser desenhado com o alpha 50% e o ultimo com o alpha 100%... ou seja, todos os obetos que não fossem o ultimo deveriam ter o alpha 50% e apenas o ultimo o alpha 100%, como poderia fazer isso???
    Obrigada!

  • Anônimo
    avatar

    Como faria para fazer esses mesmos desenhos com o mouse? Tipo no Sweet Home...
    Bjs

  • Vinícius Godoy de Mendonça
    avatar

    Você teria que adicionar um MouseListener e um MouseMotionListener ao seu JFrame. E então usar eles para realizar os desenhos.

  • 123  - 123
    avatar

    pra que serve esse G2 NA LINHA DE COMANDO

  • Rodrigo  - mover o fantasma
    avatar

    pessoal, preciso de ajuda...
    como fazer pra esses fantasmas ficarem se movendo na tela, tipo na vertical(de cima pra baixo), tô quebrando a cabeça nisto e até agora não consegui, quem puder me ajudar ficarei grato, abraços.

  • Vinícius Godoy de Mendonça
    avatar

    Continue lendo. Os próximos tutoriais explicam justamente como fazer um loop de animação.

  • Rodrigo santos  - mover o fantasma
    avatar

    Pior que eu preciso aprender fazer isso até dia 12, eu entrei agora num projeto de games e o professor que coordena o projeto me pediu pra fazer uma tela com ums desenhos que ficam se movendo, e eu já tentei e até agora não consegui, se tiver como você me dar uma mãozinha... valew.

  • Vinícius Godoy de Mendonça
    avatar

    Podemos dar uma mão sim. Mas antes siga todos os artigos desse site, passo-a-passo. Se não conseguir fazer a bolinha pular, aí abra um tópico no GUJ:
    http://www.guj.com.br

    Eu e o Marcos (do artigo de Android) somos moderadores desse fórum e sempre tiramos dúvidas por lá. Sem falar que o resto da comunidade também estará de olho.

  • Anônimo
    avatar

    eu gostei por que mostra muitas coisas :cheer: :woohoo:

  • alexandre Caputo  - Queria saber como faz uma bessie e edita um desenh
    avatar

    http://www.sheldrake.net/cardboards/boards/board.html?glass_fish

  • Ensdo  - Postar o código completo
    avatar

    Olá poderia postar o código completo. Porque estou meio perdito entre as partes.. Ficaria mais educativo. Exemplo em vez de so mostrar o método, a classe que ela está. Ou tipo da um exmplo simples ja implementado..

  • ViniGodoy  - Código completo
    avatar

    No próximo post há um código completo para download. A solução do desafio.

  • Cris  - gradiente com 4 cores
    avatar

    Vini

    como preencho um desenho com 4 cores de gradiente? :confused:
    com 2 cores funciona, mas quatro nem sei como começar :(
    o que vc sugere? duas imagens sobrepostas?

  • Anderson Felix  - re:
    avatar
    Vinícius Godoy de Mendonça Escreveu:
    Você teria que adicionar um MouseListener e um MouseMotionListener ao seu JFrame. E então usar eles para realizar os desenhos.

    Muito bom o post, mas me surgiu uma duvida. Como depois de desenhado(uma linha, retangulo...) pegar este objeto? com isso daria pra redimencionar, deletar, etc.
    des de ja agradeço.

  • Victor Fortunato  - Modificar a ponta de uma linha
    avatar

    Queria saber como faço para modificar a ponta de uma linha. Eu queria que no final de uma das pontar aparecesse uma bolinha preta ou algo assim.

  • burro  - Limpar retangulo
    avatar

    Boa tarde.

    Num painel com várias figuras como faria para limpar ou atualizar as dimensões somente de uma?

Escrever um comentário
Your Contact Details:
Gravatar enabled
Comentário:
[b] [i] [u] [url] [quote] [code] [img]   
:angry::0:confused::cheer:B):evil::silly::dry::lol::kiss::D:pinch::(:shock:
:X:side::):P:unsure::woohoo::huh::whistle:;):S:!::?::idea::arrow:
Security
Por favor coloque o código anti-spam que você lê na imagem.
LAST_UPDATED2  

Busca

Linguagens

Twitter