Game of Life - PaintComponent-Problem / Timer?

papabaer1707

Aktives Mitglied
Ich habe mich mal an dem (alten) Game of Life probiert ... aber einige Probleme damit. Im Grunde bin ich (als Anfänger) schon ganz zufrieden damit, nur möchte ich einige Probleme beheben bzw. Dinge optimieren:

1.
Es gibt noch ein Problem mit der Grafik: Bei Start sehe ich kurz das Spielfeld, das wird aber gleich wieder gelöscht? Ich hatte erst probiert, das Problem mit paint() zu lösen ... das Ergebnis war identisch. Bei jedem Aufruf der paintComponent wird das Graphics gesucht; das ist hier zwar relativ unwichtig, aber ist es nicht besser (möglich) das Ding nur einmal zu bestimmen?

2.
Auch wenn dieses Forum dafür falsch ist (wills nur nicht doppelt einstellen): im Moment komme ich durch Anklicken eines Buttons in das nächste Leben - ein Timer wäre schön, nur habe ich das nicht hinbekommen (Hier wieder komplett entfernt.)

3.
(Da bin ich nch dran ...) Irgendwie gibt es ein Problem bei der Berechnung / Anzeige des nächsten Lebens ... kein Java-Problem :) ... da suche ich noch, aber evtl. sieht ja jemand sofort, wo der Fehler ist.

... und hier der Quelltext:

Java:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;

public class GoL extends JFrame implements MouseListener, MouseMotionListener {
  // Anfang Attribute
  private MyCanvas Spielfeld = new MyCanvas();
  private JButton btnClear = new JButton();
  private JLabel lStatuszeile = new JLabel();
  private JButton btnNext = new JButton();

  public boolean[][] Life = new boolean[52][52];
  // Ende Attribute

  public GoL(String title) {
    // Frame-Initialisierung
    super(title);
    setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
    int frameWidth = 520;
    int frameHeight = 600;
    setSize(frameWidth, frameHeight);
    Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
    int x = (d.width - getSize().width) / 2;
    int y = (d.height - getSize().height) / 2;
    setLocation(x, y);
    Container cp = getContentPane();
    cp.setLayout(null);
    // Anfang Komponenten

    Spielfeld.setBounds(7, 2, 500, 500);
    Spielfeld.setBackground(Color.WHITE);
    Spielfeld.addMouseMotionListener(this);
    Spielfeld.addMouseListener(this);
    cp.add(Spielfeld);

    btnClear.setBounds(8, 536, 100, 25);
    btnClear.setText("Reset");
    btnClear.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent evt) {
        btnClear_ActionPerformed(evt);
      }
    });
    cp.add(btnClear);
    lStatuszeile.setBounds(8, 512, 496, 16);
    lStatuszeile.setText("Mausposition");
    lStatuszeile.setFont(new Font("MS Sans Serif", Font.PLAIN, 13));
    cp.add(lStatuszeile);
    btnNext.setBounds(112, 536, 100, 25);
    btnNext.setText("Weiter");
    btnNext.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent evt) {
        btnNext_ActionPerformed(evt);
      }
    });
    cp.add(btnNext);
    // Ende Komponenten

    setResizable(false);
    setVisible(true);

    reset();
  }

  // Anfang Methoden
  
  /*
   * MouseListener - Ereignisroutinen
   */
  public void mouseExited(MouseEvent e) {

  }

  public void mousePressed(MouseEvent e) {

    int ex = e.getX()/10;
    int ey = e.getY()/10;

    // Polygon zeichnen
    if (!e.isMetaDown()) {  // wurde linke Maustaste gedrückt?
      Life[ey][ex] = true;
    }
    else {
      Life[ey][ex] = false;
    }
    // Graphics g = Spielfeld.getGraphics();
    Spielfeld.paintComponent(Life);
  }

  public void mouseEntered(MouseEvent e) {

  }

  public void mouseReleased(MouseEvent e) {

  }

  public void mouseClicked(MouseEvent e) {

  }
  
  /*
   * MouseMotionListener - Ereignisroutinen
   */
  public void mouseMoved(MouseEvent e) {

    int ex = e.getX()/10;
    int ey = e.getY()/10;

    if (e.getSource() == Spielfeld)
    {
      lStatuszeile.setText("Mouseposition("+ex+"|"+ey+")");
    }
  }

  public void mouseDragged(MouseEvent e) {

  }

  // Rücksetzen der Spielfeldes
  public void reset() {
    for (int x=0; x<52; x++) {
      for (int y=0; y<52; y++) {
        Life[y][x] = false;
      }
    }
    // Graphics g = Spielfeld.getGraphics();
    Spielfeld.paintComponent(Life);
  }
  
  // Button Reset
  public void btnClear_ActionPerformed(ActionEvent evt) {
    reset();
  }

  // Button Beenden
  public void btnEnd_ActionPerformed(ActionEvent evt) {

  }

  // Start des Spiels
  public void btnNext_ActionPerformed(ActionEvent evt) {
    nextGeneration();
    
    // Graphics g = Spielfeld.getGraphics();
    Spielfeld.paintComponent(Life);
  }
  
  // Anzahl der Nachbarn bestimmen
  private int anzahlNachbarn(int x, int y) {
    int n = 0;

    if (Life[y][x]) {  // Ist die Mitte besetzt?
      n = -1;
    }
    
    for (int i=x-1; i<x+2; i++) {
      for (int j=y-1; j<y+2; j++) {
        if (Life[j][i]) {
          n++;
        }
      }
    }

    return n;
  }

  
  public void nextGeneration() {

    boolean[][] NextLife = new boolean[52][52];

    NextLife = Life;
    
    // einzelne Felder neu berechnen
    for (int x=1; x<51; x++) {
      for (int y=1; y<51; y++) {
        switch (anzahlNachbarn(x,y)) {
          case 0: case 1 :
            NextLife[y][x] = false;        // stirbt aus Vereinsamung
            break;
          case 2 :
            NextLife[y][x] = Life[y][x];   // bleibt erhalten
            break;
          case 3 :
            NextLife[y][x] = true;         // Geburt bzw. Erhaltung
            break;
          default :
            NextLife[y][x] = false;        // stirbt wegen Überbevölkerung
        }
      }
    }
    
    Life = NextLife;   // nächste Generation als aktuelle Generation setzen
  }

  // Ende Methoden

  public static void main(String[] args) {
    new GoL("Game of Life");
  }
}

... und die MyCanvas ...

Java:
import java.awt.*;
import java.awt.event.*;

import javax.swing.*;
import javax.swing.event.*;

public class MyCanvas extends Canvas {

  public void paintComponent(boolean[][] Feld) {
  
    Graphics g = getGraphics();
  
    for (int x=1; x<51; x++) {
      for (int y=1; y<51; y++) {
        if (Feld[y][x]) {
          g.setColor(new Color(255,140,0));  // aktiv -> grün
        }
        else {
          g.setColor(new Color(0,0,0));    // nicht aktiv -> schwarz
        }
        g.fillRect(x*10,y*10,9,9);
      }
    }

  }
}
 

Marco13

Top Contributor
Zum Zeichnen: Alles, was gezeichnet wird, muss von der paintComponent-Methode aus gezeichnet werden, und zwar IN das Graphics, das DORT übergeben wurde. Alles was mit "getGraphics" oder "Zwischenspeichern eines Graphics-Objektes" (bei einer Component) zu tun hat ist schlicht falsch.

"Canvas" ist AWT, bei Swing sollte man dafür ein JPanel verwenden.

Variablennaben schreibt man klein.

Code:
public class MyCanvas extends JPanel {

  private boolean[][] feld;

  public MyCanvas(boolean[][] feld) // Beim Erstellen das Feld im Konstruktor übergeben
  {
      this.feld = feld;
  }
 
  @Override
  public void paintComponent(Graphics g) {
    super.paintComponent(g);  
    g.malIrgendwas(...)
  }
}
 

papabaer1707

