Border verschwindet durch Graphics.drawImage()

lyrichter

Mitglied
Hallo liebes Java-Forum!

Ich beschäftige mich nun seit einigen Tagen mit der Erstellung von GUI's in Java mit Swing und bin nun auf folgendes Phänomen gestoßen, das ich mir nicht ganz erklären kann:

Wenn ich in einem JPanel paintComponent() überschreibe und darin die drawImage()-Methode eines Graphics-Objektes aufrufe, wird die Border des Panels nicht mehr angezeigt.

Ich habe daraufhin gelesen, dass die Border-Linien nicht außerhalb des Zeichenbereichs, sondern noch im Zeichenbereich selbst erstellt werden - vielleicht kommt es da dann ja zu Überlappungen von gezeichnetem Inhalt und der Rahmenlinie. Da ich aber ebenfalls gelesen habe, dass durch einen Aufruf von paint() zuerst paintComponent() und dann paintBorder() aufgerufen wird, dachte ich, dass der Rahmen eher den Inhalt überdeckt als umgekehrt. Nun habe ich trotzdem mal den Zielbereich von drawImage stark verkleinert, allerdings ohne Erfolg. Das Bild befindet sich wie erwartet ganz klein in der Mitte des vorgesehen Bereiches - die Rahmenlinie fehlt aber trotzdem.
Um das Problem der Überlappung 100%ig zu umgehen, habe ich das Draw-Panel zusätzlich noch in ein weiteres, deutlich größeres JPanel gepackt. Ohne den Aufruf von drawImage() sind beide Borderlines sichtbar und wie erwartet mit einem gewissen Abstand geschachtelt, mit dem Aufruf hingegen verschwinden beide Linien.

So, das war der ausführliche Bericht meienr Ansätze und Gedanken, nachfolgend poste ich den zugehörigen Code. Um Ratschläge und Anregungen wäre ich sehr dankbar!

Java:
public class MyPanel extends JPanel{
	BufferedImage buffImg;
	Point upperLeft;
	int width;
	int height;
	
	public MyPanel(){
		super();
		
		//load Image
		File f = new File("images/test.jpg");
		try {
			buffImg = ImageIO.read(f);
		} catch (IOException e) {
			System.out.println("Datei konnte nicht geöffnet werden!");
		}
		
		// initial values
		upperLeft = new Point(0,0);
		width = buffImg.getWidth();
		height = buffImg.getHeight();
		
		repaint();
	}
	
	@Override
	protected void paintComponent( Graphics g )
	  {
		super.paintComponent(g);
		
		int a = (int) upperLeft.getX();
		int b = (int) upperLeft.getY();
		int c = a+width;
		int d = b+height;
				
		Graphics2D g2 = (Graphics2D)g;
        g2.setRenderingHint(RenderingHints.KEY_INTERPOLATION,
                            RenderingHints.VALUE_INTERPOLATION_BILINEAR);
        g2.drawImage(buffImg,200,200,300,300,a,b,c,d, null);
        g2.dispose();
        }
}



public class Test {
	
	public static void main(String[] args){
		// frame
		JFrame frame = new JFrame("test");
		frame.setSize(1000, 1000);
	    frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
	    frame.setLayout( new FlowLayout() );
	    
	    //picPanel
		MyPanel picPanel = new MyPanel();
		picPanel.setPreferredSize(new Dimension(400,400));
		picPanel.setBorder(BorderFactory.createTitledBorder("picPanel"));
		
		//picBorderPanel
		MyPanel picBorderPanel = new MyPanel();
		picBorderPanel.setPreferredSize(new Dimension(500,500));
		picBorderPanel.setBorder(BorderFactory.createTitledBorder("picBorderPanel"));
		picBorderPanel.add(picPanel);
		
		//buttonPanel
		JPanel buttonPanel = new JPanel();
		buttonPanel.setPreferredSize(new Dimension(500,500));
		buttonPanel.setBorder(BorderFactory.createTitledBorder("buttonPanel"));
		
		// adding components to top level container
		Container contentPane = frame.getContentPane();
		contentPane.add(picBorderPanel);
		contentPane.add(buttonPanel);
		
		// set visible
		frame.pack();
		frame.setVisible(true);	
	}

}
 
Hi,

versuch mal
Java:
g2.drawImage(buffImg,200,200,300,300,a,b,c,d, this);
dies hatte in vergangener Zeit bei jemand anderen auch zu Problemen geführt. Das war es aber auch schon mit meinem Wissen zum Zeichnen 😉
 
Ganz einfach: Du rufst g2.dispose() in deiner Paint Methode auf und löscht daher dein übergebenes Graphikobjekt. Mit diesem Objekt sollen aber dann noch der Border gezeichnet werden. Du darfst nur Graphics Objekte dipsosen, wenn du sie dir selbst mit createGraphics erstellt hast. Nur weil du es auf ein Graphics2D castest ist es noch immer das gleiche Objekt.
PS: Es ist übrigens einfacher ein Bild mit drawImage(image, xPunkt, yPunkt, breite, höhe, null) zu Zeichnen.
 
Zuletzt bearbeitet:
Vielen Dank bERt0r, damit klappt es wunderbar!

Mir war bis jetzt gar nicht bewusst, dass dieses Graphics-Objekt danach noch genutzt wird.

Viele Grüße,
lyrichter
 

Zurück
Oben