Jpanel will nich alles zeichnen

Status
Nicht offen für weitere Antworten.

0din

Bekanntes Mitglied
Hallo,

Mein problem is das ich ne pinnwand am schreiben war nur leider mag mir das ding die postits nich zeichnen. Den hintergrund und die JLabel hingegen werden ohne meckern und murren gezeichnet und erneuert.
Ich weiß leider nich wieviel code nötig is um das ganze zu lösen aber ich geb mal das bedeutenste:

Java:
	@Override
	protected void paintComponent(Graphics g)
	{
		super.paintComponent(g);
		g.drawImage(background, 0, 0, this);
                
/*
*Div. Positions bestimmungen...
* background => Image von JPG File
* postitRohling => Image von JPG File
*/

	
			g.drawImage(postitRohling, x, y, xWert, yWert, this);
			
			JTextArea ta1 = new JTextArea("ID: " + p.getId());
			ta1.setLineWrap(false);
			ta1.setBackground(Color.yellow);
			ta1.setSize(30, 20);
			ta1.setLocation(x+5,y+1);
			this.add(ta1);
			
			JTextArea ta2 = new JTextArea(p.getText());
			ta2.setLineWrap(true);
			ta2.setBackground(Color.yellow);
			ta2.setSize((xWert - 20), (yWert - 35));
			ta2.setLocation((x + 10), (y + 23));
			this.add(ta2);
         }
 
stehen die Befehle
this.add(ta1);
this.add(ta2);
innerhalb von paintComponent()?
das kann nicht gut gehen,
generell sollte eine Komponente entweder nur andere Komponenten enthalten oder mit paintComponent bemalt werden, besser nicht gemischt
 
Die beiden adds stehen nicht direkt in der paintcomponent methode.
Da ich recht viele berechnungen etc. für die teile anstellen musste hab ich ne extra methode draus gemacht die aber direkt von paintcomponent angerufen wird.

Kann das ganze denn daran liegen das ich die JTextAreas dort hinzufüge?
Dürfte doch eigentlich nicht störend (aber unschön) sein weil ich davor die jeweiligen bildchen zeichne.
Der gedanke war das ich die bildchen zeichne und dann die JTextAreas darüber zeichnen lasse.
(Am Rande, am anfang der ganzen methode werden alle alten JTextAreas aus dem Component Container gelöscht)



Damit das ganze vllt richtig deutlich wird poste ich einfach mal den kompletten code dazu. Der Fehler sollte in der paintPostIts(Graphics g) liegen
Randnotiz: Die berechnung der positionen is net das tollste aber ich bekomme leider nichts anderes aus der DB

Java:
package view;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;

import java.awt.Image;

import java.util.ArrayList;
import java.util.Observable;
import java.util.Observer;

import javax.swing.JPanel;
import javax.swing.JTextArea;

import model.Pinnwand;
import model.Postit;

public class Rahmen extends JPanel implements Observer
{
	private Image postitRohling;
	private Image background;
	private Pinnwand pw;
	private double PERCENTOFPOSTIT = 0.30;

	public Rahmen(Pinnwand pw)
	{
		this.pw = pw;
		this.setLayout(null);
		this.setPreferredSize(new Dimension(540, 540));
		try
		{
			postitRohling = getToolkit().getImage("images/postit.jpg");
			background = getToolkit().getImage("images/background.jpg");
		}
		catch (Exception e)
		{
			e.printStackTrace();
		}
		
		for (int i = 9; i >= 0; i++)
		{
			
		}
	}
		
