[Resolvido?]Desenhar imagem no jFrame sem apagar os outros componentes

Gente, estou com uma outra dúvida…
Só explicando o por que dos tópicos : Eu decidi ler o livro Killer java do começo e estou estudando os códigos e tentando aprender na prática, e percebi que tem muitas coisas que eu sei na teoria, mas na prática não.
Eu Também imprimi todos os tutoriais do pontoV e estou re-lendo novamente.

Enfim… O problema que estou agora é outro rsrsrsrs;

Tenho um JFrame.
Nesse JFrame eu tenho algumas labels e UM BOTAO e um menuBar.

Quando eu desenho o Buffered Image nele, ele apaga tudo , menos o Botao. E então ele desenha a imagem perfeitamente.

Achei isso, enquanto pesquisava :

[quote]ViniGodoy
Moderador

Membro desde: 11/12/2006 08:22:01
Mensagens: 23415
Localização: Curitiba/PR
Online
Só um outro comentário. O JPanel e o Graphics não guardam estado. Há duas maneiras de não perder o que é desenhado:

  1. Criar uma lista de objetos a serem desenhados. E então pinta-los sempre que o método paintComponent for chamado.
  2. Desenhar sobre uma BufferedImage, e só repintar essa imagem no paintComponent;

A opção 1 provavelmente é a melhor no seu caso. Você precisará guardar os circuitos existentes e suas propriedades, e dar a possibilidade de mover alguns circuitos ou deletá-los. Portanto, você já terá que guardar estado do que está desenhado de um jeito ou de outro.

A opção 2 é melhor se você estiver montando um paint. Usa-se um componente temporário, até que o usuário confirme o desenho. Após isso, copia-se o desenho final para o BufferedImage e o componente original feito para desenha-lo é “esquecido”. Não é mais possível redimensionar uma forma posicionada na tela.[/quote]

Essa opção 2, eu acho que é o que estou fazendo…
Eu ja sei usar a opção 1, mas eu quero a 2.

Como posso fazer isso?

Vou postar o código, na View,vou limpar o main e deixar só o necessário, ok ?

VIEW :

[code]package MainView;

import Controller.MainController;
import java.awt.Graphics2D;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.image.BufferStrategy;
import java.awt.image.BufferedImage;

public class MainView extends javax.swing.JFrame implements KeyListener {

private static final long serialVersionUID = 1L;
private MainController mainController;
private int insetTop,insetRight;

public MainView() {
    initComponents();
    
    insetTop = getInsets().top;
    insetRight = getInsets().right;
    mainController = new MainController(this,insetRight,insetTop);
    
    addKeyListener();
    createBufferStrategy(3);
}

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         
    BufferStrategy bf = getBufferStrategy();
    
    Graphics2D g = null;
    try {
        g = (Graphics2D) bf.getDrawGraphics();
        
        BufferedImage snakeImage = mainController.snake.getSnakeImage();
        //Graphics2D createGraphics = snakeImage.createGraphics();
         g.drawImage(snakeImage,100,100, rootPane);
        
        
    } finally {
        g.dispose();
    }
    if (!bf.contentsLost()) {
        bf.show();
    }


}                                        

++ public static void main(String args[]) { }
// Variables declaration - do not modify
private javax.swing.JButton jButton1;
private javax.swing.JLabel jLabel1;
private javax.swing.JLabel jLabel2;
private javax.swing.JLabel jLabel3;
private javax.swing.JLabel jLabel4;
private javax.swing.JLabel jLabel5;
private javax.swing.JLabel jLabel6;
private javax.swing.JMenu jMenu1;
private javax.swing.JMenu jMenu2;
private javax.swing.JMenu jMenu3;
private javax.swing.JMenuBar jMenuBar1;
// End of variables declaration

public final void addKeyListener() {
    addKeyListener(this);
}

@Override
public void keyTyped(KeyEvent e) {
    System.out.println("Key Typed :" + e.getKeyCode());

}

@Override
public void keyPressed(KeyEvent e) {
    System.out.println("Key Pressed :" + e.getKeyCode());
}

@Override
public void keyReleased(KeyEvent e) {
    System.out.println("Key Released :" + e.getKeyCode());

}

}
[/code]

[code]/*

  • To change this template, choose Tools | Templates
  • and open the template in the editor.
    */
    package Objetos;

import java.awt.Color;
import java.awt.image.BufferedImage;
import java.io.File;
import javax.imageio.ImageIO;

