Anzeigefehler in GridBagLayout durch paintComponent(Graphics g)

bauklotz

Mitglied
Hallo zusammen,

ich habe folgendes Problem, für das ich beim Durchsuchen des Forums leider keine Lösung gefunden habe.

Ich habe ein JFrame ('Hauptfenster'), welches in verschiedene Bereiche unterteilt ist und für das ich deshalb ein GridBagLayout benutze.
Hier der Konstruktor der Klasse.

Java:
public Hauptfenster()
	{
		
                this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		this.setSize(1200, 800);
		this.setBackground(Color.LIGHT_GRAY); 
		Container contentPane = this.getContentPane();
		GridBagLayout layout = new GridBagLayout();
		contentPane.setLayout(layout);
		GridBagConstraints gbc = new GridBagConstraints();
		
		
		//Label
		gbc.gridx = 0;
		gbc.gridy = 1;
		gbc.gridwidth = 1;
		gbc.gridheight = 1;
		gbc.fill = GridBagConstraints.HORIZONTAL;
		gbc.weightx = 1;
		gbc.weighty = 1;
		JLabel label = new JLabel("Aktuelle Information:");
		layout.setConstraints(label, gbc);
		contentPane.add(label);
		label.setVisible(true);
		
		//Textfeld
		gbc.gridx = 0;
		gbc.gridy = 2;
		gbc.gridwidth = 1;
		gbc.gridheight = 4;
		gbc.fill = GridBagConstraints.BOTH;
		gbc.weightx = 2;
		gbc.weighty = 4;
		//Erstellen und Einbinden des Textfeldes
		textfeld = new JTextField();
		layout.setConstraints(textfeld, gbc);
		contentPane.add(textfeld);
		//Versehen des Textfeldes mit ScrollPanes
		JScrollPane scrollPane = new JScrollPane(textfeld);
		scrollPane.setVerticalScrollBarPolicy(
			JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);
		scrollPane.setHorizontalScrollBarPolicy(
			JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
		layout.setConstraints(scrollPane, gbc);
		contentPane.add(scrollPane);
		textfeld.getDocument().addDocumentListener(dltextfeld);
		textfeld.disable();
		textfeld.setVisible(true);
		
		
		//Button zum Anzeigen der Information
		gbc.gridx = 0;
		gbc.gridy = 6;
		gbc.gridwidth = 1;
		gbc.gridheight = 1;
		gbc.fill = GridBagConstraints.HORIZONTAL;
		gbc.weightx = 2;
		gbc.weighty = 1;
		JButton anzeigebutton = new JButton("Information anzeigen");
		anzeigebutton.addActionListener(alAnzeigebutton);
		layout.setConstraints(anzeigebutton, gbc);
		contentPane.add(anzeigebutton);
		anzeigebutton.setVisible(true);
		
		
		//Speicherbutton
		gbc.gridx = 0;
		gbc.gridy = 7;
		gbc.gridwidth = 1;
		gbc.gridheight = 1;
		gbc.fill = GridBagConstraints.HORIZONTAL;
		gbc.weightx = 2;
		gbc.weighty = 1;
		JButton speicherbutton = new JButton("in Datei speichern");
		speicherbutton.addActionListener(alSpeicherbutton);
		layout.setConstraints(speicherbutton, gbc);
		contentPane.add(speicherbutton);
		speicherbutton.setVisible(true);
		
		
		
		//Display
		gbc.gridx = 1;
		gbc.gridy = 1;
		gbc.gridwidth = 10;
		gbc.gridheight = 7;
		gbc.fill = GridBagConstraints.BOTH;
		gbc.weightx = 5;
		gbc.weighty = 2;

		//Erstellen und Einbinden des Displays
		Display display = new Display();
		layout.setConstraints(display, gbc);
		contentPane.add(display);
		
		display.repaint();
		display.setVisible(true);
		
}

In der Klasse "Display" wiederum werden verschiedene Komponenten gezeichnet (in der Methode "paintComponent (Graphics g)"), im Einzelnen handelt es sich um ein Rechteck ('punkterechteck') und ein Array voller Punkte (genau genommen 3600 Punkten)(Array 'punkte').

Java:
public void paintComponent (Graphics g){
	

		super.paintComponent(g);
		
		Graphics2D g2 = (Graphics2D)g;
		g2.setColor(Color.black);
		g2.setStroke(new BasicStroke(2.0f, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND));
		
	
		g2.drawRect((int)punkterechteck[0].xkoordinate,(int)punkterechteck[0].ykoordinate, breite, hoehe);
		
		[COLOR="Red"]for(int x = 0; x< punkte.length; x++){
		    g2.drawLine((int)punkte[x].xkoordinate,(int)punkte[x].ykoordinate, (int)punkte[x].xkoordinate,(int)punkte[x].ykoordinate);
	    }[/COLOR]
	
		
	}

Die Punkte sowie das Rechteck werden im Display auch korrekt angezeigt, allerdings werden die anderen, außerhalb des Displays liegenden Komponenten des JFrames 'Hauptfenster' nicht korrekt, bzw. gar nicht angezeigt. Erst wenn ich zur Laufzeit dahin klicke, wo das Textfeld und die Buttons lokalisiert sind, werden sie angezeigt. Das Label wird überhaupt nicht angezeigt.

Woran kann das liegen? Habe schon mit Validate(), Revalidate() und Repaint() herumexperimentiert, ohne Erfolg 🙁

Wenn ich übrigens den rot markierten Teil der Methode 'paintComponent' auskommentiere und dementsprechend die Punkte nicht anzeige und nur das Rechteck, besteht das Problem nicht mehr und alle Komponenten des JFrames, bzw. des GridBagLayouts werden angezeigt.


Ich hoffe, ich habe das Problem halbwegs verständlich geschildert und ich hoffe, dass mir jemand von Euch helfen kann.

Vielen Dank schon einmal im Voraus.
 
Hab jetzt Deinen Code nur überflogen und konnte da jetzt nichts auffälliges finden (ausser die vielen setVisible() auf die einzelnen Komponenten - die sind bei der Initialisierung automatisch sichtbar).
Habe aber ein paar allgemeine Fragen:
Tritt das Problem tatsächlich nur im Zusammenhang mit dem GridBagLayout auf?
Funktioniert es wenn in der Display Komponente nur eine einzige Linie gezeichnet wird?

Vermute mal, das wenn in der paintComponent() ziemlich viel gezeichnet wird, der EDT ausgebremst wird.
Wenn dem so ist, dann wurde ich diese Sachen in einem ausgelagerten Thread auf ein BufferedImage zeichnen und in der paintComponent() dann einfach nur das Bild zeichnen lassen.
 
Hallo Michael...,

vielen Dank erstmal für Deine schnelle Antwort.

Habe erstmal getestet, ob das Problem bei nur einem Punkt (ist zwar Methode 'drawLine', zeichnet aber nur einen Punkt, geht ja bekanntermaßen in Java nicht anders) auch auftritt. Und das Ergebnis ist, dass es dann einwandfrei funktioniert. Ebenso, wenn ich z.B zwei einzelne Punkte zeichne.

Habe außerdem jetzt festgestellt, dass ich, wenn das Problem auftritt, parallel eine java.lang.NullPointerException auf genau diese Codezeile kriege.

Vielleicht liegt mein Problem ja auch in der for-Schleife. Ich werde nochmal das Array 'punkte' unter die Lupe nehmen müssen.

Könnte es denn tatsächlich sein, dass sich eine NullPointerException im Display so auswirkt, dass Komponenten, die eigentlich nichts mit dem Display zu tun haben, nicht vernünftig angezeigt werden?
 
Hallo Michael...,

das Problem ist gelöst.:toll:
Ich habe das Array 'punkte' nochmal auf Korrektheit überprüft und es war tatsächlich ein Fehler verborgen, der aber sehr schwer zu finden war.

Um meine eigene letzte Frage zu beantworten, es ist offensichtlich tatsächlich so, dass ein solcher Fehler verbunden mit einer NullPointerException die Darstellung anderer Komponenten beeinflusst. Ob das aber am GridBagLayout liegt, weiß ich nicht.

Ich danke Dir vielmals für Deine Hilfe. Besonders Deine Nachfrage, ob das Problem auch bei einem einzigen drawLine- Befehl auftritt, hat mich auf den richtigen Weg gebracht.

Vielen Dank und schöne Grüße,

bauklotz
 

Zurück
Oben