Aktives Mitglied
Danke, mit JPanel funktioniert es besser ... das Canvas nur bei AWT angewendet werden sollte, wusste ich nicht :).

Eine Referenz beim Initialisieren von MyCanvas auf das Feld zu definieren bringt mich auf die Idee, dass dies auch mein Fehler (aus logischer Sicht) in nextGeneration sein kann. Bedeutet nextLife = Life, dass letztlich auch hier nur eine Referenz besteht? Da nextLife als Startbelegung notwendig ist ... wie kann ich dann (elegant) nextLife ohne Referenzen nutzen?

Hier nochmal der geänderte Code:
Java:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;

public class GoL extends JFrame implements MouseListener, MouseMotionListener {
  // Anfang Attribute
  public boolean[][] life = new boolean[52][52];

  private MyCanvas spielfeld = new MyCanvas(life);
  private JButton btnClear = new JButton();
  private JLabel lStatuszeile = new JLabel();
  private JButton btnNext = new JButton();

  // Ende Attribute

  public GoL(String title) {
    // Frame-Initialisierung
    super(title);
    setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
    int frameWidth = 520;
    int frameHeight = 600;
    setSize(frameWidth, frameHeight);
    Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
    int x = (d.width - getSize().width) / 2;
    int y = (d.height - getSize().height) / 2;
    setLocation(x, y);
    Container cp = getContentPane();
    cp.setLayout(null);
    // Anfang Komponenten

    spielfeld.setBounds(7, 2, 500, 500);
    spielfeld.setBackground(Color.WHITE);
    spielfeld.addMouseMotionListener(this);
    spielfeld.addMouseListener(this);
    cp.add(spielfeld);

    btnClear.setBounds(8, 536, 100, 25);
    btnClear.setText("Reset");
    btnClear.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent evt) {
        btnClear_ActionPerformed(evt);
      }
    });
    cp.add(btnClear);
    lStatuszeile.setBounds(8, 512, 496, 16);
    lStatuszeile.setText("Mausposition");
    lStatuszeile.setFont(new Font("MS Sans Serif", Font.PLAIN, 13));
    cp.add(lStatuszeile);
    btnNext.setBounds(112, 536, 100, 25);
    btnNext.setText("Weiter");
    btnNext.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent evt) {
        btnNext_ActionPerformed(evt);
      }
    });
    cp.add(btnNext);
    // Ende Komponenten

    setResizable(false);
    setVisible(true);

    reset();
  }

  // Anfang Methoden
  
  /*
   * MouseListener - Ereignisroutinen
   */
  public void mouseExited(MouseEvent e) {

  }

  public void mousePressed(MouseEvent e) {

    int ex = e.getX()/10;
    int ey = e.getY()/10;

    // Polygon zeichnen
    if (!e.isMetaDown()) {  // wurde linke Maustaste gedrückt?
      life[ey][ex] = true;
    }
    else {
      life[ey][ex] = false;
    }
    Graphics g = spielfeld.getGraphics();
    spielfeld.paintComponent(g);
  }

  public void mouseEntered(MouseEvent e) {

  }

  public void mouseReleased(MouseEvent e) {

  }

  public void mouseClicked(MouseEvent e) {

  }
  
  /*
   * MouseMotionListener - Ereignisroutinen
   */
  public void mouseMoved(MouseEvent e) {

    int ex = e.getX()/10;
    int ey = e.getY()/10;

    if (e.getSource() == spielfeld)
    {
      lStatuszeile.setText("Mouseposition("+ex+"|"+ey+")");
    }
  }

  public void mouseDragged(MouseEvent e) {

  }

  // Rücksetzen der Spielfeldes
  public void reset() {
    for (int x=0; x<52; x++) {
      for (int y=0; y<52; y++) {
        life[y][x] = false;
      }
    }
    Graphics g = spielfeld.getGraphics();
    spielfeld.paintComponent(g);
  }
  
  // Button Reset
  public void btnClear_ActionPerformed(ActionEvent evt) {
    reset();
  }

  // Button Beenden
  public void btnEnd_ActionPerformed(ActionEvent evt) {

  }

  // Start des Spiels
  public void btnNext_ActionPerformed(ActionEvent evt) {
    nextGeneration();
    
    Graphics g = spielfeld.getGraphics();
    spielfeld.paintComponent(g);
  }
  
  // Anzahl der Nachbarn bestimmen
  private int anzahlNachbarn(int x, int y) {
    int n = 0;

    if (life[y][x]) {  // Ist die Mitte besetzt?
      n = -1;
    }
    
    for (int i=x-1; i<x+2; i++) {
      for (int j=y-1; j<y+2; j++) {
        if (life[j][i]) {
          n++;
        }
      }
    }

    return n;
  }

  
  public void nextGeneration() {

    boolean[][] nextLife = new boolean[52][52];

    nextLife = life;
    
    // einzelne Felder neu berechnen
    for (int x=1; x<51; x++) {
      for (int y=1; y<51; y++) {
        switch (anzahlNachbarn(x,y)) {
          case 0: case 1 :
            nextLife[y][x] = false;        // stirbt aus Vereinsamung
            break;
          case 2 :
            nextLife[y][x] = life[y][x];   // bleibt erhalten
            break;
          case 3 :
            nextLife[y][x] = true;         // Geburt bzw. Erhaltung
            break;
          default :
            nextLife[y][x] = false;        // stirbt wegen Überbevölkerung
        }
      }
    }
    
    life = nextLife;   // nächste Generation als aktuelle Generation setzen
  }

  // Ende Methoden

  public static void main(String[] args) {
    new GoL("Game of Life");
  }
}

