Portal > Foren > Java > Desktop-Applikationen und Grafik > JInternalFrame und Canvas bezüglich Reihenfolge
Antwort
 
Themen-Optionen Thema durchsuchen
Alt 05.07.2005, 13:18 Nach oben    #1
Benutzer
 
Registriert seit: 01.07.2005
Beiträge: 37
Standard JInternalFrame und Canvas bezüglich Reihenfolge

Hallo,

ich habe ein Problem.
Ich habe für meine Technikerarbeit eine Anwendung geschrieben, womit verschiedene Sachen in Diagrammfenstern ausgegebene werden.
Die Diagramfenster sind Teil der Hauptapplikation, deswegen wurden sie von JInternalFrame abgeleitet.
Bisher klappt auch alles wunderbar.
Jetzt ist es nur so, dass die Diagramme von mir selbst gezeichnet werden, und dafür habe ich eine Klasse von Canvas abgeleitet.
Diese Ableitung von Canvas füge ich in das JInternalFrame ein.
Soweit so gut.
Im JInternalFrame befinden sich aber auch noch ComboBoxen. Wenn ich diese aufklappe, so verschwinden Sie hinter der Canvasfläche.
Ebenso ist es komisch, dass, wenn ich das JInternalFrame ein wenig verschiebe, verschwindet das JInternalFrame hinter einem Panel(z.B.), die
Canvasfläche jedoch bleibt davor. Es sieht aus, als würde sich das Frame aufteilen.
Hier ein paar links, zu Screenshots:

http://www.hot-thunder.de/pics/fehler_1.jpg
http://www.hot-thunder.de/pics/fehler_2.jpg

Ich habe es schon versucht, über ein JLayeredPane zu lösen, aber entweder mach ich da was grundlegendes falsch oder ich weiß auch nicht.
Aufjedenfall zeichnet er dann das Diagramm nicht. Er zeichnet es einfach nicht.
Kurios ist auch, dass ich diesem kompletten Problem aus dem Weg gehen kann, wenn ich nicht von Canvas ableite sondern von JPanel.
Die Reihenfolge in der Tiefe funktioniert dann einwandfrei, nur ist es dann so, dass die Beschriftungen für die einzelnen Sachen unwillkürlich im Raum platziert werden, obwohl das explizit angegeben ist und beim Canvas auch funktioniert.
Hier ein Screenshot dafür:

http://www.hot-thunder.de/pics/fehler_3.jpg

http://www.hot-thunder.de/pics/fehler_4.jpg


Ich hoffe ihr könnt mir weiterhelfen. Ich habe auch schon im Forum gesucht, und das letzte mal auch etwas gefunden, dass man ab Java 1.5 die ZOrder direkt beeinflussen kann, nur finde ich den Thread leider nicht mehr
Ach ja, ich benutze übrigens Eclipse 3.01 auf JAVA 1.5 Update 3

Vielen Dank schon einmal

Grüße,

Hot-Thunder
Hot-Thunder ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 05.07.2005, 15:23 Nach oben    #2
Projektleiter
 
Registriert seit: 30.11.2005
Ort: Bottrop
Beiträge: 1.161
Standard

Was du möchtest, ist von JComponent ableiten. Canvas und Swing-Komponenten harmonieren nicht (zumindest bis Mustang).
__________________
Patrick Gotthardts Weblog.
pago ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 05.07.2005, 15:43 Nach oben    #3
Benutzer
 
Registriert seit: 01.07.2005
Beiträge: 37
Standard

oh, na sowas in der Art konnte ich mir schon fast denken.
Soll man ja eigentlihc auch nicht machen, Swing und AWT mischen.
Na gut, hab das jetzt so gemacht, habe dann aber noch das Problem, das ich als zweites angesprochen habe.
Hot-Thunder ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 05.07.2005, 22:08 Nach oben    #4
Projektleiter
 
Registriert seit: 30.11.2005
Ort: Bottrop
Beiträge: 1.161
Standard

Ohne Quellcode kann ich dir da nicht helfen.
__________________
Patrick Gotthardts Weblog.
pago ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 05.07.2005, 22:42 Nach oben    #5
Benutzer
 
Registriert seit: 01.07.2005
Beiträge: 37
Standard

