Graphics 2D

8 respostas
A

Oi galera, estou querendo adicionar varios pontos usando o graphics 2D, estou fazendo load à imagem de fundo e agora queria
adicionar varios circulos para marcar a possição de varias pessoas na sala. O problema é que o numero de pessoas possoas
pode variar de uma momento para o outro. Como faço para adicionar e remover pontos da imagem? Como tenho neste momento
no maximo posso ter 5 pessoas e quando tenho menos as coordenadas ficam negativas para ficar fora do mapa. Mas queria
uma solução melhor para resolver este problema.

Obrigado
Class Mapa

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package testes;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.imageio.ImageIO;
import javax.swing.JPanel;


/**
 *
 * @author Ang3lo
 */
public class Mapa extends JPanel
{
    private BufferedImage img = null;
    private String utilizador = " ";
    private String utilizador1 = " ";
    private String utilizador2 = " ";
    private String utilizador3 = " ";
    private String utilizador4 = " ";
    private String utilizador5 = " ";

    private int xUtilizador = 0;
    private int yUtilizador = 0;

    private int xUtilizador1 = -30;
    private int yUtilizador1 = -30;

    private int xUtilizador2 = -30;
    private int yUtilizador2 = -30;

    private int xUtilizador3 = -30;
    private int yUtilizador3 = -30;

    private int xUtilizador4 = -30;
    private int yUtilizador4 = -30;

    private int xUtilizador5 = -30;
    private int yUtilizador5 = -30;

//******************************************************************************
// metodos set para atribuir valor as variaveis

    public void setUtilizador(String utilizador) {
    this.utilizador = utilizador;
    }

    public void setUtilizador1(String utilizador1) {
        this.utilizador1 = utilizador1;
    }

    public void setUtilizador2(String utilizador2) {
        this.utilizador2 = utilizador2;
    }

    public void setUtilizador3(String utilizador3) {
        this.utilizador3 = utilizador3;
    }

    public void setUtilizador4(String utilizador4) {
        this.utilizador4 = utilizador4;
    }

    public void setUtilizador5(String utilizador5) {
        this.utilizador5 = utilizador5;
    }

    public void setxUtilizador(int xUtilizador) {
        this.xUtilizador = xUtilizador;
    }

    public void setxUtilizador1(int xUtilizador1) {
        this.xUtilizador1 = xUtilizador1;
    }

    public void setxUtilizador2(int xUtilizador2) {
        this.xUtilizador2 = xUtilizador2;
    }

    public void setxUtilizador3(int xUtilizador3) {
        this.xUtilizador3 = xUtilizador3;
    }

    public void setxUtilizador4(int xUtilizador4) {
        this.xUtilizador4 = xUtilizador4;
    }

    public void setxUtilizador5(int xUtilizador5) {
        this.xUtilizador5 = xUtilizador5;
    }

    public void setyUtilizador(int yUtilizador) {
        this.yUtilizador = yUtilizador;
    }

    public void setyUtilizador1(int yUtilizador1) {
        this.yUtilizador1 = yUtilizador1;
    }

    public void setyUtilizador2(int yUtilizador2) {
        this.yUtilizador2 = yUtilizador2;
    }

    public void setyUtilizador3(int yUtilizador3) {
        this.yUtilizador3 = yUtilizador3;
    }

    public void setyUtilizador4(int yUtilizador4) {
        this.yUtilizador4 = yUtilizador4;
    }

