Inserir ObjectOutPutStream em um JLabel

25 respostas
L

Não consigo fazer um JLabel receber a captura de um ObjectInputStream.
Podem me ajudar!!!

public void recebeTexto(JLabel img_text) {

new Thread() {
         
       @SuppressWarnings("resource")
	public void run() {
    	   
    	 
	   try{

in = new ObjectInputStream(socket.getInputStream());
System.out.println(“lendo socket do servidor”);

System.out.println(in.readObject()); //esse imprime

				img_text.setText(in.readObject().toString()); //esse não imprime

25 Respostas

staroski

Provavelmente só tem um objeto pra ser lido no seu InputStream mas você está tentando ler um segundo objeto, afinal, está chamando o in.readObject() duas vezes.

Utilize uma variável local para armazenar o objeto lido.

in = new ObjectInputStream(socket.getInputStream());
System.out.println("lendo socket do servidor");

Object objetoLido = in.readObject();

System.out.println(objetoLido); //esse imprime

img_text.setText(objetoLido.toString()); //esse exibe no JLabel
L

top…vcs são fera brother…
Agradeço a família GUJ…
até mais!!!

L

agora me encontro em outro problema…
estou tentando lançar um label em um JList…
acontece o mesmo problema acima…
alguma parte se renova e não consigo perceber…

tenho este método que traz a imagem e o email do banco

public static JList exibiImageList(byte[] minhaimagem,String email, javax.swing.JList label) throws IOException
{

DefaultListModel<Object> list = new  DefaultListModel<Object>();
	   InputStream input = new ByteArrayInputStream(minhaimagem);

            	 BufferedImage imagem = ImageIO.read(input);
                 ImageIcon icon = new ImageIcon(imagem);	
                 Image img = icon.getImage().getScaledInstance(25, 25, 25);
                 list.addElement(new ImageIcon(img));
             	 list.addElement(email);
				
				 label.setModel(list);
    	
          
        
				 return label;
           
		
}
L

e chamo este método assim por um botão:

Chat_Dao dao = new Chat_Dao();

ArrayList<Cliente> cliente = new ArrayList<Cliente>();
        			
        			cliente = (ArrayList<Cliente>) dao.BuscarTodos();	
	
			
	              for(Cliente cli : cliente) {
					
						
						try {
							ManipularImagem.exibiImageList(cli.getImagem(),cli.getEmail(), Cliente_Principal.list);
						} catch (IOException e1) {
							// TODO Auto-generated catch block
							e1.printStackTrace();
						}
				
			}
L

parece carma…só aparece o ultimo registro…
ja rodei tudo e nada…
por favor me ajudem…
estou com prazo para este projeto…vlwwwww

staroski

É que a cada chamada ao método exibiImageList você está setando um novo ListModel para o seu JList.

L

tinha reparado ontem.
será que posso fazer assim:

public static JList exibiImageList(byte[] minhaimagem,String email, javax.swing.JList label, ```
DefaultListModel list) throws IOException
{

L

Executou de boa…ontem eu levei esse método para outra classe e
coloquei a variável no topo e funcionou…
vlw meu brother…obrigado.

L

o grande problema que encontrei foi a posição da imagem com as
Strings do banco.Não tem como adicionar 2 elementos na mesma posição
do JList, só assim:

list.addElement(String);
 list.addElement(imagem);
staroski

Tem sim, pra isso você precisa implementar um ListCellRenderer.

L

sim…oque eu consegui só manda a mesma imagem para todos os emails

L

pode me ajudar com isso.
eu usei ese método:

public Component getListCellRendererComponent(JList list, Object value,
int index, boolean isSelected, boolean cellHasFocus) {

tem como usar outra maneira???

staroski

Posta o código completo de suas classes, não tem como adivinhar a forma que você implementou.

L

public class ActionListCellRenderer implements ListCellRenderer {

@Override
public Component getListCellRendererComponent(JList list, Object value,
int index, boolean isSelected, boolean cellHasFocus) {

//aki não consigo trazer imagem do banco só por URLs
JLabel label= new JLabel());

//Define o texto do JLabel
label.setText(value.toString());

//  if(isSelected)

//  label.setHorizontalAlignment(SwingConstants.CENTER);

// else

label.setHorizontalAlignment(SwingConstants.LEFT);
//Retorna o Label

return label;

}

}

staroski

Ao invés de ficar adicionando String, faz o seu JList renderizar sua coleção de objetos Cliente.

Sugiro utilizar seu próprio ListModel para isso, DefaultListModelsó é legal para conteúdo estático.

Aí no seu renderer o parâmetro value vai ser um objeto do tipo Cliente e você vai obter a imagem dele.

L

tipo assim?
ListModel lista = new ListModel() {

@Override
	public int getSize() {
		// TODO Auto-generated method stub
		return 0;
	}

	@Override
	public Cliente getElementAt(int index) {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public void addListDataListener(ListDataListener l) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void removeListDataListener(ListDataListener l) {
		// TODO Auto-generated method stub
		
	}
};


 //JList
 list = new JList<Cliente>(lista);
L

a imagem fica assim

Captura%20de%20tela%20de%202021-10-08%2015-03-48

L

o problema disso é que a imagem vem como BINARY DATA
e eu converto ela num método!!!e agora???

staroski

Como está implementado o seu Renderer?
Provavelmente você precisa setar o preffered-size do componente utilizado para renderizar a imagem.

L

não fiz implementação .
setei assim setCellRenderer(renderer);

staroski

E como é que inicializou o renderer?

L

pois bem meu amigo…

//aki chamo a classe implementada
                       CustomListCellRenderer renderer = new CustomListCellRenderer();
				      
                      //aki seto na propriedade do JList(setCellRenderer())
				       JList.setCellRenderer(renderer);
L

consegui entender???

staroski

E como é a implementação desse CustomListCellRenderer?

L

essa:

public class ActionListCellRenderer implements ListCellRenderer {

@Override
public Component getListCellRendererComponent(JList list, Object value,
int index, boolean isSelected, boolean cellHasFocus) {

//aki não consigo trazer imagem do banco só por URLs
JLabel label= new JLabel());

//Define o texto do JLabel
label.setText(value.toString());

// if(isSelected)

// label.setHorizontalAlignment(SwingConstants.CENTER);

// else

label.setHorizontalAlignment(SwingConstants.LEFT);
//Retorna o Label

return label;

}

}

Criado 28 de setembro de 2021
Ultima resposta 21 de out. de 2021
Respostas 25
Participantes 2