0k, dann poste ich hier mal die überlagerte Paint()-Methode, mit welcher ich in dem Canvas bzw. JComponent zeichne.
Code:
 	/**
	 * Überlagerte paint-Methode, welche das Zeichnen der Balken und Diagrammelemente vornimmt 	
 	 */
	public void paint(Graphics g)
	{
		// ermittelt die maximalen größen im Fenster - einem Rand von 10 Pixeln
		/*g.clipRect(0,0,maxX,maxY);
		Rectangle r = g.getClipBounds();

		maxX = r.width ;
		maxY = r.height;*/
		int startX = maxX - (maxX - 50);
		int startY = maxY - (maxY - 50);
		
		// Zeichnen des Koordinatensystems
		g.setFont(myFont);
		// 		Zeichnen der Y-Linie
		g.drawLine(startX,startY,startX,maxY);
		
		//		Zeichnen der X-Linie
		g.drawLine(startX,maxY,maxX,maxY);
		
		//		Zeichnen des Y-Pfeils
		int pointsXP1[] = {startX,startX+5,startX-5,startX};
		int pointsYP1[] = {startY,startY+10,startY+10,startY};

		Polygon p1 = new Polygon(pointsXP1,pointsYP1,pointsXP1.length);
		g.drawPolygon(p1);
		g.fillPolygon(p1);
		
		//		Zeichnen des X-Pfeils
		int pointsXP2[] = {maxX,maxX-10,maxX-10,maxX};
		int pointsYP2[] = {maxY,maxY+5,maxY-5,maxY};
		
		Polygon p2 = new Polygon(pointsXP2,pointsYP2,pointsXP2.length);
		g.drawPolygon(p2);
		g.fillPolygon(p2);
		

		// Holen der Werte für die Zeichnung
		double[] verf_Werte = calcVerfueg();			
		double max = 0.0, min = 100.0;
		Graphics[] elements = new Graphics[verf_Werte.length];
		Graphics[] elementsRahmen = new Graphics[verf_Werte.length];
		Graphics2D[] strText = new Graphics2D[verf_Werte.length];
		Graphics2D[] strText2 = new Graphics2D[verf_Werte.length];
		Graphics legende = g.create();
		
		skalierungX = verf_Werte.length +1;
		skalierungY = 5;
		
		// Auslesen der min/max - Werte für die Y-Skalierung
		for(int i=0;i<verf_Werte.length -1;i++)
		{
			if(verf_Werte[i] > max)
			{
				max = verf_Werte[i];
			}
			if(verf_Werte[i] < min)
			{
				min = verf_Werte[i];
			}
		}
		if(verf_Werte.length < 2)
		{
			max = 100;
			min = 0;
		}
		// Zeichnen der LEGENDE
		StringBuffer strLegende = new StringBuffer();
		String month = "";
		int month_val = startDate.get(Calendar.MONTH);
		switch (month_val)
		{
			case 1:
				month = "Januar";
				break;
			case 2:
				month = "Februar";
				break;
			case 3:
				month = "März";
				break;
			case 4:
				month = "April";
				break;
			case 5:
				month = "Mai";
				break;
			case 6:
				month = "Juni";
				break;
			case 7:
				month = "Juli";
				break;
			case 8:
				month = "August";
				break;
			case 9:
				month = "September";
				break;	
			case 10:
				month = "Oktober";
				break;
			case 11:
				month = "November";
		 	break;	 		
			case 12:
				month = "Dezember";
		 	break;	 		
		}
		
		switch (perspektive)
		{
			case 1:
		 	strLegende.append("Tagesansicht: " + startDate.get(Calendar.DATE) + "." + startDate.get(Calendar.MONTH) + "." + startDate.get(Calendar.YEAR));
				break;
			case 2:
		 	strLegende.append("Wochenansicht: " + text[0] + " - " + text[text.length-2]);
		 	break;	 		
			case 3:
		 	strLegende.append("Monatsansicht: " + month + " " + startDate.get(Calendar.YEAR));
		 	break;	 		
			
		}
		legende.setFont(legendFont);
		legende.drawString(strLegende.toString(),startX, startY - 30);


		
	
		//		Errechnen der Skalierungen
		int abstandX = (maxX - startX) / skalierungX;
		int abstandY = (maxY - startY) / skalierungY;
		
		//		Zeichnen der X-Skalierungen und der Balken
		int newStartX = startX, newStartY = maxY, newStopX = newStartX, newStopY = maxY + 5;
		
		for(int i=0;i<skalierungX;i++)
		{
			// Balken
			if(i < elements.length)
			{
				// Für jedes Balkenelement ein eigenes GraphicObject
				elements[i] = g.create();
				elementsRahmen[i] = g.create();
				strText[i] = (Graphics2D) g.create();
				
				elementsRahmen[i].setColor(Color.BLACK);
				//String[] werte = 
				if(i == elements.length -1)
				{
		 		if(verf_Werte[i] > schwellwert)
					{
		 		 elements[i].setColor(Color.GREEN);	 		 	
					}
					else
					{
		 		 elements[i].setColor(Color.RED);
					}
				}
				else
				{
		 		if(verf_Werte[i] > schwellwert)
					{
		 		 elements[i].setColor(helles_gruen); 		 		
					}
					else
					{
		 		 elements[i].setColor(helles_rot);
					}
				}
				
				// Festlegen der Höhe des Balkens
				double tmpMax = max - min;
				double tmpDiffMin = verf_Werte[i] - min;
				double tmpProz = tmpDiffMin / tmpMax;

		 	int hoehe = (int)Math.round(((tmpDiffMin / tmpMax)) * (double)(maxY -(startY + 20)));

				// Zeichnen des Balkens ( Füllung und Rahmen )
		 	elements[i].fill3DRect((newStartX - (abstandX / 4)) + abstandX,maxY - hoehe ,(abstandX / 2),hoehe,true);
		 	elementsRahmen[i].drawRect((newStartX - (abstandX / 4)) + abstandX,maxY - hoehe ,abstandX / 2,hoehe);
				
				// Zusammensetzen des Ausgabestrings
				String wertAusgabe = ""+verf_Werte[i];
				String[] werte = wertAusgabe.split("\\.");
				if(werte.length > 1)
				{
		 		wertAusgabe = werte[0] + "," + werte[1].charAt(0) + " %";
				}
				
				// Ausgeben des Ausgabestrings
		 	g.drawString("" + wertAusgabe,(newStartX - abstandX /8) +abstandX,maxY - (hoehe + 10));
			}	
			// Skala
			g.drawLine(newStartX,newStartY,newStopX,newStopY);
			
			// Beschriftungen
			if(i < strText.length)
			{
				AffineTransform as = new AffineTransform();
				int laenge = (text[i].length()*5);
			 as.rotate(24,(newStartX + abstandX), newStartY + 30);
			 //g.drawRect(newStartX + abstandX,newStartY + 20,10,10);
				strText[i].setTransform(as);
		 	strText[i].drawString(text[i],(newStartX + abstandX) - laenge, newStartY + 30);	
			}
			if(i < strText2.length)
			{
				if(text2[i] != null)
				{
		 		AffineTransform as = new AffineTransform();
		 		int laenge = (text2[i].length()*5);
		 		as.rotate(24,(newStartX + abstandX + 20 ), newStartY + 30);
				 //g.drawRect(newStartX + abstandX,newStartY + 20,10,10);
					strText[i].setTransform(as);
		 	 strText[i].drawString(text2[i],(newStartX + abstandX + 20) - laenge, newStartY + 30);
				}
			}
				
			
			//g.drawString()
			newStartX += abstandX;
			newStopX += abstandX;
			
			
		}
		
		// 	Zeichnen der Y-Skalierungen und setzen der Beschriftungen
		newStartX = startX - 5;
		newStartY = maxY;
		newStopX = startX;
		newStopY = maxY;

		for(int i=0;i<skalierungY;i++)
		{
			// Beschriftungen
			double onePercentPix = ((maxY - (startY + 20)) / 100);
			double onePercentVal = (max - min) / 100;
			double scaleY = ((maxY - (startY + 20)) / (skalierungY - i) / onePercentPix);
			
			double val = (scaleY * onePercentVal);
			
 			//int newMaxY = ((maxY - (startY + 20)) / (skalierungY - i));
			//val = (int)Math.round(((newMaxY * (max - min)) + min) / min); 
			//val = (int)Math.round((((double)(maxY - (startY +20)) / (skalierungY - i)) / (maxY - (startY+20))) * (max-min) + min);	

		    //g.drawString("" + val,newStartX - 20, newStartY);
 			
 			// Skala
			g.drawLine(newStartX,newStartY,newStopX,newStopY);
			newStartY -= abstandY;
			newStopY -= abstandY;
		}
	}
