Swing Icons von JLabel zur Laufzeit ändern

guitarflow

Mitglied
Hallo liebe Community,

bin neu in Java und möchte gern für ein Projekt im Studium ein Java Blackjack realisieren.

Die Logik sollte nicht das Problem sein, bloss die Grafikprogrammierung ist mir überhaupt nicht klar.

Zum Problem :
Ich arbeite mit Eclipse und Jigloo.

Ich habe 3 Sourceordner :

card : hierin befinden sich 2 Klassen Card und Cardset ( der Name ist Programm )
main : hier befindet sich die eine Main-Klasse und meine JFrame Klasse
pics : hier befinden sich die .jpgs für die Karten

Schon gleich hierzu mal ne Frage : Sollte man die main-methode in die JFrame klasse mit reinpacken oder eine eigene Main-Klasse machen, in der man dann eine Instanz der JFrame Klasse erzeugt?

Was ist denn der Unterschied, ob meine Bilder in einem Folder, einem Source-Folder oder im Buildpath liegen? Versteh da noch nicht ganz, worin sich die unterscheiden.

Jetz zu dem eigentlichen Problem :

Ich habe ein JPanel mit einem GridBagLayout drin. Darin liegen dann insgesamt 10 JLabels für die Bilder. Jetzt wollte ich gerne aus meiner Main-Funktion auf die Methode setIcon() der JLabels zugreifen.
Im Jigloo erzeugten Code sieht das folgendermassen aus :
Java:
card1 = new JLabel();
card1.setIcon(new ImageIcon(getClass().getClassLoader().getResource("pics/Herz_koenig.jpg")));
Das passiert innerhalb der Funktion initGui(), die im Konstrutor aufgerufen wird.
Die Variablen selbst sind als private deklariert.

Nun dachte ich mir, dass ich innerhalb meiner Main-Methode, die sich momentan in der JFrame Klasse befindet, dieselbe Syntax verwenden kann.
Allerdings bekomme ich immer wieder die selbe Fehlermeldung :
"Cannot make static reference from non-static method getClass() in java.lang.Object"

