Pegar valores

6 respostas
M

Salve! A pergunta é básica mas eu estou tendo muitos problemas com isso, muitas coisas que eu faço eu travo nesta parte. Exemplo:

Eu tenho uma classe X com um método “1”;
Tenho uma classe Y e com um método “2”:

Na classe Y no método “2” atribui um valor para uma variável que instanciei como global nesta mesma classe Y.

Agora na classe X no método 1 instanceio a classe Y (Y m = new Y()) e chamo o método 2 “m.metodo2();”

Ai que surge minha dúvida, eu quero pegar o valor da variavel do método 2 da classe Y em imprimir na tela (por exemplo) pelo método 1 da classe X.

Deu pra entender?

public class Y {

String a;
String b;
String r;

 a = "2";
 b = "2";

public void metodo2 () {

  r = a+b;

    }
}
public class X {

String v;

public void metodo2() {

   //Exemplo
   Y m = new Y();
   m.metodo2();
   v = r; 
   System.out.println(v);
   // Só que é claro que dá o "Cannot be resolved"
    }
}

Então como faço pra pegar este valor de m pela classe X?

Vlw abçs!!!

6 Respostas

fiaux

Métodos de acesso, ou seja, métodos get().

M

Certo, e você poderia dar uma exemplo?

A

Dá pra fazer mesmo sem get(), mas não recomendo…

Você colocou um código bem básico, o meu também é, acho que você vai entender:

public class Y {
    public static String m;
    
    public void met2(){
        m="oi";
    }
}

class X{
    static String v;
    
    public static void met1(){
        v=forum.m;
        System.out.println(v);
    }
}
  • Os nomes dos métodos não podem começar com números;
  • O valor pode ser passado diretamente através de referência;
  • Métodos estáticos podem ajudar.

Ajudei?

gilmarcand

Aqui segue um exemplo utilizando métodos get e set. É o mais comum

public class Y{
	private String a;
	private String b;
	private String frase;
	
	// metodos get publicos para acessar os atributos que são privados
	public String getA(){
		return a;
	}
	public String getB(){
		return b;
	}
	public String getFrase(){
		return frase;
	}

	// metodos set publicos para alterar o valor dos atributos
	public void setA(String a){
		this.a = a;
	}
	public void setB(String b){
		this.b = b;
	}

	// Seu método de trabalho. Vou chamar de montaFrase
	public void montaFrase(){
		frase = a + b;
	}

}
public class X {
	public void metodoX(){
		Y y = new Y();
		System.out.println(y.getFrase()); // imprime null porque ainda não setamos a e b

		y.setA("Ola ");
		y.setB("mundo!");
		System.out.println(y.getFrase()); // ainda imprime null porque não montamos a frase
		
		y.montaFrase();
		System.out.println(y.getFrase()); // imprime Ola mundo!
	}

	public static void main(String args[]){
		X x = new X();
		x.metodoX();
	}
}

Compila primeiro a classe Y e depois a X. Depois é só rodar a classe X pois ela tem o método main.

Espero ter ajudado! bons códigos! :slight_smile:

M

AkimSalvador:
Dá pra fazer mesmo sem get(), mas não recomendo…

Você colocou um código bem básico, o meu também é, acho que você vai entender:

public class Y {
    public static String m;
    
    public void met2(){
        m="oi";
    }
}

class X{
    static String v;
    
    public static void met1(){
        v=forum.m;
        System.out.println(v);
    }
}
  • Os nomes dos métodos não podem começar com números;
  • O valor pode ser passado diretamente através de referência;
  • Métodos estáticos podem ajudar.

Ajudei?

Cara funcionou perfeitamente mas pro meu caso não ajudou olha só:

Tenho um JTable com as seguintes colunas e as variaveis que deverão pegar os valores da outra classe, e declarei como public static como você falou.

//Class X

public static String x, y, z;

String[] columnNames = {"Descrição",
								"Código",
								"Saldo"
								};
							
		Object[][] data = {
			{x , y, z},
			
		};

Tenho o seguinte método para dar o select, se eu pedir pra imprimir na tela “perfeito” só que quero ir armazenando em colunas no JTable (Desc, Cód, Saldo).

Obs: as variáveis “desc, cod e saldo” estão como static.

//Class Y

public void selecionar() {
	 	try {
	 		Statement stm = connection.createStatement();
	 		ResultSet result = stm.executeQuery(
			"SELECT desc_prod, cod_prod, saldo FROM PRODUTO;");
           
           while (result.next()) {
           	desc = result.getString(1);
			cod = result.getString(2);
			saldo = result.getString(3);
			
			Interface.x = desc;
			Interface.y = cod;
			Interface.z = saldo;

           }
		   stm.close();  
		   connection.close();
          }
            catch (SQLException e) {
            	e.printStackTrace();
				JOptionPane.showMessageDialog(null, "Não foi possível efetuar a operação!");
            }
	      }

