[Ajuda] Java Métodos e Classes

pdrnvs

Power Member
Boas,
Alguém me pode ajudar neste código?
Eu quero criar uma recta entre dois pontos.

Esta é a minha classe:

Código:
Ponto.java
import java.awt.Graphics;
public class Ponto {
    private int posx,posy;
        public Ponto(int px, int py){
            posx=px;
            posy=py;
        }
        
        public int devolvePosx(){
            return posx;
        }
        public int devolvePosy(){
            return posy;
        }
        
}
Este é o meu programa:
Código:
Programa.java
import java.awt.*;
import java.applet.Applet;
public class Programa extends Applet {
    
    public void criaPontos(){
        Ponto ponto1= new Ponto(50,50);
        Ponto ponto2= new Ponto(100,100);        
    }
    public void desenhaRecta(Graphics g,Object ponto1,Object ponto2){    
        g.drawLine(g,ponto1.devolvePosx(),ponto1.devolvePosy(),ponto2.devolvePosx(),ponto2.devolvePosy());
    }
    
    public static void main(String[] args) {
        criaPontos();
        desenhaRecta(g,ponto1,ponto2);
    }
}
Estou com alguns erros no programa, não consigo utilizar os valores da classe nos métodos do programa. Alguém sabe como é que posso fazer isso??
 
Em vez de:

desenhaRecta(Graphics g,Object ponto1,Object ponto2)

usa:

desenhaRecta(Graphics g,Ponto ponto1,Ponto ponto2)


O problema com que te estás a deparar deve-se ao facto de estares a tentar passar algo que é Ponto (algo mais específico) como argumento de um parâmetro que é Object (algo mais genérico).

Já agora, faço-te outra sugestão: substitui devolvePosx() por getPosX() e o mesmo para o método do Y. O que tu tens aí são getters e que normalmente começam por get. Além do mais, as regras da boa programação em Java dizem-nos que devemos colocar a primeira letra de cada palavra em maiúsculas, logo o X (ainda que seja a única letra da "palavra") deve vir em maiúsculas.

EDIT: reparei agora noutro problema: declaraste as variáveis dentro do método criaPontos e estás a tentar utilizá-las no método main. Isso não é possível, as variáveis ponto1 e ponto2 que declaras em criaPontos só conseguem ser vistas dentro do método criaPontos e assim que a execução deste método terminar, essas variáveis deixam de existir.
 
Última edição:
tem umas quantas falhas

os parametros Object em desenhaRecta ou são do tipo Point ou tens que fazer cast pra Point em drawLine

mas antes disso não consegues no main aceder ao ponto 1 e 2

das 3 uma, ou defines no main o ponto 1 e 2, antes da função criaPontos, inicializando por exemplo com um constructor vazio, inicializas no main ja com os dados finais ou arranjas maneira de fazer um return com os dados dos 2 pontos. So ai criaRecta tera acesso aos dados de point

tens que inicializar g antes de desenhaRecta pra poder ser usado na função. Se inicializares dentro da função, remove como parametro. Pra desenhar uma janela com uma recta precisas de mais tralha.

algo do genero

public static int main()
{
Point p1=new Point();//constructor vazio
Point p2=new Point()
Graphics g = new Graphics();//acho que é assim :P

//função onde editas o point p1 e p2

//tralha de inicialização da janela

//função de desenho

return 0;
}
 
Obrigado nfh e blueomega pelas ajudas!:009:
Ainda não sei muito bem construir métodos e classes

Já estive a melhorar o programa, embora ainda tenha um erro.

Código:
import java.awt.*;
import java.applet.Applet;
public class Programa extends Applet {
    
    public void paint(Graphics g,Ponto ponto1,Ponto ponto2){
        criarPontos();
        desenharPontos(g,ponto1,ponto2);

    }
    
    public void criarPontos() {
        Ponto ponto1=new Ponto(20,20);
        Ponto ponto2=new Ponto(40,40);
        
    }
    
    public void desenharPontos(Graphics g,Ponto ponto1,Ponto ponto2) {
        g.drawLine(ponto1.getPosx(),ponto1.getPosy(),ponto2.getPosx(),ponto2.getPosy());
    }
    
}
O meu problema agora é que a recta não esta a ser desenhada.
Obrigado

Cump
 
