"Kopie" von JLabels werden nicht gezeichnet

Status
Nicht offen für weitere Antworten.

manuche

Bekanntes Mitglied
Hallo!
Ich versuche grade eine Kopie eines JLabels zu erzeugen. Die Kopie ist im Prinzip eine neue Instanz einer meiner JLabelKlasse die exakt die gleichen Parameter wie das zu kopierende JLabel hat. Mein Problem dabei ist, dass ich die Kopie auf meinem Mainframe nicht gezeichnet wird. Ich vermute das ich es am falschen Zeitpunkt adde nur weiss ich nicht wie ich es besser lösen könnte... Ich hoffe ihr versteht mich und könnt mir weiterhelfen! ;)

Hier die entsprechende Klasse mit MouseEvents:
Code:
public class GUI extends JFrame implements Runnable{
	private static final long serialVersionUID = 6411499808530678723L;
	
	...
	private static Ship s1copy;
	private static Ship s2copy;
	private static Ship s3copy;
	private static Ship s4copy;
	private static Ship s5copy;
	...
	
	public GUI (int pWidth, int pHeight){
	                ...
		contentPanel.setLayout(null);
		contentPanel.add (rivalPanel);
		contentPanel.add (selfPanel);
		contentPanel.add (additionPanel);
		contentPanel.add (status);
		contentPanel.add (finishRound);
		contentPanel.add (capitulateGame);
		contentPanel.add (createGame);
		contentPanel.add (cancelGame);
		contentPanel.add (joinGame);
		contentPanel.add (exit);
		this.setVisible (true);
		doInit();
	}
	
	...

	public void paintComponents (Graphics g){
		super.paintComponents(g);
		selfPanel.refresh();
		additionPanel.refresh();
	}
	
	public void run(){
		while (runGame){
		    computeDelta();
		    if (System.nanoTime() >= (refreshfps + 500000000)){
		            status.setText(" FPS: " + fps + "\n IP: none\n Ping: none");
		            refreshfps = System.nanoTime();
		    }
		    this.repaint();
		    try{
		        Thread.sleep (10);
		    }catch (InterruptedException e){}
		}
	}
	
	....
	
	private void guiPanelMouseDragged (MouseEvent evt){
		if (hitLabel != null){
		        Point p = evt.getPoint();
        	                        p.x = evt.getX();
                                        p.y = evt.getY();
                                        hitLabel.setLocation (p);
                                        this.setComponentZOrder (hitLabel, 0);
                                        hitLabel.repaint();
                                }
	}
	
	private void guiMousePressed (MouseEvent evt){
		Component c = contentPanel.getComponentAt (evt.getPoint());
                                if (c instanceof AdditionPanel){
        	                    Point p = evt.getPoint();
        	                    System.out.println(p);
        	                    p.x = evt.getX() - c.getX();
        	                    p.y = evt.getY() - c.getY() - 30;
        	                    System.out.println ("Pressed: " + p);
    		    c = additionPanel.getComponentAt (p);
    		    try{
    			hitLabel = (JLabel) c;
    			String name = c.getName();
    			if (name.equals("s1")){
    				if (s1copy == null){
    					s1copy = new Ship (2, "s1copy");
    					this.add (s1copy);
    					hitLabel = s1copy;
    				}else{
    					hitLabel = null;
    				}
    			}else if (name.equals("s2")){
    				if (s2copy == null){
    					s2copy = new Ship (3, "s2copy");
    					this.add (s2copy);    			
    					hitLabel = s2copy;
    				}else{
    					hitLabel = null;
    				}
    			}else if (name.equals("s3")){
    				if (s3copy == null){
    					s3copy = new Ship (3, "s3copy");
    					this.add(s3copy);
    					hitLabel = s3copy;
    				}else{
    					hitLabel = null;
    				}
    			}else if (name.equals("s4")){
    				if (s4copy == null){
    				    s4copy = new Ship (4, "s4copy");
    				    this.add (s4copy);
    				    hitLabel = s4copy;
    				}else{
    				    hitLabel = null;
    				}
    			}else if (name.equals("s5")){
    				if (s5copy == null){
    				    s5copy = new Ship (5, "s5copy");
    				    this.add (s5copy);
    				    hitLabel = s5copy;
    				}else{
    				    hitLabel = null;
    				}
    			}
    			if (hitLabel != null){
        			    System.out.println (hitLabel);
        		                    deltaX = evt.getX(); 
                                                    deltaY = evt.getY();
                                                    System.out.println ("Delta: " + evt.getPoint());
                                                    backupX = this.getX();
                                                    backupY = this.getY();
        		                }
    	                        }catch (ClassCastException e){
    			System.out.println ("Keine Label an der entsprechenden Position");
    		        }
                             }
	}
	
