2013-04-19 2 views
0

Je veux redessiner arrière-plan avec autre image. Voici un exemple de SSCCE - J'aimerais ajouter une action à Listener qui sera repeinte avec une autre image.Java - redessiner fond

package painting; 

import javax.swing.SwingUtilities; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.BorderFactory; 
import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.Graphics; 
import java.awt.event.MouseEvent; 
import java.awt.event.MouseListener; 
import java.awt.event.MouseAdapter; 
import java.awt.event.MouseMotionListener; 
import java.awt.event.MouseMotionAdapter; 

public class SwingPaintDemo3 { 

public static void main(String[] args) { 
    SwingUtilities.invokeLater(new Runnable() { 
     public void run() { 
      createAndShowGUI(); 
     } 
    }); 
} 

private static void createAndShowGUI() { 
    System.out.println("Created GUI on EDT? "+ 
    SwingUtilities.isEventDispatchThread()); 
    JFrame f = new JFrame("Swing Paint Demo"); 
    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    f.add(new MyPanel()); 
    f.pack(); 
    f.setVisible(true); 
} 
} 

class MyPanel extends JPanel { 

private int squareX = 50; 
private int squareY = 50; 
private int squareW = 20; 
private int squareH = 20; 
Image img; 

public MyPanel() { 

    setBorder(BorderFactory.createLineBorder(Color.black)); 

    addMouseListener(new MouseAdapter() { 
     public void mousePressed(MouseEvent e) { 
      moveSquare(e.getX(),e.getY()); 
     } 
    }); 

    addMouseMotionListener(new MouseAdapter() { 
     public void mouseDragged(MouseEvent e) { 
      moveSquare(e.getX(),e.getY()); 
     } 
    }); 

} 

private void moveSquare(int x, int y) { 
    int OFFSET = 1; 
    if ((squareX!=x) || (squareY!=y)) { 
     repaint(squareX,squareY,squareW+OFFSET,squareH+OFFSET); 
     squareX=x; 
     squareY=y; 
     repaint(squareX,squareY,squareW+OFFSET,squareH+OFFSET); 
    } 
} 


public Dimension getPreferredSize() { 
    return new Dimension(250,200); 
} 

protected void paintComponent(Graphics g) { 
    super.paintComponent(g);  
try { 
    img = ImageIO.read(new File("graphics/close_0.jpg")); 
} catch (IOException e) { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
} 
    g.drawImage(img, 0, 0, null); 
    g.drawString("This is my custom Panel!",10,20); 
    g.setColor(Color.RED); 
    g.fillRect(squareX,squareY,squareW,squareH); 
    g.setColor(Color.BLACK); 
    g.drawRect(squareX,squareY,squareW,squareH); 
} 
} 

Alors, quelle méthode dois-je appeler pour redessiner l'arrière-plan avec une image différente?

+1

Pour une meilleure aide plus rapidement, postez-en un [SSCCE] (http://sscce.org/) (par opposition à 3 fichiers source distincts). –

+1

'Graphiques g = screen.getGraphics();' Ughh. Quel code regardiez-vous qui vous a donné cette idée? Jette-le. Voir [Exécution de la peinture personnalisée] (http://docs.oracle.com/javase/tutorial/uiswing/painting/) pour savoir comment le faire correctement. –

+0

Mise à jour avec SSCCE –

Répondre

1

Autant que je comprends la question (ce qui est « très peu ») cette source pourrait vous faire progresser. Notez que le code devrait jamais tenter une opération de blocage potentiellement (comme le chargement d'une image) dans la méthode paint ou paintComponent.

import javax.swing.*; 
import java.awt.*; 
import java.awt.image.BufferedImage; 
import java.awt.event.*; 
import java.util.Random; 

public class SwingPaintDemo3 { 

public static void main(String[] args) { 
    SwingUtilities.invokeLater(new Runnable() { 
     public void run() { 
      createAndShowGUI(); 
     } 
    }); 
} 

private static void createAndShowGUI() { 
    System.out.println("Created GUI on EDT? "+ 
    SwingUtilities.isEventDispatchThread()); 
    JFrame f = new JFrame("Swing Paint Demo"); 
    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    f.add(new MyPanel()); 
    f.pack(); 
    f.setVisible(true); 
} 
} 

class MyPanel extends JPanel { 

private int squareX = 50; 
private int squareY = 50; 
private int squareW = 20; 
private int squareH = 20; 
Image img; 
Random r = new Random(); 

public MyPanel() { 
    img = new BufferedImage(40,40,BufferedImage.TYPE_INT_RGB); 

    setBorder(BorderFactory.createLineBorder(Color.black)); 

    addMouseListener(new MouseAdapter() { 
     public void mousePressed(MouseEvent e) { 
      img = new BufferedImage(
       r.nextInt(getWidth())+1, 
       r.nextInt(getHeight())+1, 
       BufferedImage.TYPE_INT_RGB); 
      moveSquare(e.getX(),e.getY()); 
     } 
    }); 
} 

private void moveSquare(int x, int y) { 
    int OFFSET = 1; 
    if ((squareX!=x) || (squareY!=y)) { 
     squareX=x; 
     squareY=y; 
     repaint(); 
    } 
} 


public Dimension getPreferredSize() { 
    return new Dimension(250,200); 
} 

protected void paintComponent(Graphics g) { 
    super.paintComponent(g); 

    g.drawImage(img, 0, 0, null); 
    g.drawString("This is my custom Panel!",10,20); 
    g.setColor(Color.RED); 
    g.fillRect(squareX,squareY,squareW,squareH); 
    g.setColor(Color.BLACK); 
    g.drawRect(squareX,squareY,squareW,squareH); 
} 
} 
+0

Je vais essayer d'expliquer. Dans la méthode paintComponent (Graphics g), il y a une ligne: g.drawImage (img, 0, 0, null); qui dessine l'image comme arrière-plan. Dans mon exemple, l'image est le fichier close_0.jpg. Je voudrais dessiner un nouveau fond avec une image différente - disons xyz.jpg après avoir appuyé sur la souris. –

+0

Ummm oui. C'est exactement ce que fait la source altérée. –

+0

Merci pour votre aide et votre temps –