Hoffe das geht einigermaßen zu verstehen. Ist mein erstes großes JAVA Projekt, und ich weiß nicht, ob mein Code sehr verständlich ist.

Aufjedenfall schon einmal vielen Dank für deine Mühe.
Hot-Thunder ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 05.07.2005, 23:05 Nach oben    #6
Projektleiter
 
Registriert seit: 30.11.2005
Ort: Bottrop
Beiträge: 1.161
Standard

Hmm... ich habe mir den Code jetzt noch nicht angesehen, aber generell überlagert man bei einem JComponent die "paintComponent"-Methode, nicht die "paint"-Methode.
__________________
Patrick Gotthardts Weblog.
pago ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 06.07.2005, 10:09 Nach oben    #7
Benutzer
 
Registriert seit: 01.07.2005
Beiträge: 37
Standard

OK, ich habe das nun geändert. Der Fehler ist aber trotzdem noch da.
Wo bekomme ich denn dieses Mustang her?
Und was ist denn das genau?
Hot-Thunder ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 06.07.2005, 18:46 Nach oben    #8
Benutzer
 
Registriert seit: 01.07.2005
Beiträge: 37
Standard

ok, ich weiß nun was Mustang ist.
Hab mir bei sun das Mustang runtergeladen und installiert, aber damit macht es keinen Unterschied.
Also der Fehler zwischen diesem Canvas und den Swing komponenten besteht noch immer.
Gibt es denn keine Möglichkeit, die Tiefe eines Objekts, also an welcher Stelle das kommt manuell einzugeben?
Ohne das man ein JLayeredPane verwendet?
Hot-Thunder ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 06.07.2005, 19:00 Nach oben    #9
Projektleiter
 