    public void setyUtilizador5(int yUtilizador5) {
        this.yUtilizador5 = yUtilizador5;
    }
//******************************************************************************
    public void desenha()
    {
        //Para optimizar o programa apenas é carregado uma vez o ficheiro da
        //imagem do mapa
        if(img == null) //caso nao se tenha carregado ainda a imagem
        {
            try {
                img = ImageIO.read(new File("c:\\mapa.png"));
                repaint();
            } catch (IOException ex) {
                Logger.getLogger(Mapa.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
        //caso a imagem já tenha sido carregada
        else
            repaint();
    }

    //metodo que dimensiona a janela para o tamanho da imagem
    @Override
    public Dimension getPreferredSize()
    {
        if (img == null) {
             return new Dimension(1000,1000);
        }
        else {
           return new Dimension(img.getWidth(null), img.getHeight(null));
       }
    }

    //metodo onde se desenha a imagem do mapa e os pontos da coordenada
    @Override
    public void paintComponent(Graphics g)
    {
        super.paintComponent(g);
        g.drawImage(img, 0, 0, null);

        //utlizador da conta
        g.setColor(Color.RED);
        g.drawString(this.utilizador, this.xUtilizador, (this.yUtilizador - 2 ));
        g.fillOval(this.xUtilizador, this.yUtilizador, 10, 10);

        //utlizador 1
        g.setColor(Color.BLUE);
        g.drawString(this.utilizador1, this.xUtilizador1, (this.yUtilizador1 - 2));
        g.fillOval(this.xUtilizador1, this.yUtilizador1, 10, 10);

        //utlizador 2
        g.setColor(Color.GREEN);
        g.drawString(this.utilizador2, this.xUtilizador2, (this.yUtilizador2 - 2));
        g.fillOval(this.xUtilizador2, this.yUtilizador2, 10, 10);

        //utlizador 3
        g.setColor(Color.BLACK);
        g.drawString(this.utilizador3, this.xUtilizador3, (this.yUtilizador3 - 2));
        g.fillOval(this.xUtilizador3, this.yUtilizador3, 10, 10);

        //utlizador 4
        g.setColor(Color.ORANGE);
        g.drawString(this.utilizador4, this.xUtilizador4, (this.yUtilizador4 - 2));
        g.fillOval(this.xUtilizador4, this.yUtilizador4, 10, 10);

        //utlizador 5
        g.setColor(Color.MAGENTA);
        g.drawString(this.utilizador5, this.xUtilizador5, (this.yUtilizador5 - 2));
        g.fillOval(this.xUtilizador5, this.yUtilizador5, 10, 10);
    }
//******************************************************************************
    public void definePosicoes(String uti, int xUti, int yUti,
    String uti1, int xUti1, int yUti1,String uti2, int xUti2, int yUti2
    ,String uti3, int xUti3, int yUti3,String uti4, int xUti4, int yUti4
    ,String uti5, int xUti5, int yUti5)
    {
        setUtilizador(uti);
        setxUtilizador(xUti);
        setyUtilizador(yUti);

        if(xUti1 != 0 && yUti1 != 0) {
        setUtilizador1(uti1);
        setxUtilizador1(xUti1);
        setyUtilizador1(yUti1);
        } else {
        setUtilizador1(" ");
        setxUtilizador1(-30);
        setyUtilizador1(-30);
        }

        if(xUti2 != 0 && yUti2 != 0) {
        setUtilizador2(uti2);
        setxUtilizador2(xUti2);
        setyUtilizador2(yUti2);
        } else {
        setUtilizador2(" ");
        setxUtilizador2(-30);
        setyUtilizador2(-30);
        }

        if(xUti3 != 0 && yUti3 != 0) {
        setUtilizador3(uti3);
        setxUtilizador3(xUti3);
        setyUtilizador3(yUti3);
        } else {
        setUtilizador3(" ");
        setxUtilizador3(-30);
        setyUtilizador3(-30);
        }

        if(xUti4 != 0 && yUti4 != 0) {
        setUtilizador4(uti4);
        setxUtilizador4(xUti4);
        setyUtilizador4(yUti4);
        } else {
        setUtilizador4(" ");
        setxUtilizador4(-30);
        setyUtilizador4(-30);
        }

        if(xUti5 != 0 && yUti5 != 0) {
        setUtilizador5(uti5);
        setxUtilizador5(xUti5);
        setyUtilizador5(yUti5);
        } else {
        setUtilizador5(" ");
        setxUtilizador5(-30);
        setyUtilizador5(-30);
        }
    }

}

Class Main

package testes;

import javax.swing.JFrame;

/**
 *
 * @author Ang3lo
 */
public class Main {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) throws InterruptedException {
    JFrame jframe = new JFrame("Mapa da sala");
    jframe.setVisible(true);
    jframe.setSize(400, 200);
    jframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    
    Mapa mapa = new Mapa();
    jframe.add(mapa);
    
    mapa.definePosicoes("Estou aqui", 100, 100, "Utilizador1", 300, 300, "Utilizador2", 40,
            40, "Utilizador3", 50, 50, "Utilizador4", 60, 60, "Utilizador5", 80, 80);
    
    mapa.desenha();
    jframe.pack();

    Thread.sleep(5000);
        mapa.definePosicoes("Estou aqui", 100, 100, "Utilizador1", 300, 300, "Utilizador2", 400,
            400, "Utilizador3", 500, 500, "Utilizador4", 600, 600, "Utilizador5", 800, 800);
        Thread.sleep(500);
           mapa.desenha();


               Thread.sleep(5000);
        mapa.definePosicoes("Estou aqui", 100, 100, "Utilizador1", 300, 300, "Utilizador2", 400,
            400, "Utilizador3", 500, 500, "Utilizador4", 65, 65, "Utilizador5", 50, 50);
        Thread.sleep(500);
           mapa.desenha();
    }
}

Valeu galera :smiley:

8 Respostas

ViniGodoy

Use um List
http://www.guj.com.br/java/74068-usando-List#389435

A

Pelo que percebi a ideia que estas a dar é de enviar a lista por parametro e preencho com os elementos que tiver naquele momento,
do lado do metodo paint processo a lista que recebi ate chegar ao fim da mesma, isto dentro de um ciclo.

Correcto?

ViniGodoy

Isso.

A

Valeu :smiley: :smiley: :smiley:
problema resolvido, muito obrigado :wink:

A

Só mais uma questão, como posso fazer agora para que por cada DM que desenhe no mapa mude o campo da cor para uma cor deiferente

public void paintComponent(Graphics g)
    {
        super.paintComponent(g);
        g.drawImage(img, 0, 0, null);

        //ciclo que percorre a lista dos DM para que as suas posições sejam
        //marcadas no mapa.
        while(!this.listaDM.isEmpty())
        {
            g.setColor(Color.BLACK);
            g.drawString(this.listaDM.get(0), Integer.parseInt(this.listaDM.get(1)), Integer.parseInt(this.listaDM.get(2)));
            g.fillOval(Integer.parseInt(this.listaDM.get(1)), Integer.parseInt(this.listaDM.get(2)), 10, 10);
            this.listaDM.remove(2);
            this.listaDM.remove(1);
            this.listaDM.remove(0);
        }
    }

Obrigado

ViniGodoy
  1. Crie um atributo com as cores que possivelmente serão sorteadas:

private static Color colors = { Color.RED, Color.GREEN, Color.BLUE, Color.WHITE, Color.YELLOW, Color.ORANGE };

  1. Use a classe Random:

Random r = new Random(); Color corSorteda = colors[r.nextInt(colors.length)];

Outra forma é usar o construtor da classe Color que recebe 3 inteiros, um para o R, outro para o G e outro para B. Eu não gosto muito dessa forma pois ele poderá criar qualquer cor, inclusive cores muito próximas do fundo da tela.

A

Mais uma vez obrigado pela resposta, o que acabei por fazer foi criar um arraylist de cores.
Coloquei 10 cores no array e depois vou percorrendo o array e atribuindo as cores, quando chegar
ao final do array volto a repetir as cores. É idêntico ao que indicas-te :slight_smile:

Tambem funciona, ou vez algum problema nesta solução?

ViniGodoy

Nenhum problema.

Criado 12 de fevereiro de 2011
Ultima resposta 13 de fev. de 2011
Respostas 8
Participantes 2