	private void guiMouseReleased (MouseEvent evt){
		if( hitLabel != null ){
        	                    if (this.getComponentAt (evt.getPoint()) instanceof GamePanel){
        		        System.out.println ("On GamePanel");
                                        hitLabel.setLocation(backupX, backupY);
                                        hitLabel.repaint();
                                    }else{
                                       backupX = hitLabel.getX();
                                       backupY = hitLabel.getY();
                                    }
                                    this.repaint(); 
                                    hitLabel = null;
                                }
	}
	
	...

	public static void main (String[] args){
		new GUI (650, 660);
	}
}
 

manuche

Bekanntes Mitglied
bei den "..." habs nicht extra aufgeführt aus platzgründen! die listener funzen nur das label wird nicht gezeichnet! -.-
 

SebiB90

Top Contributor
hm... man darf/kann keine repaint methode glaube ich in listener aufrufen.
müsste ähnliches problem wie im progressbar thread im awt/swing forum sein.

versuch mal repaint durch das zu ersetzen(ich glaub das ging so ähnlich i-wie^^):
Code:
SwingUtilities.invokeLater(new Runnable() {
     public void run() {
         GUI.this.repaint();
     }
 });

könnt aber auch falsch sein...
 

manuche

Bekanntes Mitglied
also das mit nem rapaint im callback sollte schon funzen da ich es woanders auch schon benutzt hab...
dein code funktioniert schonmal nicht... hab ich grad getestet!
naja mein problem ist halt das ich eine Klasse GUI die abgeleitet von JFrame ist hab. Darauf werden 3 Instanzen die von JPanel abgeleitet sind gezeichnet... Auf eine der Instanzen werden Instanzen einer Klasse die von JLabel abgeleitet ist gezeichnet... Soweit kein Problem! Jetzt wollte ich die Labels auf meiner gesamten GUI verschieben können, was zunächst auch kein Problem war...
Dann kam die Anforderung, dass ich nicht das Label selbst verschieben will, sondern nur eine Kopie davon... Das Label so wird angezeigt und auch gezeichnet nur die Kopie halt nicht!
Aber ich weiss auch nicht so recht, wie ich's richtig implemenieren soll... :(
 
S

SlaterB

Gast
funktioniert es, ein neu erstelltes Ship anzuzeigen?
funktioniert es, ein simples neues JLabel("test") anzuzeigen?

wenn du beide Fragen ebenso mit 'nein' beantworten musst,
dann ist dein Ship + Kopie bei der Fehlersuche recht sinnlos, von unnötig komplizieren Listenern ganz abgesehen, schreibe

Code:
private void guiMousePressed (MouseEvent evt){ 
  this.add (new JLabel("test")); 
}
statt deiner hunderten undurchschaubebaren Zeilen..

--------

welches Layout hast 'this'? null wie am Anfang?
haben die Komponenten dann überhaupt bounds, kennst du dich mit null-Layout aus?

wenn die gesamte Fläche schon mit JPanels gefüllt ist, wie sollen dann da noch Ships/ JLabels reinpassen?
funktioniert die Anzeige bisher in deinem JFrame?
wo werden die Schiffe eingefügt?

bei anderen Layouts als null:
nach dem Einfgen neuer Komponenten evtl. this.validate() aufrufen
 

manuche

Bekanntes Mitglied
Also die Instanzen der Klasse Ship kann ich ohne Problem erzeugen und die werden auch angezeigt... Ich kann sie sogar in meiner gui umherschieben! Die "Kopien" sind auch da, soviel steht fest da ich mir die entsprechenden Sachen hab in die Konsole schreiben lassen... Das einzige Problem ist halt das sie nicht sichtbar sind!
Gui hat nachwievor das null-Layout und nein ich kenn mich nicht wirklich damit aus xD
Dachte aber wozu brauch ich nen Layoutmanager, wenn eh alles übereinander liegt aber vllt liegt ja genau der der Knackpunkt...
Die Schiffe bzw JLabels an sich werden beim Aufruf des Konstruktors einer der JPanel-Klassen erzeugt und auf diese Panel gezeichnet (ohne die Kopien konnte ich die Labels trotzdem auf der Oberfläche nach belieben verschieben)...
Wo die Kopien hinzugefügt werden weiss ich noch nicht recht, sinnvoll wäre, wenn sie auf das mainframe gezeichnet werden (gui) um sie später bei der platzierung besser behandeln zu können!
 

SebiB90

Top Contributor
ich glaub weiter helfen können wir dir nur.
wenn wir so viel code haben, das wir es bei uns laufen lassen können...
 

manuche

Bekanntes Mitglied
So ist nen bisschen Code aber bitte :wink: :
Code:
import java.awt.Color;
import java.awt.Component;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Point;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionAdapter;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JTextArea;
import javax.swing.SwingUtilities;
import javax.swing.border.LineBorder;

import ships.Ship;


public class GUI extends JFrame implements Runnable{
	private static final long serialVersionUID = 6411499808530678723L;
	