Habe wirklich schon alles probiert, die Variablen als static deklarieren auch schon ... dann gibts halt zur Abwechslung mal ne Null-Pointer-Exception ...;(

Ich hoffe ihr könnt mir ein wenig Nachhilfe geben ....

Bei Fragen zum Problem einfach melden!

Danke schon mal im Voraus,

guitarflow
 
Naja, getClass() ist eine Objektmethode. D.h. entweder musst du das auf dem Exemplar der JFrame-Klasse aufrufen (wenn es dieses überhaupt schon gibt) oder anstelle von getClass() so etwas wie DeineKlasse.class schreiben !
 
hmm, erstmal Danke für deine Antwort.
hier mal der Code :

Java:
package main;
import javax.swing.ImageIcon;
import javax.swing.JLabel;

import javax.swing.WindowConstants;
import javax.swing.SwingUtilities;

public class JFrameGUI extends javax.swing.JFrame {
	private JLabel DealerLabel;
	private JLabel dealerCard1;
	private JLabel dealerCard2;
	private JLabel dealerCard3;
	private JLabel dealerCard4;
	private JLabel PlayerLabel;
	private JLabel playerCard5;
	private JLabel playerCard4;
	private JLabel playerCard3;
	private JLabel playerCard2;
	private JLabel playerCard1;
	private JLabel dealerCard5;

	/**
	* Auto-generated main method to display this JFrame
	*/
	public static void main(String[] args) {
		SwingUtilities.invokeLater(new Runnable() {
			public void run() {
				JFrameGUI inst = new JFrameGUI();
				inst.setLocationRelativeTo(null);
				inst.setVisible(true);
			}
		});
		
	}
	
	public JFrameGUI() {
		super();
		initGUI();
	}
	
	private void initGUI() {
		try {
			setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
			getContentPane().setLayout(null);
			this.setPreferredSize(new java.awt.Dimension(800, 550));
			{
				DealerLabel = new JLabel();
				getContentPane().add(DealerLabel);
				DealerLabel.setText("Dealer");
				DealerLabel.setBounds(34, 12, 38, 15);
			}
			{
				dealerCard1 = new JLabel();
				getContentPane().add(dealerCard1);
				dealerCard1.setIcon(new ImageIcon(getClass().getClassLoader().getResource("pics/placeholder.jpg")));
				dealerCard1.setBounds(49, 38, 120, 173);
			}
			{
				dealerCard2 = new JLabel();
				getContentPane().add(dealerCard2);
				dealerCard2.setIcon(new ImageIcon(getClass().getClassLoader().getResource("pics/placeholder.jpg")));
				dealerCard2.setBounds(193, 38, 120, 173);
			}
			{
				dealerCard3 = new JLabel();
				getContentPane().add(dealerCard3);
				dealerCard3.setIcon(new ImageIcon(getClass().getClassLoader().getResource("pics/placeholder.jpg")));
				dealerCard3.setBounds(338, 38, 120, 173);
			}
			{
				dealerCard4 = new JLabel();
				getContentPane().add(dealerCard4);
				dealerCard4.setIcon(new ImageIcon(getClass().getClassLoader().getResource("pics/placeholder.jpg")));
				dealerCard4.setBounds(484, 38, 120, 173);
			}
			{
				dealerCard5 = new JLabel();
				getContentPane().add(dealerCard5);
				dealerCard5.setIcon(new ImageIcon(getClass().getClassLoader().getResource("pics/placeholder.jpg")));
				dealerCard5.setBounds(628, 38, 120, 173);
			}
			{
				playerCard1 = new JLabel();
				getContentPane().add(playerCard1);
				playerCard1.setIcon(new ImageIcon(getClass().getClassLoader().getResource("pics/placeholder.jpg")));
				playerCard1.setBounds(46, 272, 120, 173);
			}
			{
				playerCard2 = new JLabel();
				getContentPane().add(playerCard2);
				playerCard2.setIcon(new ImageIcon(getClass().getClassLoader().getResource("pics/placeholder.jpg")));
				playerCard2.setBounds(193, 272, 120, 173);
			}
			{
				playerCard3 = new JLabel();
				getContentPane().add(playerCard3);
				playerCard3.setIcon(new ImageIcon(getClass().getClassLoader().getResource("pics/placeholder.jpg")));
				playerCard3.setBounds(338, 272, 120, 173);
			}
			{
				playerCard4 = new JLabel();
				getContentPane().add(playerCard4);
				playerCard4.setIcon(new ImageIcon(getClass().getClassLoader().getResource("pics/placeholder.jpg")));
				playerCard4.setBounds(484, 272, 120, 173);
			}
			{
				playerCard5 = new JLabel();
				getContentPane().add(playerCard5);
				playerCard5.setIcon(new ImageIcon(getClass().getClassLoader().getResource("pics/placeholder.jpg")));
				playerCard5.setBounds(628, 272, 120, 173);
			}
			{
				PlayerLabel = new JLabel();
				getContentPane().add(PlayerLabel);
				PlayerLabel.setText("Player");
				PlayerLabel.setBounds(46, 240, 35, 15);
			}
			pack();
			this.setSize(800, 550);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

}

Wenn ich jetzt in der Main schreibe :
Java:
dealerCard1.setIcon(getClass().getClassLoader().getResource("pics/Herz_dame.jpg"));

bekomme ich die o.g. Fehlermeldung.
Ich versteh das nicht, weil mir meine InitGui()-Methode ja eine Instanz des JLabels erstellt und genau so das erste Icon vorbesetzt.

Jemand ne Erklärung?

mfg,

guitarflow
 
siehe Post von eRaaaa, er hat doch schon die zwei möglichen Optionen genannt.
Du kannst in einer statischen Methoden nicht einfach getClass() aufrufen. getClass() ist eine "Instanz" Methode (nicht statisch) und kann nur an einer Instanz aufgerufen werden.
Innerhalb einer statischen Methode kannst Du nicht davon ausgehen, dass es eine Instanz der Klasse gibt bzw. solche Methode werden ja nicht an einer Instanz aufgerufen.
Also entweder:
inst.getClass().get...
oder
JFrameGUI.class.get...
 

Neue Themen


Zurück
Oben