und
Java:
import java.awt.*;
import java.awt.event.*;

import javax.swing.*;
import javax.swing.event.*;

public class MyCanvas extends JPanel {

  private boolean[][] feld;

  public MyCanvas(boolean[][] feld) // Beim Erstellen das Feld im Konstruktor übergeben
  {
      this.feld = feld;
  }
  
  @Override
  public void paintComponent(Graphics g) {
    super.paintComponent(g);
  
    for (int x=1; x<51; x++) {
      for (int y=1; y<51; y++) {
        if (feld[y][x]) {
          g.setColor(new Color(255,140,0));  // aktiv -> grün
        }
        else {
          g.setColor(new Color(0,0,0));    // nicht aktiv -> schwarz
        }
        g.fillRect(x*10,y*10,9,9);
      }
    }

  }
}
 

Marco13

Top Contributor
Nochmal: Auf components darf man nicht getGraphics aufrufen. Auch wenn's schwer ist, sich damit abzufinden ;) Die ganzen Stellen, wo im Moment
Code:
    Graphics g = spielfeld.getGraphics();
    spielfeld.paintComponent(g);
steht, sollte man durch
spielfeld.repaint();
ersetzen können.

Bedeutet nextLife = Life, dass letztlich auch hier nur eine Referenz besteht?

Ja, der array, der eine Zeile vorher mit "new" angelegt wurde, wird damit praktisch auf den Müll geworfen. Wie den günstigste Ablauf wäre, müßte man sich überlegen. Ich denke, man wird schon 2 arrays brauchen, alles andere wäre ziemlich krampfig. Dann gibt es ganz pragmatisch gesagt erstmal zwei Ansätze:

