Tratar posicionamento de formas geométricas em panel

3 respostas
M

Tenho um panel size=500x500 que é usado como base para desenhar algumas figuras geométricas.
Acontece que o tamanho e localização das figuras é determinado pelo usuário. Às vezes, dependendo do valor que o usuário entra, as figuras são desenhadas fora da area visível do panel(as figuram não aparecem). E também, o usuário pode aplicar varias transformaçoes(shear, rotate, translate...) e muitas vezes faz com que as figuras saiam da área visível.

Como poderia tratar esses erros?

public void paintComponent(Graphics g){
       super.paintComponent(g);
       Graphics2D g2d = (Graphics2D) g;
       this.setBackground(new java.awt.Color(255, 255, 255));
       //desenha linhas do painel


       g2d.setColor(randomColor());
       g2d.transform(t);
       //desenha elipse
       if (TransformTestFrame.circun.isSelected()) {
           elipse = new Ellipse2D.Double(posicaox,posicaoy, comprimento, largura);
           g2d.setPaint(new GradientPaint(0, 0, randomColor(), 175, 175, randomColor(),true));
           g2d.fill(elipse);
           g2d.draw(elipse);
           g2d.setColor(Color.black);
           int x=(int) elipse.getCenterX();
           int y=(int) elipse.getCenterY();
        }
       //desenha triangulo
        else if (TransformTestFrame.triang.isSelected()) {
            polyg = new Polygon();
            polyg.addPoint(px[0], py[0]);
            polyg.addPoint(px[1], py[1]);
            polyg.addPoint(px[2], py[2]);
            g2d.setPaint(new GradientPaint(0, 0, randomColor(), 175, 175, randomColor(),true));
            g2d.draw(polyg);
            g2d.fill(polyg);
        }
       //desenha retangulo
        else if (TransformTestFrame.retangulo.isSelected()) {
            rectang = new Rectangle2D.Double();
            rectang.setRect(this.posicaox, this.posicaoy,TransformPanel.comprimento,TransformPanel.largura);
            g2d.setPaint(new GradientPaint(0, 0, randomColor(), 175, 175, randomColor(),true));
            g2d.draw(rectang);
            g2d.fill(rectang);
        }
    }
    public void setRotate()
    {
       t.setToRotation(Math.toRadians(angulo));
       repaint();
    }
    public void setRotateTranlate()
    {
       t.setToRotation(Math.toRadians(angulo), translatex, translatey);
       repaint();
    }
    public void setTranslateInt()
    {
       t.setToTranslation(posx, posy);
       repaint();
    }
    public void setTranslateDouble()
    {
       t.setToTranslation(translatex, translatey);
       repaint();
    }
    public void setScale()
    {
       t.setToScale(fatorx, fatory);
       repaint();
       System.out.println("setscale");
    }
   public void setShear()
    {
       t.setToShear(fatorx,fatory);
       repaint();
       System.out.println("setshear");
    }
   public void setFlipX()
    {
       repaint();
    }
   public void setFlipY()
    {
       repaint();
    }

3 Respostas

F

Imagine que seu Painel é um plano cartesiano onde o canto superior esquerdo é o ponto de coordenadas (zero, zero), o canto superior direito é o ponto (500,0), o canto inferior esquerdo (0,500) e por fim, o canto inferior direito (500,500)…logo você tem um quadrado de lado 500. Ao receber os valores do uusuário, vc pode testar a seguinte condição:

if(valorEntradaX>=0 &&valorEntradaX<=500&&valorEntradaY>=0&&valorEntradaY<=500){
   //permite desenhar
}else{
   JOptionPane.showMessageDialog(this, "O desenho ficará fora da área visual ");
}
M
obrigado pela ajuda. Entendi o raciocínio, adaptei o codigo e mandei rodar mas a telinha do JOptionPane fica travada(parece que ta dentro de um loop). Coloquei de forma que avise o usuario que a imagem foi desenhado fora do quadro.
public void paintComponent(Graphics g){
       super.paintComponent(g);
       Graphics2D g2d = (Graphics2D) g;
       this.setBackground(new java.awt.Color(255, 255, 255));
       //desenha linhas do painel
       g2d.setColor(Color.BLUE);
       g2d.drawLine(0, 250, 500, 250);
       g2d.drawLine(250, 0, 250, 500);
       g2d.drawRect(0, 0, this.LARG_DES-1 , this.ALT_DES-1);

       g2d.transform(t);
       //desenha elipse
       if (FramePrincipal.circun.isSelected()) {
           //if(posicaox&gt;=0 &&posicaox&lt;=500&&posicaoy&gt;=0&&posicaoy&lt;=500){

           if(posicaox&lt;=0 || posicaox&gt;=500 || posicaoy&lt;=0 || posicaoy&gt;=500)
           {
               JOptionPane.showMessageDialog(this, &quot;O desenho ficou fora da área visual &quot;);
           }
           elipse = new Ellipse2D.Double(posicaox,posicaoy, comprimento, largura);
           g2d.setPaint(new GradientPaint(0, 0, randomColor(), 175, 175, randomColor(),true));
           g2d.fill(elipse);
           g2d.draw(elipse);
           g2d.setColor(Color.black);
           int x=(int) elipse.getCenterX();
           int y=(int) elipse.getCenterY(); 
           
        }
}
T

Você não pode dar um alerta dentro de um método paint ou paintComponent. Como você deve saber, esse método serve só para uma coisa, que é pintar o desenho.
Se o desenho ficou fora, você tem de ver isso ANTES de efetivar as alterações.

Criado 30 de março de 2009
Ultima resposta 3 de abr. de 2009
Respostas 3
Participantes 3