	private void paintPostIts(Graphics g)
	{
		/*
		 * PostIts postits werden gezeichnet, Label werden darüber gelegt
		 */
		
		//alles aus dem container killen weil sonst zich labels drin landen
		removeAll();

		ArrayList<Postit> pi = pw.getPostits();
		for (Postit p : pi)
		{
			int xWert = (int) (getWidth() * PERCENTOFPOSTIT);
			int yWert = (int) (getHeight() * PERCENTOFPOSTIT);

			int x = 0;
			int y = 0;
			
			int temp = p.getPosition();

			while(temp > 3)
			{
				temp = temp - 3;
			}
			
			switch(temp)
			{
				case 1:
				{
					x = xWert * (temp - 1) + 20;
					break;
				}
				case 2:
				{
					x = xWert * (temp - 1) + 25;
					break;
				}
			
				case 3:
				{
					x = xWert * (temp - 1) + 30;
					break;
				}
			}
			
			temp = p.getPosition();
			if(temp >= 1 && temp <= 3)
			{
				y = yWert * 0;
			}
			
			if(temp >= 4 && temp <= 6)
			{
				y = yWert * 1 + 5;
			}
			if(temp >= 7 && temp <= 9)
			{
				y = yWert * 2 + 10;
			}
			
			y += 20;
			
			
			g.drawImage(postitRohling, x, y, xWert, yWert, this);
			
			JTextArea ta1 = new JTextArea("ID: " + p.getId());
			ta1.setLineWrap(false);
			ta1.setBackground(Color.yellow);
			ta1.setSize(30, 20);
			ta1.setLocation(x+5,y+1);
			this.add(ta1);
			
			JTextArea ta2 = new JTextArea(p.getText());
			ta2.setLineWrap(true);
			ta2.setBackground(Color.yellow);
			ta2.setSize((xWert - 20), (yWert - 35));
			ta2.setLocation((x + 10), (y + 23));
			this.add(ta2);
		}
	}

	@Override
	protected void paintComponent(Graphics g)
	{
		super.paintComponent(g);
		g.drawImage(background, 0, 0, this);
		paintPostIts(g);
	}

	@Override
	public void update(Observable arg0, Object arg1)
	{
		repaint();
	}

}
 
ob nun direkt in paintComponent() oder in einer Untermethode, das macht gewiss keinen Unterschied,
während des Zeichenvorgangs Objekte einzufügen ist nicht gut, soviel kann man sagen,

aber mit dem postit-Bild sollte das eher wenig zu tun haben,
da vermute ich klassische Ursachen: Bild gar nicht geladen, Schleife leer, x,y-Variablen falsch berechnet und ähnliches,

fange doch mal mit ner einfachen paintComponent-Methode an:

protected void paintComponent(Graphics g)
{
super.paintComponent(g);
g.drawImage(background, 0, 0, this);
g.drawImage(postitRohling, 20, 20, this);
}

funktioniert das?
wenn nicht, dann ist zumindest 50% der Codes irrelevant 😉

wenn doch, dann nach und nach dann die Skalierung der Länge/ Breite einbauen, Schleife mit mehreren Bildern,
x,y-Berechnung, am Ende wieder die TextAreas usw.
 
Gezeichnet wird das ganze mit dem kurzen stück auch nicht.
Das image wird geladen (ansonsten müsste ich nen stacktrace haben)

was mir aber beim anschaun der variablen im debug auffällt ist, das background hat height und width 500
das postit -1 und -1... obwohl das image 300nochwas bei 300nochwas is

Das postit bild hat meine freundin gemacht und am rand sind einige stellen transparent.
Kanns sein das Java sowas garnich lustig findet?
 
ich persönlich kann über den Zustand des Bildes auf der Ferne nichts sagen,
wenn du es postest (Dateianhänge an Post), dann kann ich es testen
 
validate() zieht auch nich... so langsam wird das ganze doch seltsam...

Wie gesagt, das einzige was für mich sinn machen würde wäre das image un die eigenschaft des transparenten teils

SlaterB
Das image is angehängt
 
Der kurze Code von SlaterB funktioniert bei mir. Nur die Transparenz in deinem Bild klappt nicht. Mit anderen transparenten Bildern gibt es bei mir jedoch kein Problem. Das sind allerdings alles "gif" Bilder. Vielleicht geht das nicht mit "jpg"?
 