/**
*

  • @author André
    */
    public class Snake {

    private int positionX;
    private int positionY;
    private Color color;
    private String snakeDirectory = “D:\Arquivos E Programas\MeusProjetosJava\ImagesVideosAudio\Images\mySnake.gif”;

    public Snake(int posX, int posY, String colour) {
    positionX = posX;
    positionY = posY;
    color = Color.getColor(colour);
    }

    public BufferedImage getSnakeImage() {
    try {
    File snakeImageFile = new File(snakeDirectory);
    BufferedImage im = ImageIO.read(snakeImageFile);
    return im;

     } catch (Exception ex) {
         System.out.println(ex.getMessage());
         ex.printStackTrace();
         
     }
     return null;
    

    }

    public void getSnake() {
    }
    }
    [/code]

[code]/*

  • To change this template, choose Tools | Templates
  • and open the template in the editor.
    */
    package Controller;

import MainView.MainView;
import Objetos.Snake;

/**
*

  • @author André
    */
    public class MainController
    {
    private MainView mainView;
    public Snake snake;

    public MainController(MainView mv,int posX,int posY)
    {
    mainView = mv;
    snake = new Snake(posX, posY,“Black”);
    }

}
[/code]

Consegui fazer, mas de um jeito Diferente…
Eu criei um jPanel e dentro dele eu pinto uma imagem.

Ainda vou separar melhor em MVC, mas isso aqui pode ajudar quem ta com dificudlades que nem eu :

[code]package MainView;

import Controller.MainController;
import java.awt.Color;
import java.awt.Component;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.Transparency;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.image.BufferStrategy;
import java.awt.image.BufferedImage;

