Swing Repaint Problem - mal wieder

blauerninja

Mitglied
Hallo,
ich hab in den Weiten des Webs keine Lösung für mein Problem gefunden, dh. die Lösung funktioniert nicht, finden tut man viel. Es geht mal wieder um das leidige Thema repaint().

Mein Szenario:
Beim Spielstart wird das Hauptfenster StartFrame gestartet. Dieses hat 2 JPanels einen oberen für die Graphik und einen unten für die Steuerungselemente, die aber von außen gesetzt werden, da sie im Spielvelauf ausgetauscht werden sollen. So weit so gut. Was nicht funktioniert, ist, dass ich dem StartFrame ein JPanel zuweise, dieses trotz
Code:
validate()
und
Code:
repaint()
nicht angezeigt wird.

Dazu der Code:

Java:
package game.gui;


import java.awt.BorderLayout;

import javax.swing.JFrame;
import javax.swing.JPanel;

@SuppressWarnings("serial")
public final class StartFrame extends JFrame {
  public static final int WIDTH  = 480;
  public static final int HEIGHT = 320;

  private static final String TITLE = "RPG Game";
  private static final StartFrame FRAME = new StartFrame();

  private JPanel screen;
  private JPanel touchScreen;


  private StartFrame() {
    this.setSize(WIDTH, 2*HEIGHT);
    this.setLocationRelativeTo(null);
    this.setTitle(TITLE);
    this.setResizable(false);
    this.setUndecorated(true);
    this.screen = new JPanel(); [COLOR="Green"]// Hier werden sie schon mal instatiiert[/COLOR]
    this.touchScreen = new JPanel();
    this.add(this.screen, BorderLayout.NORTH);
    this.add(this.touchScreen, BorderLayout.SOUTH);
    this.setVisible(true);
  }


  public static void initialize() { }


  public static void setMainScreen(JPanel panel) {
    FRAME.screen = panel;
   // FRAME.screen.validate();
   // FRAME.screen.repaint();
    FRAME.validate(); [COLOR="Green"]// Sollte doch reichen - oder?[/COLOR]
    FRAME.repaint();
  }


  public static void setTouchScreen(JPanel panel) {
    FRAME.touchScreen = panel; [COLOR="Green"]// Wird wie setMainScreen() sein, wenn es oben funktioniert[/COLOR]
  }
}
Java:
package game;


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

import javax.swing.JLabel;
import javax.swing.JPanel;

import game.gui.StartFrame;

// Viel Testcode
public final class Game {
  public static void main(String[] args) throws Exception {
    StartFrame.initialize();

    System.out.println("Sleep");
    Thread.sleep(2000);

    System.out.println("Set new panel");

    JPanel panel = createPanel();
    panel.setBackground(new Color(255, 200, 200));
    StartFrame.setMainScreen(panel);

    System.out.println("Finished");
  }


  private static JPanel createPanel() {
    Dimension size = new Dimension(StartFrame.WIDTH, StartFrame.HEIGHT);
    JPanel panel = new JPanel();
    panel.setSize(size);
    panel.setPreferredSize(size); [COLOR="Green"]// Erzwingt, dass das Panel so groß ist, wie das Fenster (mit halber Höhe)[/COLOR]

    [COLOR="Green"]// Ein bisschen was zum Füllen[/COLOR]
    for (int i = 0; i < 20; i++) {
      panel.add(new JLabel("                                                                                                  " + i));
    }
    return panel;
  }
}

Da ich ein neues
Code:
Component
dem Fenster hinzufüge, so muss doch
Code:
validate()
und
Code:
repaint()
reichen. Oder lieg ich falsch? (OK, ich weiß ich lieg falsch, aber wo?)

Hoffe, dass jemand es besser weiß, als ich und sorry, für die Umstände.
 
S

SlaterB

Gast
ein Attribut deiner Klasse neu zuzuweisen hat wenig Auswirkung,
da kannst du dir auch einen Kassenbon ins Portmonnaie legen und hast trotzdem keine neuen Reifen am Auto

lasse screen bestehen,
add()e dein Paramter-Panel in screen hinein,
falls zu vermuten ist, dass schon was drin war, alles vorherige mit removeAll() entfernen

evtl. noch experimentieren ob screen ein anderes Layout braucht, damit alles gut klappt

validate() + repaint() auf das JFrame ist genau mein Vorschlag, richtig
 

blauerninja

Mitglied
Super, funktioniert. Was ich aber noch nicht ganz verstehe: wieso funktioniert es nicht, wenn ich einfach die Variable neu referenziere? Die validate() sorgt doch dafür, dass der Frame seine Komponenten auf Änderung prüft. Wird dabei nur geprüft, ob Komponenten hinzugefügt oder entfernt wurden? Sprich wenn ich keine add() oder remove() aufrufen, passiert nichts?
 