Registriert seit: 30.11.2005
Ort: Bottrop
Beiträge: 1.161
Standard

Ja? Hmm... na ja, dann kommt das erst noch. Die Probleme sollten auf jedenfall beseitigt werden.

Vielleicht kannst du ja hiermit was machen (5.0-only
http://java.sun.com/j2se/1.5.0/docs/...mponent,%20int)
__________________
Patrick Gotthardts Weblog.
pago ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 06.07.2005, 19:41 Nach oben    #10
Benutzer
 
Registriert seit: 01.07.2005
Beiträge: 37
Standard

nein, leider nicht. War eine gute Idee, danke.
Aber es ist trotzdem noch so, dass, egal wie ich die Reihenfolge beim Hinzufügen auch mache, das Canvas ist immer ganz vorne.
Nunja, ich probiere das nun weiter mit JComponent.
Trotzdem vielen Dank.
Hot-Thunder ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 06.07.2005, 20:56 Nach oben    #11
Benutzer
 
Registriert seit: 01.07.2005
Beiträge: 37
Standard

habe den Fehler für das Problem gefunden, dass die Beschriftungen, welche mittels drawString gezeichnet werden, willkürlich auf der Zeichenfläche verschoben werden.
Dies trat nur auf, wenn ich auf das JComponent oder JPanel gezeichnet habe.
Wie auf den Screenshots zu sehen ist, drehe ich die Strings ( welche eigene Grafikobjekte sind ) mit der Funktion transform der Klasse AffineTransform.
Dies macht auf irgendeine Art und Weise Probleme.
Kommentiere ich das aus, bleiben die Bezeichnungen an Ort und Stelle.
Hot-Thunder ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Antwort

Lesezeichen


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks sind an
PingBacks sind an
RefBacks sind aus

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
JInternalFrame Carsten Desktop-Applikationen und Grafik 4 18.02.2006 14:24
Canvas Größe Lengen1971 Desktop-Applikationen und Grafik 2 29.09.2005 08:56
Bild in JinternalFrame mit JSrollPane taskin73 Allgemeine Java-Programmierung 5 08.08.2005 22:53
von JInternalFrame erben xeon Desktop-Applikationen und Grafik 5 07.07.2005 12:34
Inhalt einer Canvas in eine Dateispeichern Zeeky-H-Bomb Allgemeine Java-Programmierung 0 11.06.2005 13:15


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:02 Uhr.


Powered by vBulletin® Version 3.7.4 (Deutsch)
Copyright ©2000 - 2009, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45