2016-04-25 14 views
0

Ich habe folgendes Programm. Es soll roten Text auf grünem Grund drucken. Wenn das Programm geöffnet wird, sehe ich nur den grünen Hintergrund, aber nicht den roten Text darauf. Sobald die Größe des Fensters geändert und neu berechnet wurde, erscheint der rote Text.Java Swing.JFrame zeichnet nur Inhalt auf die Größe des Fensters

Es funktioniert ordnungsgemäß, wenn ich ein JPanel innerhalb des Fensters verwenden und dort eine Komponente hinzufügen. Wenn die Farben in paintComponent eingestellt sind, funktioniert alles einwandfrei.

Also wo ist das Problem, wenn ich direkt auf den JFrame zeichne. Fehle ich ein erstes "Update" oder etwas? Es sieht so aus, als ob beim ersten Zeichnen des Fensters (dem zusätzlichen Text) einige Informationen fehlen, von denen das Programm erst erfährt, wenn das Fenster neu berechnet und neu gezeichnet wird.

import java.awt.Color; 
import java.awt.Graphics; 
import javax.swing.JFrame; 

public class PaintAWT extends JFrame { 

    PaintAWT() { 
     this.setSize(600, 400); 
     this.setLocationRelativeTo(null); 
     this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     this.setVisible(true); 
    } 

    @Override 
    public void paint(Graphics g) { 
     super.paint(g); 

     // Set background color: 
     // If you don't paint the background, one can see the red text. 
     // If I use setBackground I only see a green window, until it is 
     // resized, then the red text appears on green ground 
     this.getContentPane().setBackground(new Color(0,255,0)); 

     // Set color of text 
     g.setColor(new Color(255,0,0)); 

     // Paint string 
     g.drawString("Test", 50, 50); 
    } 

    public static void main(String[] args) { 
     new PaintAWT(); 
    } 

} 
+1

Für den Anfang sollten Sie 'paintComponent' überschreiben, nicht' paint'. Und ich empfehle persönlich, ein 'JPanel' anstelle des' JFrame' zu ​​verlängern. Sie müssen auch eine Möglichkeit haben, den Aufruf von 'repaint' zu steuern, da der Container durch die Logik von Swing normalerweise nur dann neu gezeichnet wird, wenn es erforderlich ist (z. B. wenn Sie die Größe des Fensters ändern). – Gorbles

Antwort

4

Sie sollten keine Eigenschaften einer Komponente in einer Malmethode einstellen. Malmethoden sind nur zum Malen. Verwenden Sie nicht setBackground().

Sie sollten den Hintergrund des Inhaltsbereichs festlegen, wenn Sie den Rahmen erstellen.

Immer wenn Sie benutzerdefinierte Bemalung durchführen, sollten Sie auch die getPreferredSize() Methode überschreiben, um die Größe der Komponente zurückzugeben.

Sie sollten JFrame auch nicht erweitern. Sie erweitern nur eine Klasse, wenn Sie der Klasse Funktionen hinzufügen.

Beginnen Sie mit dem Lesen des Abschnitts aus dem Swing-Lernprogramm unter Custom Painting für weitere Informationen und Arbeitsbeispiele. Die Beispiele zeigen Ihnen, wie Sie Ihren Code besser strukturieren können, um den Swing-Konventionen zu folgen.

2

Sie sollten setBackground in den Konstruktor verschieben. Die Einstellung des Hintergrunds in der Malmethode ist ein schlechter Ansatz.

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

import javax.swing.JFrame; 
import javax.swing.SwingUtilities; 

public class PaintAWT extends JFrame { 

    PaintAWT() { 
     this.setSize(600, 400); 
     this.setLocationRelativeTo(null); 
     this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     // Set background color: 
     // If you don't paint the background, one can see the red text. 
     // If I use setBackground I only see a green window, until it is 
     // resized, then the red text appears on green ground 
     this.getContentPane().setBackground(new Color(0,255,0)); 
     this.setVisible(true); 
    } 

    @Override 
    public void paint(Graphics g) { 
     super.paint(g); 


     // Set color of text 
     g.setColor(new Color(255,0,0)); 

     // Paint string 
     g.drawString("Test", 50, 50); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       new PaintAWT(); 
      } 
     }); 
    } 

} 
+1

Sie sollten JFrame nicht erweitern, um eine benutzerdefinierte Bemalung durchzuführen. Du solltest nicht die Farbe überschreiben(). – camickr

+0

Wie wäre es, die Hintergrundfarbe dann zu ändern? Wenn ich es in den Konstruktor statt in die Paint-Methode lege, ist es behoben, oder? – Fuzzzzel

Verwandte Themen