	private static AdditionPanel additionPanel;
	private static GamePanel selfPanel;
	private static GamePanel rivalPanel;
	private static Ship s1copy;
	private static Ship s2copy;
	private static Ship s3copy;
	private static Ship s4copy;
	private static Ship s5copy;
	private static boolean runGame = true;
	private static int posX = 0;
	private static int deltaX = 0;
	private static int backupX = 0;
	private static int posY = 0;
	private static int deltaY = 0;
	private static int backupY = 0;
	
	public static long delta = 0;
	public static long last = 0;
	public static long fps = 0;
	public static long refreshfps = 0;
	
	private Container contentPanel = this.getContentPane();
	private JTextArea status = new JTextArea();
	private JButton finishRound = new JButton ("Zug beenden");
	private JButton capitulateGame = new JButton ("Aufgeben");
	private JButton createGame = new JButton ("Spiel erstellen");
	private JButton joinGame = new JButton ("Spiel beitreten");
	private JButton cancelGame = new JButton ("Verbindung trennen");
	private JButton exit = new JButton ("Beenden");
	private JLabel hitLabel;
	
	public GUI (int pWidth, int pHeight){
		super ("Schiffeversenken");
		this.setBounds (10, 10, pWidth - 280, pHeight - 55);
		this.setMaximumSize (new Dimension (pWidth - 280, pHeight - 55));
		this.setBackground (Color.BLUE);
		this.setResizable (false);
		this.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);
		this.addWindowListener (new WindowAdapter() {
			public void windowClosing (WindowEvent evt) {
				int answer = JOptionPane.showConfirmDialog (null, "Wollen Sie wirklich beenden?", "Beenden?", JOptionPane.YES_NO_OPTION);
				if (answer == JOptionPane.YES_OPTION){
					System.exit (1);
				}
		    }
		});
		this.setSize(new Dimension (pWidth, pHeight));
		this.setLocation(250, 250);
		this.addMouseMotionListener(new MouseMotionAdapter(){
	           public void mouseDragged(MouseEvent evt){ 
	        	   guiPanelMouseDragged (evt);
	           } 
	       }); 
		this.addMouseListener(new MouseAdapter(){
			public void mousePressed (MouseEvent evt){
				guiMousePressed (evt);
			}            
			public void mouseReleased (MouseEvent evt) { 
            	guiMouseReleased (evt);
            }
            public void mouseClicked (MouseEvent evt){
            	guiMouseClicked (evt);
            }
		});
		additionPanel = new AdditionPanel (320, 10);
		rivalPanel = new GamePanel (10, 10);
		selfPanel = new GamePanel (10, 320);
		status.setBounds(320, 550, 315, 70);
		status.setBorder (new LineBorder (Color.BLACK, 2, true));
		status.setBackground (Color.LIGHT_GRAY);
		status.setEditable (false);
		status.setFocusable (false);
		status.setToolTipText ("Infos zum Spiel");
		finishRound.setBounds (320, 420, 150, 25);
		finishRound.setToolTipText ("Beendet den aktuellen Zug");
		finishRound.addActionListener(new ActionListener(){
			public void actionPerformed (ActionEvent evt){
				cmdFinishR (evt);
			}
		});
		capitulateGame.setBounds (320, 510, 150, 25);
		capitulateGame.setToolTipText ("Sie geben auf");
		capitulateGame.addActionListener(new ActionListener(){
			public void actionPerformed (ActionEvent evt){
				cmdCapitulateG (evt);
			}
		});
		createGame.setBounds (this.getWidth() - 165, 420, 150, 25);
		createGame.setToolTipText ("Erstellen Sie eine Partie");
		createGame.addActionListener(new ActionListener(){
			public void actionPerformed (ActionEvent evt){
				cmdCreateG (evt);
			}
		});
		joinGame.setBounds (this.getWidth() - 165, 450, 150, 25);
		joinGame.setToolTipText ("Treten Sie einer Partie bei");
		joinGame.addActionListener(new ActionListener(){
			public void actionPerformed (ActionEvent evt){
				cmdJoinG (evt);
			}
		});
		cancelGame.setBounds(this.getWidth() - 165, 480, 150, 25);
		cancelGame.setToolTipText ("Verlassen Sie die aktuelle Partie");
		cancelGame.addActionListener(new ActionListener(){
			public void actionPerformed (ActionEvent evt){
				cmdCancelG (evt);
			}
		});
		exit.setBounds (this.getWidth() - 165, 510, 150, 25);
		exit.setToolTipText ("Spiel verlassen");
		exit.addActionListener(new ActionListener(){
			public void actionPerformed (ActionEvent evt){
				cmdExit (evt);
			}
		});
		contentPanel.setLayout(null);
		contentPanel.add (rivalPanel);
		contentPanel.add (selfPanel);
		contentPanel.add (additionPanel);
		contentPanel.add (status);
		contentPanel.add (finishRound);
		contentPanel.add (capitulateGame);
		contentPanel.add (createGame);
		contentPanel.add (cancelGame);
		contentPanel.add (joinGame);
		contentPanel.add (exit);
		this.setVisible (true);
		doInit();
	}
	
	private void doInit(){
		Thread gameRoutine = new Thread(this);
		gameRoutine.setPriority (Thread.MAX_PRIORITY);
		gameRoutine.start();
		last = System.nanoTime();
		refreshfps = last;
	}

	public void paintComponents (Graphics g){
		super.paintComponents(g);
		selfPanel.refresh();
		additionPanel.refresh();
	}
	
	public void run(){
		while (runGame){
			computeDelta();
			if (System.nanoTime() >= (refreshfps + 500000000)){
				status.setText(" FPS: " + fps + "\n IP: none\n Ping: none");
				refreshfps = System.nanoTime();
			}
			this.repaint();
			runGame = checkGame();
			try{
				Thread.sleep (10);
			}catch (InterruptedException e){}
		}
	}
	
	private void computeDelta(){
		delta = System.nanoTime() - last;
		last = System.nanoTime();
		fps = ((long) 1e9) / delta;
	}
	
	private boolean checkGame(){
		if (AdditionPanel.s1.isDestroyed() && AdditionPanel.s2.isDestroyed() && AdditionPanel.s3.isDestroyed() &&AdditionPanel.s4.isDestroyed() && AdditionPanel.s5.isDestroyed()){
			return false;
		}
		return true;
	}
	
	private void cmdFinishR (ActionEvent evt){
		//
	}
	
	private void cmdCapitulateG (ActionEvent evt){
		//
	}
	
	private void cmdCreateG (ActionEvent evt){
		//
	}

	private void cmdJoinG (ActionEvent evt){
		//
	}
	
	private void cmdCancelG (ActionEvent evt){
		//
	}
	
	private void cmdExit (ActionEvent evt){
		int answer = JOptionPane.showConfirmDialog (null, "Wollen Sie wirklich beenden?", "Beenden?", JOptionPane.YES_NO_OPTION);
		if (answer == JOptionPane.YES_OPTION){
			System.exit (1);
		}
	}
	
	private void guiPanelMouseDragged (MouseEvent evt){
		if (hitLabel != null){
			Point p = evt.getPoint();
        	p.x = evt.getX();
        	p.y = evt.getY();
            hitLabel.setLocation (p);
            this.setComponentZOrder (hitLabel, 0);
            hitLabel.repaint();
        }else{
        	//redispatchMouseEvent(evt);
        }
	}
	
	private void guiMousePressed (MouseEvent evt){
		Component c = contentPanel.getComponentAt (evt.getPoint());
        if (c instanceof AdditionPanel){
        	Point p = evt.getPoint();
        	System.out.println(p);
        	p.x = evt.getX() - c.getX();
        	p.y = evt.getY() - c.getY() - 30;
        	System.out.println ("Pressed: " + p);
    		c = additionPanel.getComponentAt (p);
    		try{
    			hitLabel = (JLabel) c;
    			String name = c.getName();
    			if (name.equals("s1copy")){
    				if (s1copy == null){
    					s1copy = new Ship (2, "s1copy");
    					this.add (s1copy);
    					hitLabel = s1copy;
    				}else{
    					hitLabel = null;
    				}
    			}else if (name.equals("s2")){
    				if (s2copy == null){
    					s2copy = new Ship (3, "s2copy");
    					this.add (s2copy);    			
    					hitLabel = s2copy;
    				}else{
    					hitLabel = null;
    				}
    			}else if (name.equals("s3")){
    				if (s3copy == null){
    					s3copy = new Ship (3, "s3copy");
    					this.add(s3copy);
    					hitLabel = s3copy;
    				}else{
    					hitLabel = null;
    				}
    			}else if (name.equals("s4")){
    				if (s4copy == null){
    					s4copy = new Ship (4, "s4copy");
    					this.add (s4copy);
    					hitLabel = s4copy;
    				}else{
    					hitLabel = null;
    				}
    			}else if (name.equals("s5")){
    				if (s5copy == null){
    					s5copy = new Ship (5, "s5copy");
    					this.add (s5copy);
    					hitLabel = s5copy;
    				}else{
    					hitLabel = null;
    				}
    			}
    			if (hitLabel != null){
        			System.out.println (hitLabel);
        			deltaX = evt.getX(); 
                    deltaY = evt.getY();
                    System.out.println ("Delta: " + evt.getPoint());
                    backupX = this.getX();
                    backupY = this.getY();
        		}
    		}catch (ClassCastException e){
    			System.out.println ("Keine Label an der entsprechenden Position");
    		}
        }
	}
	
	private void guiMouseReleased (MouseEvent evt){
		if( hitLabel != null ){
        	if (this.getComponentAt (evt.getPoint()) instanceof GamePanel){
        		System.out.println ("On GamePanel");
            	hitLabel.setLocation(backupX, backupY);
            	hitLabel.repaint();
            }else{
            	backupX = hitLabel.getX();
            	backupY = hitLabel.getY();
            }
            this.repaint();
            hitLabel = null;
        }else{
        	// redispatchMouseEvent(evt);
        }
	}
	
	private void guiMouseClicked (MouseEvent evt) {
		//System.out.println (evt.getPoint());
	}

	public static void main (String[] args){
		new GUI (650, 660);
	}
}
Code:
import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridLayout;