Zuletzt bearbeitet:
JPEG unterstützt keine Transparenz. Entweder PNG, oder GIF, oder SVG (zum Beispiel mit Apache Batik).

Dieses Bild würde ich wohl versuchen in ein PNG umzuwandeln und weiß zu transparent zu wandeln.

Ebenius
 
Bei mir mag der Code leider nicht arbeiten.
Ich hab das bild nu als PNG versucht, dabei sollte laut euch ja die transparenz funktioniern.
Das bild wird noch immer net gezeichnet.

Das problem scheint noch immer das selbe zu sein, die höhe und breite steht noch immer bei -1 und -1
Folglich wirds ja vllt gezeichnet aber halt mit den komischen abmessungen, was zur folge hat dasses gezeichnet wird aber nich sichtbar is.

Also vllt mal die frage, wie kann es passieren das ein bild die abmessungen -1 * -1 bekommt oder wie kann ich das ändern?
 
Das Problem kommt mir bekannt vor. Als ich meine ersten Applets geschrieben habe, war das Problem auf der Tagesordnung. Nur weiß ich nicht, ob sich das hier her übertragen lässt.
Das Bild wird zwar gefunden, aber das Laden dauert zu lange, so dass ein leeres Image gezeichnet wird. Das Bild hat deshalb negative Abmessungen, weil es zum Zeitpunkt des Zeichnens noch nicht verfügbar ist.
Das lässt sich ändern. Wenn du weiter das Toolkit zum Laden der Bilder verwenden möchtest, solltest du mal versuchen, die Bilder mit dem java.awt.MediaTracker zu laden.
Das macht aber eigentlich nur in AWT-Programmen Sinn.
In Swing-Programmen verwendet man das wesentlich effizientere ImageIO zum Einlesen von Grafikdateien.
 
Treffer,
Versenkt!
😀

Wenn zum einlesen folgende zeile genommen wird, funktioniert das ganze wieder.
Java:
import java.io.File;
import java.awt.Image;
import javax.imageio.ImageIO;

Image postitRohling = ImageIO.read(new File(pfad + "/images/postit_groß.png"));
Das ganze wird nun anstandslos gezeichnet.

Und was lernen wir daraus?
Toolkit zum Image einlesen = Schrott

Mühsam nährt sich das Eichhörnchen...
Herzlichen Dank euch allen
 
Zuletzt bearbeitet:
Und was lernen wir daraus?
Toolkit zum Image einlesen = Schrott
Beim Nichtschwimmer liegt's auch immer an der Badehose. ;-)

Ein Image wird nunmal per Toolkit so geladen, dass es nicht vollständig initialisiert ist, wenn man es zurück bekommt. Ist nunmal das Konzept des ImageObservers. MediaTracker ist eine Möglichkeit, sicher zu stellen, dass ein Bild dann vollständig geladen ist, wenn man es wirklich benötigt.

Ich schreib das eigentlich nur, weil ich darauf hinweisen wollte, dass Du Dir mangels Ahnung eine schlechte Meinung zugelegt hast. ;-)

Ebenius
 
Ebenius:
Nuja, das is aber recht praktisch so. Nu weiß ich das ich das toolkit für sowas besser net ran nehme sondern gleich auf ImageIO übergehe.
Un du musst zugeben, hätte ich das gleich gemacht wäre dieser Thread nicht hier ;-)
Wenn ich mir nu angewöhn das ImageIO zu nehmen, spart mir das auf dauer zeit & nerven

André Uhres:
Bequem naja, ich hab 5min mehr gebraucht um zu verstehn was drin steckt aber wenn mans weiß isset um einiges geschickter, vorallem wenn ich lese was Ebenius zum toolkit geschrieben hat.


Nichts desto trotz, es bleibt bei nem Danke ;-)
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben