[Resolvido] Drag'n Drop de imagem

Pessoal, eu coloquei um drag’n drop de imagens no meu programa, desktop, no caso eu posso selecionar e arrastar a imagem ate ele que funciona tranquilo, o problema ocorre na hora de salvar, quando eu seleciono ele salva tranquilo, mas quando eu arrasto ele nao salva no banco.

Eu transformo a imagem em array e salvo no banco, meu problema é que, eu sei onde é a causa do problema, só não sei como solucionar.

JFileChooser chooser = new JFileChooser();
chooser.setAcceptAllFileFilterUsed(false);
FileNameExtensionFilter filter = new FileNameExtensionFilter("Somente Imagens (.jpg e .png)", "jpg", "png");
chooser.addChoosableFileFilter(filter);
chooser.setDialogTitle("Selecione uma foto para o visitante");
chooser.showOpenDialog((null));
File f = chooser.getSelectedFile();

filename = f.getAbsolutePath();
ImageIcon imageIcon = new ImageIcon(new ImageIcon(filename).getImage().getScaledInstance(campofoto.getWidth(), campofoto.getHeight(), Image.SCALE_DEFAULT));
campofoto.setIcon(imageIcon);

Bom, eu pego o arquivo selecionado do fileChosser e transformo, mas eu queria que pegasse o campo, sabe? O campo da foto seria transformado.

Agora minha classe do drag:

public void drop(DropTargetDropEvent ev) {
    //aceita itens de fora
    ev.acceptDrop(DnDConstants.ACTION_COPY);
    //dropando itens
    Transferable t = ev.getTransferable();
    //formatos dos itens
    DataFlavor[] df = t.getTransferDataFlavors();
    //loop
    for (DataFlavor f : df) {
        try {
            if (f.isFlavorJavaFileListType()) {
                List<File> files = (List<File>) t.getTransferData(f);
                for(File file: files){
                    displayImage(file.getPath());
                }
            }
        } catch (Exception ex) {
            JOptionPane.showMessageDialog(null, "Erro ao dropar imagem"+ex);
        }
    }
}

e aqui eu mostro ela no JLabel:

private void displayImage(String path){
    BufferedImage img =null;
    try {
        img=ImageIO.read(new File(path));
    } catch (Exception e) {
    }
    Image imagem = img.getScaledInstance(260, 240, 1000);
    ImageIcon icon = new ImageIcon(imagem);
    imageLabel.setIcon(icon);
    pathLabel.setText(path);
}

Ah, e aqui eu transformo ela (TRANSFORMO MEU ARQUIVO SELECIONADO DO FILECHOOSER):

try {
    File image = new File(filename);
    FileInputStream fix = new FileInputStream(image);
    ByteArrayOutputStream bos = new ByteArrayOutputStream();
    byte[] buf = new byte[1024];

    for (int number; (number = fix.read(buf)) != -1;) {
        bos.write(buf, 0, number);
    }
    person_image = bos.toByteArray();
} catch (IOException e) {
    JOptionPane.showMessageDialog(null, e);
}

Acho que seria mais ou menos:

BufferedImage foto = new BufferedImage(500, 500, BufferedImage.TYPE_INT_RGB); // tamanho fixo, se o tamanho do campo for fixo então podem ser iguais
JLabel campoFoto = new JLabel(new ImageIcon(foto));

void abrirFoto(File file) {
  Image imagem = ImageIO.read(file);

  Graphics2D g = foto.createGraphics();
  // limpa a foto
  g.setBackground(Color.WHITE);
  g.clearRect(0, 0, foto.getWidth(), foto.getHeight());
  // copia a imagem para a foto, automaticamente escala a imagem.
  g.drawImage(imagem, 0, 0, foto.getWidth(), foto.getHeight(), null);
  g.dispose();

  campoFoto.repaint(); // avisa o componente que a foto mudou
}

public void persistirFoto() {
  ByteArrayOutputStream bos = new ByteArrayOutputStream();
  ImageIO.write(foto, "jpg", bos);
  person_image = bos.toByteArray(); // falta terminar aqui
}
1 curtida

E aí Diego, tudo bem? Cara, não rolou pra mim…

Eu mudei o jeito de salvar no banco também, alterei pra salvar só o caminho, aparentemente tinha resolvido, mas eu como eu fiz o meu drag’n drop em uma classe separada, eu não consigo setar esse path pra a minha string. Tá assim:

Aqui eu não mudei:

public void drop(DropTargetDropEvent ev) {
    //aceita itens de fora
    ev.acceptDrop(DnDConstants.ACTION_COPY);
    //dropando itens
    Transferable t = ev.getTransferable();
    //formatos dos itens
    DataFlavor[] df = t.getTransferDataFlavors();
    //loop
    for (DataFlavor f : df) {
        try {
            if (f.isFlavorJavaFileListType()) {
                List<File> files = (List<File>) t.getTransferData(f);
                for(File file: files){
                    displayImage(file.getPath());
                }
            }
        } catch (Exception ex) {
            JOptionPane.showMessageDialog(null, "Erro ao dropar imagem"+ex);
        }
    }
}

Já nessa eu fiz algumas alterações:

public void displayImage(String path) {
    try {
        BufferedImage img = null;
        img = ImageIO.read(new File(path));
    } catch (Exception e) {
        //JOptionPane.showMessageDialog(null, "Erro ao mostrar imagem\n" + e);
    }
    ImageIcon icon = new ImageIcon(new ImageIcon(path).getImage().getScaledInstance(imageLabel.getWidth(), imageLabel.getHeight(), Image.SCALE_DEFAULT));
    imageLabel.setIcon(icon);
    pathLabel.setText(path);
}

Aí na minha outra classe tá:

String caminho;

E onde eu chamo a minha outra classe, a DragVisitante

private void connect() {
    DragVisitante d = new DragVisitante(campofoto, pathLabel);
    new DropTarget(this, d);
    pathLabel.setText(caminho);
}

E por fim, aqui eu seleciono e foto pelo botão, que salva direitinho:

JFileChooser chooser = new JFileChooser();
chooser.setAcceptAllFileFilterUsed(false);
FileNameExtensionFilter filter = new FileNameExtensionFilter("Somente Imagens (.jpg e .png)", "jpg", "png");
chooser.addChoosableFileFilter(filter);
chooser.setDialogTitle("Selecione uma foto para o visitante");
chooser.showOpenDialog((null));
File f = chooser.getSelectedFile();

caminho = f.getPath();
ImageIcon i = new ImageIcon(new ImageIcon(caminho).getImage().getScaledInstance(campofoto.getWidth(), campofoto.getHeight(), Image.SCALE_DEFAULT));
campofoto.setIcon(i);

E só pra não ficar vago, eu salvo minha imagem aqui:

PreparedStatement pst = conecta.conn.prepareStatement("insert into visitantes (foto)values(?)");
pst.setString(1, caminho);

Consegui, não sei pq não foi antes, mas agora foi…

caminho = pathLabel.getText();