import javax.swing.JPanel;
import javax.swing.border.LineBorder;

import ships.Ship;


public class AdditionPanel extends JPanel {
	private static final long serialVersionUID = -4483849173455158918L;
	
	public static Ship s1;
	public static Ship s1copy;
	public static Ship s2;
	public static Ship s3;
	public static Ship s4;
	public static Ship s5;
	
	public AdditionPanel(int x, int y){
		this.setBounds (x, y, 315, 400);
		this.setMaximumSize (new Dimension (315, 400));
		this.setBorder(new LineBorder (Color.BLACK, 2, true));
		this.setBackground (Color.GREEN);
		doInit();
		this.setVisible (true);
	}
	
	private void doInit(){
		this.setLayout (new GridLayout(10, 1, 40, 0));
		s1 = new Ship (2, "s1");
		s1copy = new Ship (2, "s1copy");
		s2 = new Ship (3, "s2");
		s3 = new Ship (3, "s3");
		s4 = new Ship (4, "s4");
		s5 = new Ship (5, "s5");
		System.out.println (s1);
		System.out.println (s2);
		System.out.println (s3);
		System.out.println (s4);
		System.out.println (s5);
		this.add (s1);
		this.add (s1copy);
		this.add (s2);
		this.add (s3);
		this.add (s4);
		this.add (s5);
		this.repaint();
	}
	