Continuas com o mesmo problema. Se fazes:
Código:
public void criarPontos() {
        Ponto ponto1=new Ponto(20,20);
        Ponto ponto2=new Ponto(40,40);
 
    }

então estás a declarar 2 variáveis locais (ponto1 e ponto2) no método criarPontos. Isto significa que as variáveis desaparecem assim que o método criarPontos terminar.
Mesmo que uses o mesmo nome de variáveis (isto é, se ponto1 e ponto2 existirem noutro local do teu programa), passas a ter novas variáveis e a inicialização dessas não vai influenciar outras quaisquer que tenhas no teu programa.

Para resolver o problema, podes declarar as variáveis como membros privados da classe Programa. Assim as variáveis já existem durante toda a existência da Applet instanciada. Cria também o método init onde deves invocar o método criarPontos (não é necessário instanciares os pontos cada vez que o método paint é invocado, uma vez que os pontos não mudam ao longo da execução do programa).

Dá uma vista de olhos nos tutoriais da sun sobre applets: http://java.sun.com/docs/books/tutorial/deployment/applet/getStarted.html

encontras aqui muita informação e exemplos que certamente te ajudarão.

Outro pormenor: o método paint tem uma assinatura única (nº de argumentos + tipos de dados deles). Ao criares um método com a assinatura paint(Graphics, Ponto, Ponto), significa que o paint "original" não está redefinido/substituído (override). Basicamente o que estás a fazer é o que se chama de overload (vários métodos com o mesmo nome mas com parâmetros diferentes).
É também por estares a fazer o overload em vez de override que o teu desenho nunca aparece.

A partir do momento em que tiveres os pontos como membros privados da classe, já não precisas de os passar para o método paint (eles já são acessíveis por si só).

Já agora, se queres seguir uma das sugestões que te dei, não se esqueças de por o X e o Y em maiúsculas nos métodos getPosx e getPosy. Obviamente que isto não afecta a forma como o teu programa funciona, mas fica melhor assim.
 
Última edição:
Continuas com o mesmo problema. Se fazes:
Código:
public void criarPontos() {
        Ponto ponto1=new Ponto(20,20);
        Ponto ponto2=new Ponto(40,40);
 
    }
então estás a declarar 2 variáveis locais (ponto1 e ponto2) no método criarPontos. Isto significa que as variáveis desaparecem assim que o método criarPontos terminar.
Mesmo que uses o mesmo nome de variáveis (isto é, se ponto1 e ponto2 existirem noutro local do teu programa), passas a ter novas variáveis e a inicialização dessas não vai influenciar outras quaisquer que tenhas no teu programa.

Para resolver o problema, podes declarar as variáveis como membros privados da classe Programa. Assim as variáveis já existem durante toda a existência da Applet instanciada. Cria também o método init onde deves invocar o método criarPontos (não é necessário instanciares os pontos cada vez que o método paint é invocado, uma vez que os pontos não mudam ao longo da execução do programa).

Dá uma vista de olhos nos tutoriais da sun sobre applets: http://java.sun.com/docs/books/tutorial/deployment/applet/getStarted.html

encontras aqui muita informação e exemplos que certamente te ajudarão.

Outro pormenor: o método paint tem uma assinatura única (nº de argumentos + tipos de dados deles). Ao criares um método com a assinatura paint(Graphics, Ponto, Ponto), significa que o paint "original" não está redefinido/substituído (override). Basicamente o que estás a fazer é o que se chama de overload (vários métodos com o mesmo nome mas com parâmetros diferentes).
É também por estares a fazer o overload em vez de override que o teu desenho nunca aparece.

A partir do momento em que tiveres os pontos como membros privados da classe, já não precisas de os passar para o método paint (eles já são acessíveis por si só).

Já agora, se queres seguir uma das sugestões que te dei, não se esqueças de por o X e o Y em maiúsculas nos métodos getPosx e getPosy. Obviamente que isto não afecta a forma como o teu programa funciona, mas fica melhor assim.

Já percebi.
É que quem passa de pascal para java não tem nada haver.
Obrigado pelas dicas.:009:
Cump
 
pensa assim tudo que fazes dentro de uma função se não mexeres em variaveis fora da função basicamente desaparece, é apagado

por isso é que geralmente se retorna dados
 
Back
Topo