PaintComponent

Morpe

Mitglied
Grundsätzlich ist mein Problem, dass wenn ich mit Graphics auf einem JFrame arbeite, die zu zeichnenden Dinge nicht beim erstellen des JFrames gezeichnet werden, sondern erst wenn ich per Mausklick die Größe des JFrames verändere.

In diesem Fall möchte ich einem JFrame ein Hintergrundbild geben.
Java:
public class GUI extends JFrame{

    private JMenuBar menuBar;
    private JMenuItem beenden;
    private ImageComponent background;

    public GUI(){
        //JFrame erzeugen
        this.getContentPane().setLayout(null);
        this.setDefaultCloseOperation(this.EXIT_ON_CLOSE);
        this.setBackground(new Color(0,0,0));
        this.setSize(1000,740);
        //In der Mitte des Bildschirms platzieren
        this.setLocation((Toolkit.getDefaultToolkit().getScreenSize().width-
                          this.getSize().width) / 2,
                         (Toolkit.getDefaultToolkit().getScreenSize().height-
                          this.getSize().height) / 2);
        init();
        this.setVisible(true);


    }


    public void init(){
        menuBar = new JMenuBar();
        menuBar.setBackground(Color.black);
            beenden = new JMenuItem("Beenden");
        menuBar.add(new JMenu("Datei")).add(beenden);
        this.setJMenuBar(menuBar);

        background = new ImageComponent("Hintergrund.png");
        background.setBounds(0, 0, 1000, 700);
        background.setVisible(true);
        this.add(background);

Das Bild soll nach Möglichkeit über ein ImageComponent Objekt erstellt werden.

Java:
public class ImageComponent extends JComponent {

      private Image image;

      public ImageComponent(String path){
          image = Toolkit.getDefaultToolkit().getImage(path);
      }

      public ImageComponent(File file){
          image = Toolkit.getDefaultToolkit().getImage(file.getAbsolutePath());
      }

      @Override
      public void paintComponent( Graphics g ){
        if ( image != null )
          g.drawImage( image, 0, 0, null );
      }

}

Die Methode paintComponent wird leider erst aufgerufen, wenn ich das erstellte JFrame per Mausklick verändere.
Es wäre super wenn mir jemand helfen könnte ;)
 

Morpe

Mitglied
Das habe ich bereits versucht. Ich habe repaint() an alle möglichen Stellen getan, zb in den Konstruktor vom ImageComponent. Die Methode setVisible() vom JFrame zu verschieben ändert ebenfalls nichts.
 

XHelp

Top Contributor
Versuch mal dein Bild mit
Code:
ImageIO.read
zu laden oder bei drawImage
Code:
this
statt
Code:
null
anzugeben.
 

Morpe

Mitglied
Sehr Interessant, mit this funktioniert es tatsächlich. Zuvor hatte ich schon einmal "this" in g.drawImage() stehen, damals funktionierte es nicht. Ich hatte dort das Bild nicht im Konstruktor, sondern in einer extra Methode geladen und daraufhin ein repaint gesetzt nach dem Vorbild von "Java ist auch eine Insel".

Als Zusatz fände ich es toll ,wenn mir jemand erklären könnte warum dies alles so ist. ;)
 

Morpe

Mitglied
Leider habe ich nun ein neues Problem. Das Hintergrundbild soll in einem CardPanel dargestellt werden.

Java:
    public void init(){
        menuBar = new JMenuBar();
        menuBar.setBackground(Color.black);
            beenden = new JMenuItem("Beenden");
        menuBar.add(new JMenu("Datei")).add(beenden);
        this.setJMenuBar(menuBar);

        background = new ImageComponent("Hintergrund.png");
        background.setBounds(0, 0, 1000, 700);
        background.setVisible(true);

        pIntro = new JPanel();
        pIntro.setBounds(0, 0, 1000, 700);
        pIntro.add(background);
        pIntro.setVisible(true);

        cardPanel = new JPanel();
        CardLayout cardLayout = new CardLayout();
        cardPanel.setLayout(cardLayout);
        cardPanel.setBounds(0, 0, 1000, 700);

            cardPanel.add(pIntro, "Intro");

        cardLayout.show(cardPanel, "Intro");
        cardPanel.setVisible(true);
        this.add(cardPanel);


    }

Ansonsten ist der Code wie zuvor.
 

XHelp

