[RESOLVIDO] Ajudem! JLabel não atualiza!

4 respostas
E

Olá, estou fazendo uma interface gráfica para uma impressora. Como esta impressora só imprime em preto e branco, tenho uma classe que se responsabiliza por transformar uma imagem qualquer em uma imagem em preto e branco. Na interface, ao escolher uma imagem com um JFileChooser e pressionar um botão, um JLabel deve mostrar a imagem original e outro a imagem transformada. Na primeira vez que executo estas ações, tudo funciona perfeitamente. Após a primeira vez, quando executo o mesmo procedimento, porém com outra imagem, apenas a imagem no JLabel colorido muda, e a imagem no outro permanece a mesma. Alguém tem alguma idéia do que possa ser?

4 Respostas

ViniGodoy

Poste o trecho onde você abre o FileChooser e substitua as imagens.

Você também pode tentar chamar repaint(), mas isso não deveria ser necessário.

E

Aqui abro o jFileChoose e coloco o caminho do arquivo escolhido em um campo de texto. Isso funciona bem.

public class ButtonEventListener implements ActionListener{
        public void actionPerformed(ActionEvent e) {

            if(e.getSource()==fileSelectionButton){
                int returnVal = fileChooser.showOpenDialog(PlotterMainFrame.this);
               if (returnVal == JFileChooser.APPROVE_OPTION) {
                File file = fileChooser.getSelectedFile();
                imagePathEntry.setText(file.getAbsolutePath());
               }
            }

Aqui pego o path do campo de texto e binarizo a imagem apontada por este path. Depois tento mudar o ícone dos labels imagePreview1 e imagePreview2 para a imagem original e binarizada respectivamente. Na primeira vez funciona bem, mas se eu quiser repetir o procedimento com outra imagem, apenas o imagePreview1 é atualizado normalmente, enquanto o outro label continua com a mesma imagem.

else if(e.getSource()==buildFileButton){
                myImageTools imageTools = new myImageTools();
                try {
                    System.out.println("path: "+imagePathEntry.getText()+tresholdSlider.getValue());

                    imageTools.binarizeImg(imagePathEntry.getText(), "temporaryImageFile", "png",tresholdSlider.getValue());
                                       
                    
                    preview1 = new ImageIcon(imagePathEntry.getText());
                    imagePreview1.setIcon(preview1);


                    preview2 = new ImageIcon("temporaryImageFile");
                    imagePreview2.setIcon(preview2);
                    
                    JOptionPane.showMessageDialog(null,"File built sucessfully!");

                } catch (Exception ex) {
                    JOptionPane.showMessageDialog(null,"An error occured...);
                    //JOptionPane.showMessageDialog(null,ex.getMessage());
                }
            }
ViniGodoy

Tire fora as linhas 09 e 13 do códigos postado, e mova-as para um construtor (ou para o método initialize).

O que acontece aí é que você está criando um ImageIcon diferente para cada imagem carregada.
Como não é esse novo imageIcon que está sendo exibido na tela, nada será exibido.

E

Agora funcionou. Os dois JLabels estavam sendo atualizados, mas mesmo assim, após algum número aleatório de repetições do procedimento, o mesmo JLabel parava de atualizar seu ícone. Então coloquei um repaint() para cada JLabel e tudo se resolveu. O código agora está assim:

else if(e.getSource()==buildFileButton){
                myImageTools imageTools = new myImageTools();
                try {
                    System.out.println("path: "+imagePathEntry.getText()+tresholdSlider.getValue());

                    imageTools.binarizeImg(imagePathEntry.getText(), "temporaryImageFile", "png",tresholdSlider.getValue());

                    preview1.setImage(ImageIO.read(new File(imagePathEntry.getText())));
                    imagePreview1.setIcon(preview1);
                    imagePreview1.repaint();

                    preview2.setImage(ImageIO.read(new File("temporaryImageFile.png")));
                    imagePreview2.setIcon(preview2);
                    imagePreview2.repaint();
                    
                    JOptionPane.showMessageDialog(null,"File built sucessfully!");

                } catch (Exception ex) {
                   JOptionPane.showMessageDialog(null,ex.getMessage());
                }
            }

Obrigado pela ajuda e rapidez em responder ao tópico.

Criado 26 de novembro de 2010
Ultima resposta 26 de nov. de 2010
Respostas 4
Participantes 2