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

1 resposta
SirDominque

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 :

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.

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 :
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());

    }
}
/*
 * 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() {
    }
}
/*
 * 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");
    }
    
}

1 Resposta

SirDominque

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 :

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());

    }
}
Criado 3 de março de 2013
Ultima resposta 4 de mar. de 2013
Respostas 1
Participantes 1