	public void refresh(){
		this.repaint();
	}
	
}
Code:
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.net.URL;

import javax.imageio.ImageIO;
import javax.swing.JPanel;
import javax.swing.border.LineBorder;


public class GamePanel extends JPanel {
	private static final long serialVersionUID = -193320786965084318L;
	
    private static final char[] COORDX = {65, 66, 67, 68, 69, 70, 71, 72, 73, 74};
    private static final char[] COORDY = {49, 50, 51, 52, 53, 54, 55, 56, 57, 49, 48};
	
	public GamePanel (int x, int y){
		this.setBounds (x, y, 300, 300);
		this.setMaximumSize (new Dimension (300 , 300));
		this.setBorder (new LineBorder (Color.BLACK, 2, true));
		this.setBackground (Color.BLUE);
		this.setVisible (true);
	}
	
	public void paintComponent (Graphics g){
		super.paintComponent (g);
		g.setColor (Color.WHITE);
		for (int i = 1; i <= 10; i++){
			g.drawLine (this.getWidth() / 10 * i, 2, this.getWidth() / 10 * i, this.getHeight() - 2);
			g.drawChars(COORDX, i - 1, 1, (this.getWidth() / 10) * i - 15, 14);
		}
		for (int i = 1; i <= 10; i++){
			g.drawLine (2, this.getHeight() / 10 * i, this.getWidth() - 2, this.getHeight() / 10 * i);
			if (i < 10){
				g.drawChars(COORDY, i - 1, 1, 5, this.getHeight() / 10 * i - 5);
			}else{
				g.drawChars(COORDY, i - 1, 2, 5, this.getHeight() / 10 * i - 5);
			}
		}
	}
	
	public void refresh(){
		this.repaint();
	}
	
	private BufferedImage[] loadPics (String path, int pics){
		
		BufferedImage[] anim = new BufferedImage[pics];
		BufferedImage source = null;
		
		URL pic_url = getClass().getClassLoader().getResource (path);

		try {
			source = ImageIO.read(pic_url);
		} catch (IOException e) {}
		
		for(int x=0;x<pics;x++){
			anim[x] = source.getSubimage (x * source.getWidth() / pics, 0, source.getWidth() / pics, source.getHeight());
		}
		return anim;
	}	
}
Code:
package ships;

import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.swing.JLabel;


public class Ship extends JLabel{
	private static final long serialVersionUID = 1654429558096042889L;
	
	private boolean damaged[];
	private int size;
	private String name;
		
	private static BufferedImage  bow;
	private static BufferedImage  deck;
	private static BufferedImage  aft;
	private static BufferedImage  bow_damaged;
	private static BufferedImage  deck_damaged;
	private static BufferedImage aft_damaged;
	
	public Ship(int pSize, String pName){
		this.name = pName;
		this.size = pSize;
		damaged = new boolean[size];
		for (int x = 0; x < size; x++){
			damaged[x] = false;
		}
		doInit();
	}
	
