paintComponent, neue Instanz überschreibt wohl alte Instanz

Status
Nicht offen für weitere Antworten.

spidermobile

Bekanntes Mitglied
Hallo zusammen,

leider ist mir kein besserer Titel eingefallen. Ich übe im Moment wieder ein wenig. Hab mir hierzu ein Beispiel von hier genommen und umgebaut. Mein Ziel ist, mehrere Karten zu bewegen. Die erste Karte funktioniert auch.

Code:
		imageLabel = new ImageLabel();
		cardDefault = new ImageIcon("cardDefault.png");
		imageLabel.setIcon(cardDefault, 10, 6, 60);

Nun bilde ich mir ein, eine neue Instanz zu bilden, um die 2. Karte zu bewegen.

Code:
		imageLabel2 = new ImageLabel();
		cardDefault = new ImageIcon("cardDefault.png");
		imageLabel2.setIcon(cardDefault, 9, 6, 80);

Aber nun bewegt sich nur noch die 2. Karte. Ich komme nicht drauf, was mein Denkfehler ist.

Code:
import java.awt.*;
import java.awt.event.*;

import javax.swing.*;

public class MoveImageIcon extends JFrame implements ActionListener {

	private ImageLabel imageLabel, imageLabel2;
	private ImageIcon cardDefault;
	private JButton nextButton;
	private JPanel mainPanel;
	
	
	public MoveImageIcon() {
		super();
		setSize(1000,800);
        setLocationRelativeTo(null);
        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
		
		Container contentPane = getContentPane();
		
		mainPanel = new JPanel();
		mainPanel.setLayout(new BorderLayout());
//		nextButton = new JButton("Karte");
//		nextButton.addActionListener(this);
//		getContentPane().add(nextButton, BorderLayout.NORTH);
		
		imageLabel = new ImageLabel();
		cardDefault = new ImageIcon("cardDefault.png");
		imageLabel.setIcon(cardDefault, 10, 6, 60);

		imageLabel2 = new ImageLabel();
		cardDefault = new ImageIcon("cardDefault.png");
		imageLabel2.setIcon(cardDefault, 9, 6, 80);
		
//		getContentPane().add(imageLabel, BorderLayout.CENTER);
		
		contentPane.add(mainPanel);
		mainPanel.add(imageLabel);
		mainPanel.add(imageLabel2);
		
	}
	
    public void actionPerformed(ActionEvent evt) {
		imageLabel.setIcon(cardDefault);
    }
	
	public static void main(String[] args) {

		MoveImageIcon moveImageIcon = new MoveImageIcon();
		moveImageIcon.setVisible(true);
	}

}


class ImageLabel extends JLabel implements Runnable {
	
    private ImageIcon icon;
//    private int x, y, w, h;
    private int xNew, yNew, wNew, hNew;
	private int xMove, yMove, xDest;
	
	public ImageLabel() {
		super();
		
		xNew = 473;
		yNew = 27;
		wNew = 71;
		hNew = 96;
		
		xMove = 0;
		yMove = 0;
		xDest = 0;
		
	}
	
    public void setIcon(ImageIcon icon, int xMove, int yMove, int xDest) {
		
		this.xMove = xMove;
		this.yMove = yMove;
		this.xDest = xDest;
		
//        x = xNew;
//        y = yNew;
//        w = wNew;
//        h = hNew;
        this.icon = icon;
        changeImage();
    }
	
	public void paintComponent(Graphics g) {
		super.paintComponents(g);
//		xNew = 200;
//		yNew = 200;
//		wNew = 71;
//		hNew = 96;
		
		
	      Image img = getToolkit().getImage("table.jpg");
	      MediaTracker mt = new MediaTracker(this);
	      mt.addImage(img, 0);
	        try {
	            mt.waitForAll();
	          } catch (InterruptedException e) {
	             //nothing
	           }   
			  g.drawImage(img,0,0,this); 

		
		g.drawImage(icon.getImage(),xNew, yNew, wNew, hNew, null);
	}
	
	
	private void changeImage() {
		Thread t = new Thread(this);
		t.start();
	}
	
	public void run() {
		do {
			xNew = xNew - xMove;
			yNew = yNew + yMove;
			repaint();
			try {
				Thread.sleep(10);
				} 
				catch (Exception ex) {
					
				}
		} while (xNew > xDest);
		repaint();
	}
	
}
 
mainPanel hat BorderLayout.
Mit:
Code:
       mainPanel.add(imageLabel);
        mainPanel.add(imageLabel2);
wird imageLabel ins Zentrum gesetzt und dann
wird imageLabel2 ins Zentrum gesetzt.
imageLabel ist somit wieder weg.

Du siehst also nur das zweite Bild !
 
Hallo André,

erkennst bestimmt das Beispiel. Vielen Dank dafür!

Aha, da wäre ich nie drauf gekommen.

Code:
		mainPanel.setLayout(null);

Ohne Layoutmanager kommt leider gar nicht mehr (ich brauche ka auch eigentlich keins, da ich ja alles zeichne). Was sollte ich denn für ein Layout verwenden?

Vielen Dank!!!
 
spidermobile hat gesagt.:
..Ohne Layoutmanager kommt leider gar nicht mehr ..
Du müsstest dann imageLabel2.setBounds(0,0,1000,800); setzten, mit demselben Resultat.
Das Problem ist, dass du nicht das Label bewegst sondern das Bild im Label.
So könntest du also die beiden Labels nur nebeneinander zeigen (und auf jedem bewegt sich was).
Etwa so:
Code:
       imageLabel = new ImageLabel();
        imageLabel.setBounds(0,0,500,800);
...
        imageLabel2 = new ImageLabel();
        imageLabel2.setBounds(500,0,500,800);
 
Sorry, aber verstanden hab ich das nicht.

Ich denke, dass es doch eine allgemeine Möglichkeit geben muss, auf einem Panel zu zeichnen. Das wird doch bei jedem Spiel benötigt.

Wie schon gesagt, bin eigentlich Anfänger. Hast Du vielleicht noch einen Tipp oder einen Link auf einen anderen Beitrag.

Danke!
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben