JPanel vs. Aufruf statischer Methode

Pius Hermit

Erfahrenes Mitglied
Hallo Leute,
habe in meinem Hauptprogramm einen JPanel erzeugt, welcher für sich alleine
auch auf einem JFrame ausgegeben wird - soweit so gut. Nun habe ich eine
statische Methode vorangestellt, welche notwendig ist, um eine Initialisierung der
Variablen, auf welche sowohl die paintComponent-Methode, als auch Mouselistener-Classe zugreifen, zu gewährleisten. Testausgaben System.out...funktionieren. Alleine:
Statische Methode auskommentiert: JPanel wird angezeigt,
Statische Methode nicht auskommentiert: keine JPanel-Anzeige.
Weiß jemand Rat?
Hilflos,
Ulrich
 
Hallo, mußte gerade auf meinen Entwicklungsrechner umswitchen, klappt sonst nicht
mit Copy&Paste:)
Hoffe, der Code ist nicht zu unleserlich, bin Swing-Neuling und leider etwas
Kommentierfaul...

Code:
package Haupt;

import javax.swing.JFrame;
import javax.swing.JPanel;
import Bildschirmscrollen.Anzeige;
import Bildschirmscrollen.Scroll;
import Grafik.JF;
import Horcher.Fensterhorcher;
import Horcher.Maushorcher;
import Horcher.Tastaturhorcher;
import Koordinaten.Koordinatensystem;
import Koordinaten.Transformationssystem;
import Raster.Raster;

public class Haupt {
	
	private Haupt(){
		Koordinatensystem bildschirm = new Koordinatensystem();
		Transformationssystem t = new Transformationssystem(bildschirm);
		Fensterhorcher h1 = new Fensterhorcher();
		Tastaturhorcher h2 = new Tastaturhorcher();
		Maushorcher h3 = new Maushorcher();
		JFrame f = new JFrame();		
		JF.hauptfenster(f, t, h1, h2, h3);

		Koordinatensystem rasterfenster = 
			new Koordinatensystem(Konstante.rasterlinks, 
								Konstante.rasteroben,
								Konstante.rasterrechts, 
								Konstante.rasterunten);
		Koordinatensystem raster = 
			new Koordinatensystem(0, 
								0,
								Konstante.rasterX, 
								Konstante.rasterY);
		t.transformiere(rasterfenster);
		t.bild(raster);
		
//		Scroll.initialisiere();
System.out.println("Test4");
		JPanel a = new Anzeige();
		JF.fensterTrans(a, t);
		f.add(a);
System.out.println("Test5");
		
/*		JPanel p = new Raster(t);
		JF.fensterTrans(p, t);
		f.add(p);*/
	}
	
	public static void main(String[] args){
		new Haupt();
	}
}
Code:
package Bildschirmscrollen;

import Koordinaten.Koordinaten;
import Koordinaten.Koordinatensystem;

public class Scroll{
  
	private static Koordinatensystem 
		bildschirmrand = new Koordinatensystem();
	private static Koordinatensystem 
		scrollrand = new Koordinatensystem();
	private static Koordinaten 
		maus = new Koordinaten();
	private static Koordinaten 
		scroll = new Koordinaten();
	

	public static Koordinaten scroll(){
		return scroll;
	}
	
	private static boolean links(){
		return (maus.x() <= bildschirmrand.ursprung().x());
	}
	
	private static boolean rechts(){
		return (maus.x() >= bildschirmrand.ende().x());
	}
	
	private static boolean oben(){
		return (maus.y() <= bildschirmrand.ursprung().y());
	}
	
	private static boolean unten(){
		return (maus.x() >= bildschirmrand.ursprung().y());
	}
	
	private static void incx(){
		scroll.x((int)
				((bildschirmrand.ende().x() -
				maus.x())*
				Konstante.xscrollmax / 
				(bildschirmrand.ende().x()*Konstante.xrand)));
	}
	
	private static void decx(){
		scroll.x((int)
				((bildschirmrand.ursprung().x() -
				maus.x())*
				Konstante.xscrollmax / 
				(bildschirmrand.ende().x()*Konstante.xrand)));
	}
	
	private static void incy(){
		scroll.y((int)
				((bildschirmrand.ende().y() -
				maus.y())*
				Konstante.yscrollmax / 
				(bildschirmrand.ende().y()*Konstante.yrand)));
	}
	
	private static void decy(){
		scroll.y((int)
				((bildschirmrand.ursprung().y() -
				maus.y())*
				Konstante.yscrollmax / 
				(bildschirmrand.ende().y()*Konstante.yrand)));
	}
	
