Desenho de Polilinhas

5 respostas
F
Ola, estou tentando fazer um programa que vc clica no frame com o mouse em dois lugares qualquer , com um metodo vc pega a posição desses lugares que clicou. e então com um outro metodo( um clique duplo no caso) o programa traça uma reta entre esses pontos , no caso estou tentando usar Polilinhas..
package Projeto_Desenho_Reta;

import java.awt.Point;
import java.awt.Polygon;
import java.awt.Graphics;
import javax.swing.JPanel;
import java.awt.event.MouseEvent;
import java.awt.event.MouseAdapter;

public class Polilinhas extends JPanel {
    
    private Point points[] ;
    
    private int pointCount = 0;
    
    public void paintComponent( Graphics g) {
        super.paintComponent(g);
        
        addMouseListener(new MouseAdapter() { 
            public void mouseClicked(MouseEvent event) {
                
                points[pointCount] = event.getPoint();//localiza o ponto
                pointCount++; //incrementa numero de ponto em array
                
                
            }
        });
        
        addMouseListener(new MouseAdapter(){ 
            public void mouseClicked(MouseEvent event){ 
                if(event.getClickCount()==2) {
                    
                    
                    for(int i = 0 ; i <= pointCount ; i++) {
                        int xValues[] = { points[i].x};
                        int yValues[] = { points[i].y};
                        
                        
                    }
                        g.drawPolyline(xValues,yValues,pointCount);
                    
                }
            }
                
            
        });
        
    }
    
    
    
}
Bom eu acho que éssa logica está errada, mas foi o que consegui fazer , os erros que dão são esse: "C:\Projetos Java\Projeto_Desenho_Reta\src\Projeto_Desenho_Reta\Polilinhas.java:49: cannot find symbol symbol: variable xValues g.drawPolyline(xValues,yValues,pointCount); C:\Projetos Java\Projeto_Desenho_Reta\src\Projeto_Desenho_Reta\Polilinhas.java:49: cannot find symbol symbol: variable yValues g.drawPolyline(xValues,yValues,pointCount); C:\Projetos Java\Projeto_Desenho_Reta\src\Projeto_Desenho_Reta\Polilinhas.java:49: local variable g is accessed from within inner class; needs to be declared final g.drawPolyline(xValues,yValues,pointCount); 3 errors"

Alguem por favor poderia me ajudar?

ai vai o codigo da classe principal se for necessario

package Projeto_Desenho_Reta;

import javax.swing.JFrame;

public class Desenho {
    
    public static void main (String args []) {
        JFrame frame = new JFrame("Desenho de retas por pontos");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        
        Polilinhas polilinha = new Polilinhas ();
        frame.add(polilinha);
        frame.setSize(280,270);
        frame.setVisible(true);
    }
    
}

5 Respostas

T

Hum, Java != JavaScript. Arrays não aumentam automaticamente de tamanho, e devem ser inicializados. Exemplo:

private Point points[] ;
....
     points = new Point [10000]; // por exemplo

Em outro lugar, você está declarando xValues e yValues dentro do laço for, ou seja, essas variáveis vão ficar invisíveis (fora de escopo) depois de sair do "for". Acho que você queria dizer:

public void mouseClicked(MouseEvent event){ 
                 if(event.getClickCount()==2) {
                     int xValues[] = new int[pointCount];
                     int yValues[] = new int[pointCount];
                     
                     for(int i = 0 ; i &lt pointCount ; i++) {
                         xValues[i] =  points[i].x;
                         yValues[i] =  points[i].y;
                         
                         
                     }
                         g.drawPolyline(xValues,yValues,pointCount);
                     
                 }
             }
ViniGodoy

Outra coisa… provavelmente você não sabe o número de pontos na polilinhas. O Java tem classes para listas, chamada ArrayList.
Você pode fazer:

List<Point> points = new ArrayList<Point>()

Depois, para adicionar, basta usar o método
points.add(new Point(x, y));

Essa classe sim, expande-se automaticamente.

Para mais informações pesquise sobre Java Collections Framework e as classes List.

F

E ae thingol …
Então kara, eu fiz o exemplo que vc deu . … mas ainda sim ta dando um problema … nessa parte aki :
g.drawPolyline(xValues,yValues,pointCount);

o problema é esse :
“C:\Projetos Java\Projeto_Desenho_Reta\src\Projeto_Desenho_Reta\Polilinhas.java:50: local variable g is accessed from within inner class; needs to be declared final
g.drawPolyline(xValues,yValues,pointCount);”

vc sabe o que pode ser ?

ViniGodoy

É exatamente o que diz o erro.

Você está tentando a variável g de dentro de uma inner class e isso não é possível, a menos que g seja declarada como final.

Normalmente isso é possível. Basta na declaração colocar a palavra final na frente do tipo da variável g.

Outra possibilidade seria, se sua Inner Class não for anônima, passar g como parâmetro num construtor e daí referenciar g através de um atributo da inner class.

public void paintComponent(final Graphics g) {
         super.paintComponent(g);
         
         addMouseListener(new MouseAdapter() { 
             public void mouseClicked(MouseEvent event) {
                 
                 points[pointCount] = event.getPoint();//localiza o ponto
                 pointCount++; //incrementa numero de ponto em array
                 
                 
             }
         });

Só um detalhe, será que o paintComponent é o melhor lugar para você registrar esse listener? Esse método será chamado diversas vezes, basicamente, toda vez que seu form precisar se repintar. O ideal seria você só colocar código de desenho aí dentro.

F

E ae ViniGodoy …
Bom, depois que coloquei o final lá rodou … só que na hora que eu dou clique duplo no jframe , da pau no programa olha a relação de erros .

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException at Projeto_Desenho_Reta.Polilinhas$2.mouseClicked(Polilinhas.java:46) at java.awt.AWTEventMulticaster.mouseClicked(AWTEventMulticaster.java:253) at java.awt.Component.processMouseEvent(Component.java:6041) at javax.swing.JComponent.processMouseEvent(JComponent.java:3260) at java.awt.Component.processEvent(Component.java:5803) at java.awt.Container.processEvent(Container.java:2058) at java.awt.Component.dispatchEventImpl(Component.java:4410) at java.awt.Container.dispatchEventImpl(Container.java:2116) at java.awt.Component.dispatchEvent(Component.java:4240) at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4322) at java.awt.LightweightDispatcher.processMouseEvent(Container.java:3995) at java.awt.LightweightDispatcher.dispatchEvent(Container.java:3916) at java.awt.Container.dispatchEventImpl(Container.java:2102) at java.awt.Window.dispatchEventImpl(Window.java:2429) at java.awt.Component.dispatchEvent(Component.java:4240) at java.awt.EventQueue.dispatchEvent(EventQueue.java:599) at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:273) at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:183) at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:173) at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:168) at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:160) at java.awt.EventDispatchThread.run(EventDispatchThread.java:121)

bom, acho que deve ser algum erro na logica ,mas sei lá , é a primeira vez que estou trabalhando com desenhos no jFrame ( principalmente em se tratando de traçar um reta por pontos)

Criado 7 de março de 2007
Ultima resposta 9 de mar. de 2007
Respostas 5
Participantes 3