Michael...

Top Contributor
Was ich aber noch nicht ganz verstehe: wieso funktioniert es nicht, wenn ich einfach die Variable neu referenziere?
Grundsätzlich finde ich den gesamten Code eher etwas fragwürdig.
In einem graphischen Komponente (z.B. JFrame) sind keine Variablen verbaut, sondern weitere graphische Komponenten (z.B. JPanel, JButton...). Nur weil dann eine Variable - die vorher genutzt wurde, um ein JPanel auf das sie (zum damaligen Zeitpunkt) referenziert, im JFrame zu verbauen - jetzt auf eine andere Komponente verweist, heißt das ja nicht, das diese Komponente automatisch im JFrame verbaut wird.
Die Variable ist ja nur ein Hilfsmittel um das Objekt zu "greifen". Wenn Du einen Hund an der Leine in einen Zwinger führst und die Leine abmachst und an einem anderen Hund einhakst, ist dieser ja nicht automatisch im Zwinger.
Die validate() sorgt doch dafür, dass der Frame seine Komponenten auf Änderung prüft. Wird dabei nur geprüft, ob Komponenten hinzugefügt oder entfernt wurden? Sprich wenn ich keine add() oder remove() aufrufen, passiert nichts?
Genau, denn ohne ein add oder ein remove hat sich ja am Frame und seinen Komponenten nichts geändert.
 

blauerninja

Mitglied
Puh, jetzt funktioniert es nicht mehr. Habs auf ohne Variablen umgestellt und beim Ausführen wird kein Panel angezeigt. Keine Ahnung wieso.

Java:
package game.gui;


import javax.swing.JFrame;
import javax.swing.JPanel;

@SuppressWarnings("serial")
public final class GameFrame extends JFrame {
  public static final int WIDTH  = 480;
  public static final int HEIGHT = 320;

  private static final String TITLE = "RPG Game";
  private static final GameFrame FRAME = new GameFrame();


  private GameFrame() {
    this.setSize(WIDTH, HEIGHT);
    this.setLocationRelativeTo(null);
    this.setTitle(TITLE);
    this.setResizable(false);
    this.setUndecorated(true);
    this.setVisible(true);
  }


  public static void initialize() { }


  public static void setScreen(JPanel screen) {
    FRAME.removeAll();
    FRAME.add(screen);
    FRAME.validate();
    FRAME.repaint();
  }
}
Java:
package game;


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

import javax.swing.JLabel;
import javax.swing.JPanel;

import game.gui.GameFrame;

public final class Game {
  public static void main(String[] args) throws Exception {
    GameFrame.initialize();

    System.out.println("Sleep");
    Thread.sleep(2000);
    System.out.println("New Panel");

    JPanel panel = new JPanel();
    panel.setBackground(new Color(255, 200, 200));
    panel.setPreferredSize(new Dimension(GameFrame.WIDTH, GameFrame.HEIGHT));
    panel.add(new JLabel(panel.getSize().toString()));
    GameFrame.setScreen(panel);

    System.out.println("Finished");
  }
}

Die
Code:
setScreen()
wird aufgerufen und abgearbeitet. Wo soll ein Fehler sein?
???:L:shock:

=============

Ok, bissl versucht den Fehler zu finden. Folgendes kam raus:
hab vor der Änderung das Frame erstmal mit
Code:
setVisible(false)
versteckt und nach der Änderung wieder angezeigt.
Das Panel wird entfernt, das neue wird nicht eingefügt. Sodann wird das Fenster auf Minimalgröße verkleinert.
Und somit nur noch mehr Rätsel. :bahnhof:

====
Toll, jetzt funktioniert es mit Variablen auch nicht. ;(
Ein Component wurde aber hinzugefügt, was man mit
Code:
getComponentCount()
prüfen kann. Dennoch wird es nicht angezeigt. zefix nochmal.
 
Zuletzt bearbeitet:

blauerninja

Mitglied
Ok, hab den Fehler gefunden. Und darüber hinaus darf man bei der Methode ohne Variablen die
Code:
removeAll()
vom
Code:
JFrame
nicht, ich betone NICHT!!! aufrufen, sonst wird keine Komponente mehr hinzugefügt. Stattdessen muss man mit
Code:
FRAME.getContentPane().removeAll()
arbeiten. Dann funktioniert alles wie gewünscht^^

Ein großes Danke an alle.
 
Zuletzt bearbeitet:
Ähnliche Java Themen
  Titel Forum Antworten Datum
A Problem: repaint() - Schleife AWT, Swing, JavaFX & SWT 3
Ernesto95 AnimationLoop - Problem bei Aufruf von repaint AWT, Swing, JavaFX & SWT 6
P EDT Problem? Kein Aufruf der repaint Methode AWT, Swing, JavaFX & SWT 6
kodela Problem mit repaint() AWT, Swing, JavaFX & SWT 3
H repaint()-Problem - 50% CPU-Auslastung AWT, Swing, JavaFX & SWT 4
T repaint() Problem AWT, Swing, JavaFX & SWT 2
K Jpanel repaint problem (Fullscreen) AWT, Swing, JavaFX & SWT 5
E AWT Problem mit Repaint (in Loop oder Timer) AWT, Swing, JavaFX & SWT 3
J Swing Verständnis-Problem repaint(int x,int y,int width,int height) AWT, Swing, JavaFX & SWT 3
J [gelöst] repaint problem AWT, Swing, JavaFX & SWT 2
M problem mit repaint()-Methode[gelöst] AWT, Swing, JavaFX & SWT 8
G problem mit threads/repaint ! AWT, Swing, JavaFX & SWT 2
D Problem mit Netbeans und repaint() AWT, Swing, JavaFX & SWT 5
E Problem mit repaint() AWT, Swing, JavaFX & SWT 11
K Problem mit JLabel, Rechteck, repaint() ;) AWT, Swing, JavaFX & SWT 2
K Problem repaint()->paintComponent AWT, Swing, JavaFX & SWT 9
M Problem bei Repaint von Panels AWT, Swing, JavaFX & SWT 2
L Swing repaint problem AWT, Swing, JavaFX & SWT 7
B Problem bei repaint AWT, Swing, JavaFX & SWT 5
V repaint problem AWT, Swing, JavaFX & SWT 12
A Repaint-Problem AWT, Swing, JavaFX & SWT 4
S repaint()-Problem AWT, Swing, JavaFX & SWT 6
S Repaint()-Problem im GBL? AWT, Swing, JavaFX & SWT 5
S paint/repaint problem mit awt/swing? AWT, Swing, JavaFX & SWT 2
L repaint()-Problem AWT, Swing, JavaFX & SWT 18
D Repaint Funktioniert nicht AWT, Swing, JavaFX & SWT 2
D JUNG Repaint function does not work AWT, Swing, JavaFX & SWT 2
E repaint Probleme AWT, Swing, JavaFX & SWT 13
G listener repaint() - verschiedene Darstellung AWT, Swing, JavaFX & SWT 24
ExceptionOfExpectation Textdarstellung auf einem Canvas mit Hilfe von repaint(); AWT, Swing, JavaFX & SWT 6
J actionperformed wird nicht aufgerufen/ repaint() AWT, Swing, JavaFX & SWT 6
L Swing repaint() ruft paintComponent(g1d) nicht auf AWT, Swing, JavaFX & SWT 12
G Repaint wird nicht durchgeführt AWT, Swing, JavaFX & SWT 8
I Swing Verhindern, dass repaint() kaskadiert AWT, Swing, JavaFX & SWT 6
ms_cikar Update swingUtilities Repaint in der Schleife AWT, Swing, JavaFX & SWT 3
T Swing Probleme mit repaint() bzw. JScrollPane AWT, Swing, JavaFX & SWT 7
N Swing JButtons werden nach repaint() doppelt dargestellt AWT, Swing, JavaFX & SWT 12
K Methode repaint() AWT, Swing, JavaFX & SWT 1
B Swing Wann brauche ich repaint() ? AWT, Swing, JavaFX & SWT 1
javampir Swing repaint in JavaFX Anwendung AWT, Swing, JavaFX & SWT 3
A repaint(); AWT, Swing, JavaFX & SWT 9
J Swing ungewünschter Nebeneffekt bei der repaint() Methode AWT, Swing, JavaFX & SWT 3
S 2D-Grafik repaint()-Aufruf. Und nichts geschieht. AWT, Swing, JavaFX & SWT 5
Joew0815 JDialog repaint() funktioniert nicht wie gewünscht. AWT, Swing, JavaFX & SWT 2
P JPanel und Repaint AWT, Swing, JavaFX & SWT 5
J JavaFX Automatisches Neuzeichnen ("Repaint") abstellen. AWT, Swing, JavaFX & SWT 10
F JTable Repaint Issue AWT, Swing, JavaFX & SWT 1
N Observer: update ruft nicht repaint auf AWT, Swing, JavaFX & SWT 0
C Repaint() funktioniert nicht in TabbedPanel AWT, Swing, JavaFX & SWT 5
S JList repaint AWT, Swing, JavaFX & SWT 1
L NullpointerException und Probleme mit repaint() AWT, Swing, JavaFX & SWT 11
M Repaint mittels Button richtig aufrufen klappt nicht AWT, Swing, JavaFX & SWT 1
B Repaint auf JFrame, JLabel und ImageIcon AWT, Swing, JavaFX & SWT 4
K 2D-Grafik Paint - Wie binde ich repaint ein? AWT, Swing, JavaFX & SWT 8
D repaint() klappt anders als vorgestellt AWT, Swing, JavaFX & SWT 15
R Repaint() in Schleifen, Threads AWT, Swing, JavaFX & SWT 13
P 2D-Grafik Gezielter Repaint einzelner Frames in Java-Game AWT, Swing, JavaFX & SWT 6
javampir Bei repaint nix los AWT, Swing, JavaFX & SWT 2
B Swing repaint() AWT, Swing, JavaFX & SWT 3
P 2D-Grafik repaint(); steigender RAM Verbauch AWT, Swing, JavaFX & SWT 6
Y KeyListener, GUI Thread, repaint AWT, Swing, JavaFX & SWT 7
S Applet Repaint AWT, Swing, JavaFX & SWT 3
M Programm hängt sich auf nachdem repaint() benutzt wurde AWT, Swing, JavaFX & SWT 2
R Swing Grafikfehler bei repaint AWT, Swing, JavaFX & SWT 2
N repaint() blockieren AWT, Swing, JavaFX & SWT 6
K canvas zeig nach repaint nichts an AWT, Swing, JavaFX & SWT 8
M Repaint() AWT, Swing, JavaFX & SWT 14
J Swing repaint, repaint, repaint AWT, Swing, JavaFX & SWT 8
M Applet repaint() verlangsamen AWT, Swing, JavaFX & SWT 7
R paintComponent malt bei repaint() Rahmen um Panel AWT, Swing, JavaFX & SWT 7
V Applet JApplet Flackern durch Repaint AWT, Swing, JavaFX & SWT 11
N Swing Funktion repaint() updated nicht AWT, Swing, JavaFX & SWT 5
F repaint reagiert nicht AWT, Swing, JavaFX & SWT 8
S AWT Probleme mit repaint() AWT, Swing, JavaFX & SWT 2
D Repaint()? Oder was??? AWT, Swing, JavaFX & SWT 5
M Eine nicht korrekte Darstellung bei repaint() warum? AWT, Swing, JavaFX & SWT 4
T 2D-Grafik Kreis "von Hand" zeichnen -> jedesmal repaint()? AWT, Swing, JavaFX & SWT 6
R validate(), repaint funktionieren nicht! AWT, Swing, JavaFX & SWT 7
B AWT Canvas überdeckt nach repaint() JComboBox-Optionen AWT, Swing, JavaFX & SWT 2
B Swing verschachteltes GUI: repaint() ändert mehr als nur gewünschte Component AWT, Swing, JavaFX & SWT 4
S validate(), invalidate(), repaint(),... Was kommt wann? AWT, Swing, JavaFX & SWT 5
M 2D-Grafik repaint() löscht altes Bild nicht AWT, Swing, JavaFX & SWT 2
J repaint() nicht richtig? AWT, Swing, JavaFX & SWT 6
R repaint erzwingen AWT, Swing, JavaFX & SWT 3
Zettelkasten repaint() von anderen Klassen aufrufen AWT, Swing, JavaFX & SWT 4
P repaint während Thread läuft AWT, Swing, JavaFX & SWT 9
D Repaint Frage, Design Frage AWT, Swing, JavaFX & SWT 2
N Swing MainWindow(JFrame) aktualisieren(neuzeichnen) repaint AWT, Swing, JavaFX & SWT 4
A 2D-Grafik Repaint - Alternative? AWT, Swing, JavaFX & SWT 3
C JLabel, JTextArea, JScrollPane. repaint(); ? AWT, Swing, JavaFX & SWT 6
N Swing repaint() funktioniert nicht AWT, Swing, JavaFX & SWT 5
T Swing repaint funktioniert nur manchmal? AWT, Swing, JavaFX & SWT 6
V Swing Bei repaint() tut sich nichts AWT, Swing, JavaFX & SWT 7
G ColorReader, bei Fadenkreuz zeichnen mit repaint() flackern AWT, Swing, JavaFX & SWT 19
I Canvas Repaint Probleme AWT, Swing, JavaFX & SWT 2
D Swing Actionlistener verhindert repaint?! AWT, Swing, JavaFX & SWT 2
S JLabel repaint AWT, Swing, JavaFX & SWT 8
C Swing Linux mag mein Swing-repaint() nicht... AWT, Swing, JavaFX & SWT 7
J Swing paintComponent() - repaint() - BufferedImage anzeigen AWT, Swing, JavaFX & SWT 5
Luk10 repaint() auch in anderen Klassen! AWT, Swing, JavaFX & SWT 6

Ähnliche Java Themen

Neue Themen


Oben