Enfim o método que está difícil de encaixar:

// Class X

public class MyAction implements ActionListener {
			public void actionPerformed(ActionEvent ae) {
			
			   if(ae.getSource() == saldos) {
				frame2.setVisible(true);
			   	
			   	mySql c = new mySql();
			   	c.selecionar();
			   	System.out.println(x+y+z);

				JTable table = new JTable(data, columnNames);
				frame2.getContentPane().add(table);
			   }
			}

Certo, agora os problemas que estão dando:

O JTable parece não atualizar os dados, sempre vem como null (conforme o código ele deve armazenar somente os ultimos valores das viáveis x,y,z mas nem isso acontece vem como null(mas peço pra imprimir as variáveis x,y,z vem com os valores atualizados);

O meu JInternalFrame quando eu fecho não abre mas ao clicar no botão, sei que é porque adicionei ele no construtor e o construtor só é chamado 1 vez ao instanciar a classe, mas se peço para ele adicionar ao frame pelo método não da erro mas fica tudo tosko eu consigo clicar nos botões através do JInternalFrame, até penso que é por causo do windows98 que estou usando e instalo versões recentes, vou testar em casa para ver depois…

Mas a principal dúvida é essa dos valores, ah! e como eu posso fazer um looping também de ir pegando e jogando no Table e ir acumulando até acabar o select?

Aguardo abçs.

gilmarcand

malstryx, pelo que entendi você quer uma classe que vai no banco buscar os dados e outra que mostra os dados no grid. Sem alterar muito o teu código original, eu preferiria criar o metodo seleciona() da classe Y retornando um ArrayList. Ficaria assim:

package teste;

import java.sql.*;
import java.util.*;

class Y {

    public ArrayList<String[]> seleciona() {
        ArrayList list = new ArrayList();
        try {
            Class.forName("driverDoBanco");
            Connection connection = DriverManager.getConnection("DBURL");
            Statement stm = connection.createStatement();  
            ResultSet result = stm.executeQuery("SELECT desc_prod, cod_prod, saldo FROM PRODUTO;");  

            while (result.next()) 
            {
                list.add(new String[]{result.getString(1),result.getString(2),result.getString(3)});
            }  
            stm.close();    
            connection.close();
            return list;
        }
        catch(Exception e)
        {
            // aqui você pode tratar melhor no caso de Exception
            return null;
        }
    }
}

Na classe X eu criaria o JFrame e iniciaria os objetos (inclusive o JTable). no botão eu chamaria dois métodos para limpar e carregar o grid. Segue o código:

package teste;
import java.awt.*;
import java.awt.event.*;
import java.util.*;
import javax.swing.*;
import javax.swing.table.*;

public class X
{
    String data [][] = null;
    String colunsName[] = {"Descricao","Codigo","Saldo"};
    JFrame frame;
    JTable table;
    ArrayList <String []> dados;
    JButton button;
    Y y;
    
    public X()
    {
        y = new Y();
        frame = new JFrame("Java Aplication");
        frame.setSize(600, 600);
        table = new JTable();
        table.setModel(new DefaultTableModel(data,colunsName));
        JScrollPane scrollPane = new JScrollPane();
        scrollPane.setSize(100,100);
        scrollPane.setViewportView(table);
        frame.getContentPane().setLayout(new FlowLayout());
        frame.getContentPane().add(scrollPane);
        button = new JButton("Load");
        button.addActionListener(new MyAction());
        frame.getContentPane().add(button);
        frame.setVisible(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
    
    public void clearGrid()
    {
        DefaultTableModel model = (DefaultTableModel)table.getModel();
        int rows = model.getRowCount();
        for (int i = 0; i < rows; i++)
        {
            model.removeRow(i);
        }
    }
    
    
    public void loadGrid()
    { 
        dados = y.seleciona();
        if (dados != null)
        {
            DefaultTableModel model = (DefaultTableModel)table.getModel();
            for (int i = 0; i< dados.size(); i++)
            {
                model.addRow(dados.get(i));
            }
        }
        
        
    }
    
    public static void main(String [] args)
    {
        X x = new X();
    }
    
    class MyAction implements ActionListener
    {
        public void actionPerformed(ActionEvent ae)
        {
            if (ae.getSource()==button)
            {
                clearGrid();
                loadGrid();
            }
        }
    }
    
}

Vê se te ajuda. Bons códigos! :slight_smile:

Criado 17 de abril de 2008
Ultima resposta 17 de abr. de 2008
Respostas 6
Participantes 4