	private void doInit(){
		Dimension panelDimension = new Dimension (30 * size, 30);
		this.setPreferredSize (panelDimension);
		this.setMinimumSize (panelDimension);
		this.setMaximumSize (panelDimension);
		this.setName (name);
		try{
			bow = ImageIO.read (new File ("D:\\Eigene Dateien\\Programme\\Schiffeversenken\\bin\\images\\ship\\bow.gif"));
			deck = ImageIO.read (new File ("D:\\Eigene Dateien\\Programme\\Schiffeversenken\\bin\\images\\ship\\deck.gif"));
			aft = ImageIO.read (new File ("D:\\Eigene Dateien\\Programme\\Schiffeversenken\\bin\\images\\ship\\aft.gif"));
			bow_damaged = ImageIO.read (new File ("D:\\Eigene Dateien\\Programme\\Schiffeversenken\\bin\\images\\ship\\bow_damaged.gif"));
			deck_damaged = ImageIO.read (new File ("D:\\Eigene Dateien\\Programme\\Schiffeversenken\\bin\\images\\ship\\deck_damaged.gif"));
			aft_damaged = ImageIO.read (new File ("D:\\Eigene Dateien\\Programme\\Schiffeversenken\\bin\\images\\ship\\aft_damaged.gif"));
		}catch (IOException e){
			System.out.println ("Fehler beim Laden der Bilder!");
		}
	}
	
	public boolean isDamagedAt (int pIndex){
		return damaged[pIndex]; 
	}
	
	public void setDamagedAt (int pIndex){
		damaged[pIndex] = true;
	}
	
	public boolean isDestroyed(){
		int damage = 0;
		for (int x = 0; x < damaged.length; x++){
			if (damaged[x] = true){
				damage++;
			}
		}
		if (damage + 1 == damaged.length){
			return true;
		}
		return false;
	}
	
	public void paintComponent (Graphics g){
		super.paintComponent (g);
		if (!isDamagedAt (0)){
			g.drawImage (bow, 0 , 0, this);
		}else{
			g.drawImage (bow_damaged, 0 , 0, this);
		}
		if (size > 2){
			for (int x = 0; x <= size - 3; x++){
				if (!isDamagedAt (x + 1)){
					g.drawImage (deck, 30 * (x + 1) , 0, this);
				}else{
					g.drawImage (deck_damaged, 30 * (x + 1) , 0, this);
				}
			}
		}
		if (!isDamagedAt (size - 1)){
			g.drawImage (aft, (30 * size) - 30, 0, this);
		}else{
			g.drawImage (aft_damaged, (30 * size) - 30, 0, this);
		}
	}
}
Nicht wundern, ist noch nen bisschen unsauber programmiert... Aber is halt ne Buastelle, ne! :bae:
 

SebiB90

Top Contributor
Problem gelöst^^
das label wird gezeichnet, nur naja etwas das 0 mal 0 Pixel groß ist. joar das kann net gezeichnet werden oder?^^
setMinimum/Preferred/MaximumSize() sind Methoden, die Layout Manager benutzen. Du aber hast ein null-Layout. Also kein Layout Manager der was damit macht ;) Du musst setSize() benutzen. Dann klappts ;).

Aber wieso funktioniert das aber bei den anderen(nicht kopien)?
Die anderen werden einem LayoutManager zuerst hinzugefügt(GridLayout auf dem Panel) und er benutzt dann setSize(). ;)