Top Contributor
Als Zusatz fände ich es toll ,wenn mir jemand erklären könnte warum dies alles so ist
Da muss ich passen. Meine Kentnisse in Java+Grafik halten sich ziemlich in Grenzen für eine exakte Begründung. Ich kann mir Vorstellen, dass es hier um Timing geht. Wenn das Bild beim ersten Mal gemalt wird, dann stehen noch nicht alle Informationen zur Verfügung. Bei ImageIO bekommst du ja ein BufferedImage zurück, was die Sache etwas verändert. Bei der Variante mit dem ImageObserver ähnliche geschichte - da wird die Komponente benachricht, wenn die Informationen/Bild da ist und kann es dann neuzeichnen.
 

XHelp

Top Contributor
Wenn du schon mit setBounds etc arbeitest, dann solltest du auch
Code:
pIntro.setLayout(null);
machen. Oder eben dir ein vernünftiges Layout machen und nicht mit komischen Zahlen und null-Layout arbeiten.
 

Marco13

Top Contributor
Als (vereinfachte) Erklärung: Das Bild wird schon zurückgegeben, auch wenn es noch nicht vollständig geladen ist. Diese API ist IMHO ... ja, schon fast eine "Altlast", heute mit ImageIO ist das eigentlich nicht mehr relevant. Andernfalls (und ggf. auch wenn es um "große" Dateien geht) könnte man mit einem MediaTracker (Java Platform SE 6) darauf warten, dass es fertig geladen ist.
 

Morpe

Mitglied
Wenn du schon mit setBounds etc arbeitest, dann solltest du auch
Code:
pIntro.setLayout(null);
machen. Oder eben dir ein vernünftiges Layout machen und nicht mit komischen Zahlen und null-Layout arbeiten.

Habe deinen Rat befolgt, und siehe da es funktioniert. Alles wird direkt geladen.

Mit dem MediaTracker werde ich mich dann mal beschäftigen, wen nich erneut Probleme in dem Bereich habe ;).
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
C Probleme mit paintComponent Java Basics - Anfänger-Themen 13
F Java GUI-PaintComponent funktioniert nicht Java Basics - Anfänger-Themen 1
H Programmaufbau in Ordnung? Problem mit paintComponent() Java Basics - Anfänger-Themen 10
I Methoden public void paintComponent (Graphics g) Java Basics - Anfänger-Themen 4
S Rectangles ausserhalb der paintComponent drawen! Java Basics - Anfänger-Themen 9
M Problem mit paintComponent Java Basics - Anfänger-Themen 6
J Wer oder was ruft die "paintComponent()" Methode auf? Java Basics - Anfänger-Themen 19
K paintComponent Java Basics - Anfänger-Themen 23
K paintComponent Java Basics - Anfänger-Themen 9
G paintComponent wird nicht ausgeführt Java Basics - Anfänger-Themen 4
kulturfenster paintComponent wird nicht aufgerufen Java Basics - Anfänger-Themen 16
kulturfenster Frage bez paintComponent Java Basics - Anfänger-Themen 5
kulturfenster super.paintComponent(g); Java Basics - Anfänger-Themen 3
G fehler bei paintComponent Java Basics - Anfänger-Themen 6
kulturfenster paintComponent und Timer Java Basics - Anfänger-Themen 2
W Weitere Parameter in die paintComponent()-Methode übergeben? Java Basics - Anfänger-Themen 7
ElViZ paintComponent in den Vordergrund? Java Basics - Anfänger-Themen 2
F paintComponent mit repaint() aufrufen Java Basics - Anfänger-Themen 27
M paintComponent() in abstrakter und vererbender Klasse Java Basics - Anfänger-Themen 3
G paintComponent(Graphics g) Java Basics - Anfänger-Themen 2
V KSKB zum Verständnis von Graphics und paintComponent Java Basics - Anfänger-Themen 6
G paintComponent neu zeichnen Java Basics - Anfänger-Themen 5
S paintComponent, neue Instanz überschreibt wohl alte Instanz Java Basics - Anfänger-Themen 6
G Exception in PaintComponent Java Basics - Anfänger-Themen 2
U BufferedImage anzeigen, imageIcon oder paintComponent(); Java Basics - Anfänger-Themen 6
G probleme mit paintComponent Java Basics - Anfänger-Themen 14
M Probleme mit JPanel und paintComponent Java Basics - Anfänger-Themen 3

Ähnliche Java Themen

Neue Themen


Oben