Entweder, man ersetzt das "life" komplett durch das neue:
Code:
public void nextGeneration() {
{
    boolean[][] nextLife = new boolean[52][52];

    [b]// nextLife = life; // WEG![/b]

    // einzelne Felder neu berechnen
    ...
        nextLife[y][x] = false;
    ... 

    life = nextLife;   // nächste Generation als aktuelle Generation setzen

    [b]// Die muß dann aber auch noch an's Spielfeld übergeben werden:[/b]
    spielfeld.setFeld(life);
}

oder man erstellt am Anfang von "nextGeneration" eine Kopie der aktuellen, und schreibt die neue Generation gleich in "life" rein:

Code:
  // Anzahl der Nachbarn bestimmen, [b]arbeitet auf dem übergebenen array![/b]
  private int anzahlNachbarn(boolean currentLife[][], int x, int y) {
    int n = 0;

    if (currentLife[y][x]) {  // Ist die Mitte besetzt?
      n = -1;
    }
     ...
    return n;
  }


public void nextGeneration() {
{
    boolean[][] copy= new boolean[52][52];
    for (int i=0; i<copy.length; i++)
    {
        System.arraycopy(life[i], 0, copy[i], 0, 52); // Aktuelles "Life" kopieren
    }


    [b]// nextLife = life; // WEG![/b]

    // einzelne Felder neu berechnen, [b]und gleich in's "life" reinschreiben[/b]
    for (int x=1; x<51; x++) {
      for (int y=1; y<51; y++) {
         switch (anzahlNachbarn(copy,x,y)) { // Berechnung auf basis der kopie, die erstellt wurde
          case 0: case 1 :
            life[y][x] = false;        // stirbt aus Vereinsamung (direkt ins "life" reinschreiben)
    ...

    // life = nextLife;   // WEG! 

    spielfeld.repaint();
}

Das erste ist vermeintlich einfacher, das zweite hätte den Vorteil, dass immer dasselbe "life" erhalten bleibt und es nur in nextGeneration mit neuen Werte gefüllt wird. Kannst dir mal überlegen, was günstiger ist.
 

papabaer1707

Aktives Mitglied
OK, das mit dem repaint() funktioniert (wirklich). Was wird denn mit repaint() eigentlich der Reihe nach aufgerufen ... irgendwoher muss das paintComponent() auch die Graphicskomponente her bekommen ...

Die nächste Generation soll / muss erst komplett berechnet werden, daher ist eigentlich eine Kopie bzw. ein komplettes 2. Feld notwendig. Der erste Vorschlag funktioniert nicht ... stürzt eigentlich ab. Könnte wohl daran liegen, dass ich am Ende mit life = nextlife die Referenz von meinem (eigentlichen) Leben auf das nächste setze ... fatalerweise existiert dieses nach Beendigung der Methode gar nicht mehr.

Die zweite Variante funktioniert!!! Vielen Dank. Hier habe ich auch mein (gewünschte) wirkliche Kopie.

... nun muss ich mir nur noch was über timer anlesen ...
 

Marco13

Top Contributor
Bei "repaint" wird (stark vereinfacht) gesagt, dass "so bald wie möglich" neu gezeichnet werden soll. Das eigentliche Aufrufen von paintComponent übernimmt dann die JVM (bzw. "das Betriebssystem") für dich. Das muss ja auch gemacht werden, wenn z.B. das Fenster kurz durch ein anderes verdeckt war, und wieder sichtbar wird. Wenn dann also die JVM die paintComponent auruft, wird dort ein Graphics übergeben, das praktisch den Bereich auf dem Bildschirm repräsentiert, wo hin gezeichnet werden kann.

Der erste Vorschlag funktioniert nicht ... stürzt eigentlich ab.

Eigentlich ist eigentlich kein Wort. Ggf. mal genauer sagen, wo's hakt, falls das noch relevant ist.

Zu Timers steht hier
How to Use Swing Timers (The Java™ Tutorials > Creating a GUI With JFC/Swing > Using Other Swing Features)
und hier
Using Timers in Swing Applications
ein bißchen was, ggf. nochmal nachfragen.
 

papabaer1707

Aktives Mitglied
Also das Laufen über einen Timer habe ich hin bekommen:

Java:
  public Timer timer;

...

    timer = new Timer(1000, new ActionListener() {
              public void actionPerformed(ActionEvent evt) {
                timer_ActionPerformed(evt);
            }
        });
    timer.setInitialDelay(1000);

...

  public void timer_ActionPerformed(ActionEvent evt) {
    nextGeneration();
    spielfeld.repaint();
  }

...

  public void btnNext_ActionPerformed(ActionEvent evt) {
    timer.start();
  }

Das läuft auch gut ... nur habe ich dann probiert, ein An- und Abschalten über den gleichen Button zu ermöglichen. Da es wohl keine Möglichkeit gibt, zu erkennen, ob ein Timer aktiv ist oder nicht, habe ich es mit einer Exception probiert:

Java:
  public void btnNext_ActionPerformed(ActionEvent evt) {
    try {
      timer.cancel();
      btnNext.setLabel("Start / Weiter");
    } catch(Exception e) {
      timer.start();
      btnNext.setLabel("Stop / Pause");
    }
  }

Sicher habe ich jetzt eine Exception "missbraucht", aber funktionieren müsste es ... nur bekomme ich jetzt die Fehlermeldung, dass er die Methode cancel() in der javax.swing.Timer nicht findet? Das kann ich mir nicht erklären, da diese sogar im Kontextmenu angeboten wird.
 
G

Gast2

Gast
Sicher habe ich jetzt eine Exception "missbraucht", aber funktionieren müsste es
;(
Mach das lieber vom ActionCommand des Buttons abhängig!

Um den Timer zu stoppen rufst du einfach
Code:
stop();
auf ( setRepeats(true); solltest du auch noch setzen).
Die cancel(); Methode kommt vom java.util.Timer und hat mit dem swing timer nix zutun.
 

papabaer1707

Aktives Mitglied
;(
Mach das lieber vom ActionCommand des Buttons abhängig!
... ja, da hatte ich auch dran gedacht ... nur fand ich das nicht besonders elegant (und zukunftssicher für weitere Anwendungen - ich will ja was lernen)

Ich habe aber eine Lösung gefunden:
Java:
  public void btnNext_ActionPerformed(ActionEvent evt) {
    if (timer.isRunning()) {
      timer.stop();
      btnNext.setLabel("Start / Weiter");
    }
    else {
      timer.start();
      btnNext.setLabel("Stop / Pause");
    }
  }
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
B Game of Life in JavaFX AWT, Swing, JavaFX & SWT 5
K Game of Life AWT, Swing, JavaFX & SWT 4
vandread Swing Probleme mit "Game of Life" programmieren AWT, Swing, JavaFX & SWT 8
beatles Swing JTextField - Game Status aus Array anzeigen AWT, Swing, JavaFX & SWT 3
J Frage zu Java Projekt [2D Game] AWT, Swing, JavaFX & SWT 3
F Swing Ein 2D-Game Menü mit framefüllenden Button AWT, Swing, JavaFX & SWT 6
M Tipps Zur Umsetzung einer GUI für ein Trading Card Game AWT, Swing, JavaFX & SWT 7
J Graphisches Game Menü AWT, Swing, JavaFX & SWT 9
P 2D-Grafik Gezielter Repaint einzelner Frames in Java-Game AWT, Swing, JavaFX & SWT 6
D JTextField über ein Game AWT, Swing, JavaFX & SWT 11
P WM 2006 - The Memory Game :P läuft nicht. AWT, Swing, JavaFX & SWT 15
P paintComponent-Methode wird dauernd neu aufgerufen AWT, Swing, JavaFX & SWT 2
H new Operator in paintComponent - Speicherprobleme vorprogrammiert? AWT, Swing, JavaFX & SWT 2
frager2345 Warum paintComponent hier und nicht paint AWT, Swing, JavaFX & SWT 2
L paintComponent in Panel eines Borderlayouts hinzufügen AWT, Swing, JavaFX & SWT 3
G update, paintComponent AWT, Swing, JavaFX & SWT 1
H Transparent zeichnen mit drawImage in paintComponent Methode AWT, Swing, JavaFX & SWT 3
T Problem mit paintComponent() AWT, Swing, JavaFX & SWT 17
L Swing repaint() ruft paintComponent(g1d) nicht auf AWT, Swing, JavaFX & SWT 12
C Objekt an paintComponent weitergeben AWT, Swing, JavaFX & SWT 1
B 2D-Grafik paintcomponent Probleme beim zeichnen AWT, Swing, JavaFX & SWT 10
L 2D-Grafik Swing paint|paintComponent AWT, Swing, JavaFX & SWT 2
N JButton über benutzerdefinierte paintComponent setzen AWT, Swing, JavaFX & SWT 3
M Swing Swing-Widgets und paintComponent() AWT, Swing, JavaFX & SWT 2
K Probleme beim zeichnen mit paintComponent() AWT, Swing, JavaFX & SWT 1
D PaintComponent wird nicht aufgerufen AWT, Swing, JavaFX & SWT 3
S passende PaintComponent ? Zeichnen in TextArea mit Scrollpane ? AWT, Swing, JavaFX & SWT 2
I (JPanel) paintComponent mit Zeitverschiebung (Sleep/Wait) AWT, Swing, JavaFX & SWT 1
K Swing paintComponent, JPanel auslagern, ChangeEvents AWT, Swing, JavaFX & SWT 7
B Zeichnen mit paintComponent? Oder anders? AWT, Swing, JavaFX & SWT 15
B AWT paintComponent wird nur 2 mal ausgeführt?! AWT, Swing, JavaFX & SWT 5
P Paint und paintComponent AWT, Swing, JavaFX & SWT 12
D paintComponent() mit transparentem Hintergrund. AWT, Swing, JavaFX & SWT 0
G Swing Flackern nach Override von paintComponent() AWT, Swing, JavaFX & SWT 3
M Swing paintComponent in rekusivem JPanel funktioniert nicht AWT, Swing, JavaFX & SWT 2
M DefaultTableModel ruft paintComponent auf ! AWT, Swing, JavaFX & SWT 4
T Swing paintComponent(); AWT, Swing, JavaFX & SWT 24
K Swing JButton paintComponent überschreiben AWT, Swing, JavaFX & SWT 5
Kenan89 2D-Grafik paintComponent quetsch alles in Panel AWT, Swing, JavaFX & SWT 26
B 2D-Grafik paintComponent für rechteckigen Bereich? AWT, Swing, JavaFX & SWT 6
P Swing problem mit paintComponent AWT, Swing, JavaFX & SWT 2
R paintComponent malt bei repaint() Rahmen um Panel AWT, Swing, JavaFX & SWT 7
K paintComponent nicht aufgerufen AWT, Swing, JavaFX & SWT 2
J Mal wieder Probleme mit paintComponent AWT, Swing, JavaFX & SWT 3
L Swing 64bit Problem mit paint/paintComponent AWT, Swing, JavaFX & SWT 7
S auf paintComponent() warten AWT, Swing, JavaFX & SWT 34
W JPanel Überschreiben // paintComponent? AWT, Swing, JavaFX & SWT 4
propra Wieso wird paintComponent() beim Start 2 malausgeführt? AWT, Swing, JavaFX & SWT 4
T BufferedImage bei paintComponent AWT, Swing, JavaFX & SWT 6
P JLabel paintComponent AWT, Swing, JavaFX & SWT 3
Z Swing paintcomponent und menbar Problem AWT, Swing, JavaFX & SWT 3
S Image wird nicht (immer) in paintComponent gezeichnet? AWT, Swing, JavaFX & SWT 6
R 2D-Grafik auf JPanel zeichen - ohne @Override paintComponent AWT, Swing, JavaFX & SWT 6
A Probleme mit paintComponent & BorderFactory AWT, Swing, JavaFX & SWT 2
A paintComponent AWT, Swing, JavaFX & SWT 4
T Rechtecke zeichnen mit paintComponent() AWT, Swing, JavaFX & SWT 3
R paintComponent direkt bei actionPerformed aufrufen AWT, Swing, JavaFX & SWT 2
P Swing Vom BufferedImage bei paintComponent nur soviel zeichnen, wie nötig AWT, Swing, JavaFX & SWT 3
P Swing Frage zu paintComponent/getGraphics AWT, Swing, JavaFX & SWT 4
A paintComponent() - Animation AWT, Swing, JavaFX & SWT 2
K JPanel und paintComponent AWT, Swing, JavaFX & SWT 8
E 2D-Grafik Zeichnen außerhalb der "paintComponent"-Methode? AWT, Swing, JavaFX & SWT 5
C Checkbox in Liste deaktivieren und paintComponent explizit aufrufen AWT, Swing, JavaFX & SWT 12
C Performance-Problem beim Überschreiben von paintComponent() AWT, Swing, JavaFX & SWT 2
P 2D-Grafik PaintComponent() übernimmt keine Werte aus update() AWT, Swing, JavaFX & SWT 8
F Swing Problem mit KeyListener||paintComponent() in JFrame AWT, Swing, JavaFX & SWT 12
B Anzeigefehler in GridBagLayout durch paintComponent(Graphics g) AWT, Swing, JavaFX & SWT 3
J Swing paintComponent() - repaint() - BufferedImage anzeigen AWT, Swing, JavaFX & SWT 5
J paintComponent() übergeben AWT, Swing, JavaFX & SWT 4
N paintComponent für Graphics ansprechen AWT, Swing, JavaFX & SWT 2
E EINFACHE Verständnisfrage zu repaint(), paintComponent(), usw. AWT, Swing, JavaFX & SWT 16
kodela Swing paintComponent() wird nicht aufgerufen AWT, Swing, JavaFX & SWT 19
E einfache Frage zu paintComponent und Graphics AWT, Swing, JavaFX & SWT 7
E WARUM wird paintComponent nicht aufgerufen? AWT, Swing, JavaFX & SWT 12
C paintComponent mit Maus verschieben - wie? AWT, Swing, JavaFX & SWT 2
G Swing paintComponent Effizienz? AWT, Swing, JavaFX & SWT 4
R paintComponent Kollision AWT, Swing, JavaFX & SWT 2
D Fragen zu Swing, paintComponent() und repaint AWT, Swing, JavaFX & SWT 6
A Probleme mit paintComponent() AWT, Swing, JavaFX & SWT 2
T Swing paintComponent problem AWT, Swing, JavaFX & SWT 3
MrGe getWidth(); getHeight(); außerhalb von paintComponent AWT, Swing, JavaFX & SWT 4
A paintComponent überdeckt ... AWT, Swing, JavaFX & SWT 13
JFeel-x repaint für Aufruf von paintComponent-Klasse ungeeignet? AWT, Swing, JavaFX & SWT 11
F Wer ruft paintComponent() Methode auf? AWT, Swing, JavaFX & SWT 9
@ JPanel: kein paintComponent() trotz repaint() AWT, Swing, JavaFX & SWT 4
G paintComponent Problem AWT, Swing, JavaFX & SWT 6
T paintComponent() überschreiben: Platz für Border freihalten? AWT, Swing, JavaFX & SWT 6
G paintComponent JPanel im JApplet AWT, Swing, JavaFX & SWT 2
X Speichern in der paintComponent() Methode AWT, Swing, JavaFX & SWT 15
W JLabel + paintComponent AWT, Swing, JavaFX & SWT 2
V Wieviel Logik in paintComponent? AWT, Swing, JavaFX & SWT 7
hdi super.paintComponent(g); soll nicht alles löschen AWT, Swing, JavaFX & SWT 2
G paintComponent() Methode für JPanel in NetBeans überschreibe AWT, Swing, JavaFX & SWT 2
L Problem mit paintComponent() under java < 1.6 under Windo AWT, Swing, JavaFX & SWT 3
H eigene paintComponent(Graphics) kommt mit rezise nicht klar AWT, Swing, JavaFX & SWT 6
N Probleme mit paintComponent und GradientPaint AWT, Swing, JavaFX & SWT 5
B JPanel#paintComponent(Graphics g) << flackert oO AWT, Swing, JavaFX & SWT 3
D performance problem: paintcomponent, alphacomp, bufferedImag AWT, Swing, JavaFX & SWT 10
A Probelme mit großen BufferedImage in paintComponent AWT, Swing, JavaFX & SWT 7
C Bei Skalierung wird paintComponent() nicht aufgerufen,warum? AWT, Swing, JavaFX & SWT 4

Ähnliche Java Themen

Neue Themen


Oben