Nachtrag:
Das flackert ja aber ganz schön. Ich würd dir empfehlen DoubleBuffering zu benutzen.
Hier mal eine mögliche Implementierung(in die Klasse GUI):
Code:
  private BufferedImage offscreen;
   private Graphics offgraphic;
   public void paint(Graphics g) {
	   if(offscreen == null) {
		   offscreen = new BufferedImage(getWidth(), getHeight(), BufferedImage.TYPE_INT_ARGB);
		   offgraphic = offscreen.getGraphics();
	   }
	   super.paint(offgraphic);
	   g.drawImage(offscreen, 0, 0, this);
   }
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
C Best Practice Tiefe Kopie eines Arrays unbekannter Dimension und unbekannten Typs Allgemeine Java-Themen 4
C Methode für tiefe Kopie eines unbekannt (dimensionierten & typisierten) Feldes realisierbar? Allgemeine Java-Themen 7
M Neue Instanz/Kopie einer unbekannten Klasse Allgemeine Java-Themen 7
reibi Kopie einer Liste Allgemeine Java-Themen 4
E tiefe Kopie nicht serialisierbarer Objekte Allgemeine Java-Themen 3
J Collections in Instanzattributen als Kopie übergeben Allgemeine Java-Themen 4
N for (String s : StringArray) : Kopie oder Verweis? Allgemeine Java-Themen 9
G Kopie eines FileReader Allgemeine Java-Themen 4
S Tiefe Kopie einer Baumstruktur als statische Methode Allgemeine Java-Themen 8
Z Echte Kopie eines Objektes erstellen Allgemeine Java-Themen 12
D Klassen JLabels in anderen Klassen verwenden. Allgemeine Java-Themen 7
S ArrayList<JLabels> "malen" Allgemeine Java-Themen 4
M JLabels löschen (sollen nicht mehr gezeichnet werden) Allgemeine Java-Themen 10
P Fehler: Hauptklasse Main konnte nicht gefunden oder geladen werden Ursache: java.lang.ClassNotFoundException: Main Allgemeine Java-Themen 24
berserkerdq2 Weiß jemand wie ich im Scenebuilder das Fenster so darstellen kann, dass beim Vollbildmodus die Objekte so angezeigt werden? Allgemeine Java-Themen 1
D Erste Schritte Mp3 Datei kann nicht von der Festplatte geöffnet werden - mit ChatGPT erstellt Allgemeine Java-Themen 7
I OpenPDF erzeugt riesige PDFs, wenn Grafiken über PdfGraphics2D#drawImage gezeichnet werden Allgemeine Java-Themen 1
kodela String kann nicht zu Pfad konvertiert werden Allgemeine Java-Themen 16
Momo16 Brauche Hilfe - Java Projekt kann nicht erstellt werden Allgemeine Java-Themen 12
M Input/Output FileChannel writes / werden diese gecached vom OS und dann erst geschrieben? Allgemeine Java-Themen 6
Tiago1234 Hauptklasse konnte nicht gefunden oder geladen werden Allgemeine Java-Themen 38
W Bilder werden in App mit Jar-Datei nicht angezeigt Allgemeine Java-Themen 15
Z macOS java konnte nicht entfernt werden xpc verbindungsfehler Allgemeine Java-Themen 4
AleXusher Hauptklasse startlösung konnte nicht gefunden oder geladen werden Allgemeine Java-Themen 1
ReinerCoder auskommentierte Messages werden trotzdem benutzt Allgemeine Java-Themen 53
MiMa Wie sollte am besten ein Datum gespeichert werden? Allgemeine Java-Themen 8
J Hilfe, Jar Datei kann nicht ausgeführt werden Allgemeine Java-Themen 2
Elyt Compiler-Fehler Datei kann nicht erstellt werden. Die Syntax für den Dateinamen etc. ist falsch. Allgemeine Java-Themen 2
W Dateien werden nicht gelöscht - warum? Allgemeine Java-Themen 12
A Eclipse Hauptklasse konnte nicht gefunden oder geladen werden Allgemeine Java-Themen 7
Drachenbauer Wie kann eine vorgegebene Farbe über einen String erkannt werden? Allgemeine Java-Themen 11
I Modelio kann nicht geöffnet werden Allgemeine Java-Themen 3
J Message Box soll bei bestimmter Zeit angezeigt werden Allgemeine Java-Themen 19
ReinerCoder Klasse kann nicht public deklariert werden Allgemeine Java-Themen 2
MiMa Datei kann nicht umbenannt oder verschoben werden ?? Allgemeine Java-Themen 17
M JDBC DATE 0000-00-00 kann nicht ausgegeben werden Allgemeine Java-Themen 3
The Pi NetBeans Bilder in Jar Datei werden nicht angezeigt Allgemeine Java-Themen 7
J Bei einer Zufallsausgabe werden zu viel Ergebnisse ausgegeben Allgemeine Java-Themen 16
Asphorm Datentypen Datentypen werden nicht ordnungsgemäß umgewandelt Allgemeine Java-Themen 1
C Eclipse einstellen, dass eine bestimmte JDK benutzt werden soll Allgemeine Java-Themen 3
P Datentypen Bilder werden in ausführbarer JAR nicht angezeigt Allgemeine Java-Themen 6
I nach Image Load in ListView, kann Ordner nicht mehr gelöscht werden Allgemeine Java-Themen 1
B Bild aus Jar kann nach Export nicht mehr gefunden werden Allgemeine Java-Themen 13
B AES kann nicht entschlüsselt werden Allgemeine Java-Themen 5
J .exe Dateien werden nicht gestartet obwohl Pfad richtig Allgemeine Java-Themen 6
N Anwendungsfehler(kann nicht gestartet werden...) Allgemeine Java-Themen 30
E Hauptklasse konnte nicht gefunden werden Allgemeine Java-Themen 13
J beans.instantiate(): Klasse kann nicht instanziiert werden Allgemeine Java-Themen 2
G Methoden Aus einem Event, wo ich weiß, dass es ausgeführt werden wird, eine Get-Methode basteln Allgemeine Java-Themen 8
D Java Permutationen werden zu lange berechnet Allgemeine Java-Themen 3
D Java Error String kann nicht in Int umgewandelt werden Allgemeine Java-Themen 2
ms_cikar Java Excel bearbeiten spalten werden überschrieben. Allgemeine Java-Themen 4
M Ein Programm das nur von einem bestimmten Programm geöffnet werden kann Allgemeine Java-Themen 7
T Umlaute werden falsch gedruckt Allgemeine Java-Themen 2
M Windows 98 - Mit welchem JDK (Version) kann noch Programm dafür erstellt werden Allgemeine Java-Themen 6
B Eclipse Nach Export einer .jar Fehler: Hauptklasse konnte nicht gefunden oder geladen werden Allgemeine Java-Themen 5
M Eclipse - Fehler: Hauptklasse de.xyz.init.MeineKlasse konnte nicht gefunden oder geladen werden Allgemeine Java-Themen 2
M Methoden werden in falscher Reihenfolge bearbeitet Allgemeine Java-Themen 10
L Nullpointer Exceptions werden nicht angezeigt Allgemeine Java-Themen 5
Thallius Serialisiertes File kann auf anderem Rechner nicht geladen werden Allgemeine Java-Themen 12
S Threads Threads werden nicht beendet Allgemeine Java-Themen 2
D Input/Output Zeilen werden "ignoriert" beim Einlesen aus einer Textdatei Allgemeine Java-Themen 3
B Input/Output version.cfg konnte nicht im Klassenpfad gefunden werden, ist aber dort. Allgemeine Java-Themen 0
O Klassen Programm in Klassen unterteilt, werte werden nicht mehr übernommen Allgemeine Java-Themen 3
T Static kann nicht verändert werden Allgemeine Java-Themen 3
L iText PDF Form-Felder werden nach Bearbeitung mit iText nicht mehr richtig erkannt. Allgemeine Java-Themen 2
J Datei kann nicht geladen werden... Allgemeine Java-Themen 18
Zettelkasten JAR-Datei kann bei Freund auch nicht mit CMD ausgeführt werden Allgemeine Java-Themen 4
S OOP Apache Commons Math - Verwendung von Genetics - Wie werden Daten in Chromosomen gespeichert? Allgemeine Java-Themen 4
O Klassen werden nicht importiert Allgemeine Java-Themen 3
C .Ini-Datei Wert Änderungen werden nicht angenommen Allgemeine Java-Themen 3
M Startdatei konnte nicht geparst werden. Fehler in Zeile 0 Allgemeine Java-Themen 5
R Bild offenbar zu groß um geladen zu werden? Allgemeine Java-Themen 12
C Prozesssteuerung - Speicherhungrige externe Programme werden blockiert Allgemeine Java-Themen 2
A Input/Output generiertes PDF kann nicht geöffnet werden Allgemeine Java-Themen 2
U Fehler: Hauptklasse org.junit.runner.JUnitCore konnte nicht gefunden oder geladen werden Allgemeine Java-Themen 2
F Kompilierfehler - Hauptklasse konnte nicht gefunden werden Allgemeine Java-Themen 4
O Gucken, ob bereits Töne (von wild fremden Programmen) ausgegeben werden Allgemeine Java-Themen 5
N verdeckte Fenster werden im Vordergrund gezeichnet Allgemeine Java-Themen 6
Dit_ ThreadPoolExecutor | Die Aufgaben sollen reihe nach bearbeitet werden Allgemeine Java-Themen 6
S Swing JPanel werden nicht angezeigt Allgemeine Java-Themen 6
J Welche Informationen werden beim Kompilieren gespeichert? Allgemeine Java-Themen 3
Z Java kann nicht installiert werden Allgemeine Java-Themen 30
C Drag & Drop, Icons sollen getauscht werden Allgemeine Java-Themen 4
L Entscheiden, welcher Code ausgeführt werden soll Allgemeine Java-Themen 7
U DLLs werden nicht gefunden trotz Pfad: Allgemeine Java-Themen 4
D JVM kann nicht über die jvm.dll gestartet werden? Allgemeine Java-Themen 1
M Nach Programmdurchlauf werden Zeichen falsch dargestellt + Anderes Verhalten unter Windows Allgemeine Java-Themen 6
K Von SD-Card-Einschub unterrichtet werden - wie? Allgemeine Java-Themen 2
D NetBeans Bibliothek kann nicht genutzt werden Allgemeine Java-Themen 5
T JConsole: Klassen werden geladen aber nicht wieder entladen Allgemeine Java-Themen 3
T Threads werden nicht beendet Allgemeine Java-Themen 22
R in .jar werden files nicht gefunden!!! Allgemeine Java-Themen 5
dayaftereh JPG Kann nicht geladen werden! Allgemeine Java-Themen 9
C Kopieren von Dateien die von einem anderen Programm verwendet werden? Allgemeine Java-Themen 7
O Backslashes werden in der Ausgabe nicht übernommen Allgemeine Java-Themen 5
E Bitcode liegt vor und soll gespiegelt werden Allgemeine Java-Themen 4
S Mittels eines Applets Bilder generieren die in einer Webseite angezeigt werden..? Allgemeine Java-Themen 8
D Wie werden Regex-Gruppen kompiliert? Allgemeine Java-Themen 2
A Beim Kopieren werden Bilder verfälscht Allgemeine Java-Themen 3

Ähnliche Java Themen

Neue Themen


Oben