	public static void aktualisiere(Koordinaten k){
		maus.x(k.x());
		maus.y(k.y());
		if (links()) {decx(); 
//			a.repaint();
			} else  
			if (rechts()){incx();
//				a.repaint();
				};
		if (oben()) {decy(); 
//			a.repaint();
			} else  
			if (unten()) {incy(); 
//				a.repaint();
				};
	}
	
	public static void initialisiere(){
System.out.println("Test2");
		scrollrand.ursprung().
		x((int) (bildschirmrand.ende().x()* 
				Bildschirmscrollen.Konstante.xrand));
		scrollrand.ursprung().
		y((int) (bildschirmrand.ende().y()* 
				Bildschirmscrollen.Konstante.yrand));
		scrollrand.ende().
		x((int) (bildschirmrand.ende().x()* 
				(1 - Bildschirmscrollen.Konstante.xrand)));
		scrollrand.ende().
		y((int) (bildschirmrand.ende().y()* 
				(1 - Bildschirmscrollen.Konstante.yrand)));
		scroll.x(0);
		scroll.y(0);
System.out.println("Test3");
	}

}
Code:
package Bildschirmscrollen;

import java.awt.Graphics;
import javax.swing.JPanel;

public class Anzeige extends JPanel{
	
	private static final long serialVersionUID = 1L;
	
	public Anzeige(){
	}
	
	public void paintComponent(Graphics g){
		g.setColor(Haupt.Konstante.rasterfarbe);
//		g.drawString("X-Scroll"+Scroll.scroll().x(), 100, 100);
//		g.drawString("Y-Scroll"+Scroll.scroll().y(), 100, 120);
		g.drawString("X-Scroll", 500, 350);
		g.drawString("Y-Scroll", 500, 370);
		System.out.println("Test");
	}

}
Ist alles eine Testumgebung, um dauerhaft ein Startegiespiel zu entwickeln...
 
Sorry, ich hoffe, der Code ist nicht zu komplex, es funktioniert ja fast alles,
bloß bei auskommentierter Methode wird paintComponent aufgerufen
(Ausgabe "Test"), sonst nicht...:confused:
Hier noch meine Fensterklasse:
Code:
package Grafik;

import javax.swing.JFrame;
import javax.swing.JPanel;

import Haupt.Konstante;
import Horcher.Fensterhorcher;
import Horcher.Maushorcher;
import Horcher.Tastaturhorcher;
import Koordinaten.Transformationssystem;

public class JF {

	public static void hauptfenster(JFrame f,
							Transformationssystem t, 
							Fensterhorcher h1,
							Tastaturhorcher h2,
							Maushorcher h3){
		f.setLocation(t.location());
		f.setSize(t.size());
		f.getContentPane().setBackground(Konstante.hintergrundfarbe);
		f.setUndecorated(true);
		f.setVisible(true);
		f.addWindowListener(h1);
		f.addKeyListener(h2);
		f.addMouseListener(h3);
	}

	public static void fensterTrans(JPanel p,
			Transformationssystem t){
		p.setLocation(t.location());
		p.setSize(t.size());
		p.setVisible(true);
		p.setOpaque(false);
	}

	public static void fensterIntrans(JPanel p,
			Transformationssystem t){
		p.setLocation(t.location());
		p.setSize(t.size());
		p.setVisible(true);
		p.setOpaque(true);
	}
}
 
Das ist ja auch ganz klar.
Ich denke mal dass du diese Methode
Code:
public static void fensterTrans(JPanel p, Transformationssystem t){
	p.setLocation(t.location());
	p.setSize(t.size());
	p.setVisible(true);
	p.setOpaque(false);
}
meinst. Dort setzt du setOpaque auf false. Damit ist das Panel unsichtbar und paintComponent wird nicht aufgerufen.

MFG

zEriX
 
Danke für Deine Mühe zEriX, aber das ist leider nicht der Fehler:
Wenn ich in private Haupt (Package Haupt, 1. Code-View) scroll.initialisiere()
auskommentiere, klappts...
Es wird glaube ich auch nur der Hintergrund transparent:confused:
 
:)Vielleicht hängt es doch damit zusammen:
Ich wollte mehrere Layer so programmieren, dass diese transparent übereinanderliegen...
Das bekomme ich leider auch nicht hin:mad:
Ich dachte, dass man nur ein JFrame mit getContentPane.setBackcolor(...
haben muss, und dann ohne Hintergrund JPanels darüberlegen könnte?
 
Zurück