public class MainView extends javax.swing.JFrame implements KeyListener {

private static final long serialVersionUID = 1L;
private MainController mainController;
private int insetTop, insetRight;
private BufferedImage snakeImage;

public MainView() {
    initComponents();

    insetTop = getInsets().top;
    insetRight = getInsets().right;
    mainController = new MainController(this,insetRight, insetTop);

    addKeyListener();

    createBufferStrategy(2);
    
    
    snakeImage = mainController.snake.getSnakeImage();
}

@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">                          
private void initComponents() {

    jLabel1 = new javax.swing.JLabel();
    jLabel2 = new javax.swing.JLabel();
    jLabel3 = new javax.swing.JLabel();
    jLabel4 = new javax.swing.JLabel();
    jLabel5 = new javax.swing.JLabel();
    jLabel6 = new javax.swing.JLabel();
    jButton1 = new javax.swing.JButton();
    jPanel1 = new javax.swing.JPanel();
    jMenuBar1 = new javax.swing.JMenuBar();
    jMenu1 = new javax.swing.JMenu();
    jMenu2 = new javax.swing.JMenu();
    jMenu3 = new javax.swing.JMenu();

    setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

    jLabel1.setText("Score :");

    jLabel2.setText("FPS :");

    jLabel3.setText("UPS :");

    jButton1.setText("Animate!");
    jButton1.addActionListener(new java.awt.event.ActionListener() {
        public void actionPerformed(java.awt.event.ActionEvent evt) {
            jButton1ActionPerformed(evt);
        }
    });

    jMenu1.setText("File");
    jMenuBar1.add(jMenu1);

    jMenu2.setText("Edit");
    jMenuBar1.add(jMenu2);

    jMenu3.setText("Configuration");
    jMenuBar1.add(jMenu3);

    setJMenuBar(jMenuBar1);

    javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
    getContentPane().setLayout(layout);
    layout.setHorizontalGroup(
        layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
        .addGroup(layout.createSequentialGroup()
            .addContainerGap()
            .addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, 860, Short.MAX_VALUE)
            .addGap(18, 18, 18)
            .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addComponent(jButton1, javax.swing.GroupLayout.PREFERRED_SIZE, 102, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGroup(layout.createSequentialGroup()
                    .addGap(18, 18, 18)
                    .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                        .addGroup(layout.createSequentialGroup()
                            .addComponent(jLabel1)
                            .addGap(10, 10, 10)
                            .addComponent(jLabel4, javax.swing.GroupLayout.PREFERRED_SIZE, 58, javax.swing.GroupLayout.PREFERRED_SIZE))
                        .addGroup(layout.createSequentialGroup()
                            .addComponent(jLabel2, javax.swing.GroupLayout.PREFERRED_SIZE, 34, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addGap(10, 10, 10)
                            .addComponent(jLabel5, javax.swing.GroupLayout.PREFERRED_SIZE, 58, javax.swing.GroupLayout.PREFERRED_SIZE))
                        .addGroup(layout.createSequentialGroup()
                            .addComponent(jLabel3, javax.swing.GroupLayout.PREFERRED_SIZE, 34, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addGap(10, 10, 10)
                            .addComponent(jLabel6, javax.swing.GroupLayout.PREFERRED_SIZE, 58, javax.swing.GroupLayout.PREFERRED_SIZE)))))
            .addContainerGap())
    );
    layout.setVerticalGroup(
        layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
        .addGroup(layout.createSequentialGroup()
            .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addGroup(layout.createSequentialGroup()
                    .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                        .addComponent(jLabel1, javax.swing.GroupLayout.PREFERRED_SIZE, 30, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addGroup(layout.createSequentialGroup()
                            .addGap(8, 8, 8)
                            .addComponent(jLabel4, javax.swing.GroupLayout.PREFERRED_SIZE, 22, javax.swing.GroupLayout.PREFERRED_SIZE)))
                    .addGap(6, 6, 6)
                    .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                        .addComponent(jLabel2, javax.swing.GroupLayout.PREFERRED_SIZE, 30, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addComponent(jLabel5, javax.swing.GroupLayout.PREFERRED_SIZE, 30, javax.swing.GroupLayout.PREFERRED_SIZE))
                    .addGap(6, 6, 6)
                    .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                        .addComponent(jLabel3, javax.swing.GroupLayout.PREFERRED_SIZE, 30, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addComponent(jLabel6, javax.swing.GroupLayout.PREFERRED_SIZE, 30, javax.swing.GroupLayout.PREFERRED_SIZE))
                    .addGap(28, 28, 28)
                    .addComponent(jButton1, javax.swing.GroupLayout.PREFERRED_SIZE, 49, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addGroup(layout.createSequentialGroup()
                    .addGap(10, 10, 10)
                    .addComponent(jPanel1, javax.swing.GroupLayout.PREFERRED_SIZE, 533, javax.swing.GroupLayout.PREFERRED_SIZE)))
            .addContainerGap(23, Short.MAX_VALUE))
    );

    pack();
}// </editor-fold>                        

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         
    Graphics2D gp= (Graphics2D) jPanel1.getGraphics();
    
    Image img = createImage(jPanel1.getWidth(),jPanel1.getHeight());
    Graphics graphics = img.getGraphics();
    
    graphics.setColor(Color.CYAN);
    graphics.drawImage(snakeImage,mainController.snake.getPositionX(),mainController.snake.getPositionY(),this);
    mainController.snake.setPositionX(mainController.snake.getPositionX() + 10); 
    
    gp.drawImage(img, null, this);
    
    //gp.drawImage(snakeImage,mainController.snake.getPositionX(),mainController.snake.getPositionY(),this);
    //mainController.snake.setPositionX(mainController.snake.getPositionX() + 10); 
   

    
}                                        

public static void main(String args[]) {

    //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">
    /* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel.
     * For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html 
     */
    try {
        for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
            if ("Nimbus".equals(info.getName())) {
                javax.swing.UIManager.setLookAndFeel(info.getClassName());
                break;
            }
        }
    } catch (ClassNotFoundException ex) {
        java.util.logging.Logger.getLogger(MainView.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
    } catch (InstantiationException ex) {
        java.util.logging.Logger.getLogger(MainView.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
    } catch (IllegalAccessException ex) {
        java.util.logging.Logger.getLogger(MainView.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
    } catch (javax.swing.UnsupportedLookAndFeelException ex) {
        java.util.logging.Logger.getLogger(MainView.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
    }
    //</editor-fold>

    java.awt.EventQueue.invokeLater(new Runnable() {
        @Override
        public void run() {
            new MainView().setVisible(true);
        }
    });

}
// Variables declaration - do not modify                     
private javax.swing.JButton jButton1;
private javax.swing.JLabel jLabel1;
private javax.swing.JLabel jLabel2;
private javax.swing.JLabel jLabel3;
private javax.swing.JLabel jLabel4;
private javax.swing.JLabel jLabel5;
private javax.swing.JLabel jLabel6;
private javax.swing.JMenu jMenu1;
private javax.swing.JMenu jMenu2;
private javax.swing.JMenu jMenu3;
private javax.swing.JMenuBar jMenuBar1;
private javax.swing.JPanel jPanel1;
// End of variables declaration                   



public final void addKeyListener() {
    addKeyListener(this);
}

@Override
public void keyTyped(KeyEvent e) {
    System.out.println("Key Typed :" + e.getKeyCode());

}

@Override
public void keyPressed(KeyEvent e) {
    System.out.println("Key Pressed :" + e.getKeyCode());
}

@Override
public void keyReleased(KeyEvent e) {
    System.out.println("Key Released :" + e.getKeyCode());

}

}
[/code]