Paint() wird scheinbar nicht richtig ausgeführt

LIO-GmbH

Mitglied
Hallo liebe Community,

wir haben versucht ein Vier Gewinnt zu programieren. Ursprünglich um uns ein wenig an einer guten KI zu versuchen. Leider scheiterte das schon im Ansatz daran, dass unsere grafische Darstellung nicht so ausgeführt wird, wie wir es uns vorstellen. Um erlich zu sein, wissen wir nicht genau wo das problem liegt. Die Vermutung besteht allerdings darin, dass aus unbekannten Gründen die Standartmethode Paint() nicht ausgeführt wird. Unser Stil ist noch nicht ganz ausgereift, das wissen wir, dennoch bitten wir darum, dass ihr euch das mal anschaut und eure Ideen postet.

Hier der Code:

Java:
public class Vier_Gewinnt extends JPanel implements Runnable, KeyListener, ActionListener {

    //Variablen Deklaration
    static Vier_Gewinnt vg;
    public static int[][] iFeld = new int[7][6];
    public JFrame fHead;
    public JPanel pPanel;
    static Dimension dSz;
    static int c;
    static int d;
    static ImageIcon imgIGelb;
    static ImageIcon imgIRot;
    static ImageIcon imgILeer;
    static Image imgGelb;
    static Image imgRot;
    static Image imgLeer;
    static Image backBuffer;

    public static void main(String[] args) {

        //Bilder laden aus src - Ordner
        try {
            imgIGelb = new ImageIcon(ImageIO.read(new File("FeldGelb.jpeg")));
            imgIRot = new ImageIcon(ImageIO.read(new File("FeldRot.jpeg")));
            imgILeer = new ImageIcon(ImageIO.read(new File("FeldLeer.jpeg")));
            System.out.println("Bild: " + imgIGelb);
        } catch (IOException ex) {
            Logger.getLogger(Vier_Gewinnt.class.getName()).log(Level.SEVERE, null, ex);
        }
        imgGelb = imgIGelb.getImage();
        imgRot = imgIRot.getImage();
        imgLeer = imgILeer.getImage();
        vg = new Vier_Gewinnt();
    }

    public Vier_Gewinnt() {

        //Bildschirmgröße auslesen und für weitere Anpassungen vorbereiten
        dSz = Toolkit.getDefaultToolkit().getScreenSize();
        c = 800 * (dSz.width / 800);
        d = 600 * (dSz.height / 600);

        //Frame erstellen und definieren
        fHead = new JFrame();
        fHead.setUndecorated(true);
        fHead.setLayout(null);
        fHead.setBounds((int) ((dSz.width / 2) - (c / 2)), (int) ((dSz.height / 2) - (d / 2)), c, d);
        fHead.setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

        //Buttons erstellen und dem Frame zufügen
        JButton bStart = new JButton("Start");
        bStart.setPreferredSize(new Dimension(100, 50));
        bStart.setBounds(700 * (dSz.width / 800), 0, 100, 50);
        fHead.add(bStart);
        JButton bEnd = new JButton("Ende");
        bEnd.setPreferredSize(new Dimension(100, 50));
        bEnd.setBounds(700 * (dSz.width / 800), 550 * (dSz.height / 600), 100, 50);
        fHead.add(bEnd);

        //Panel erstellen, definieren und zufügen
        pPanel = new JPanel();
//        pPanel.setBackground(Color.red);
        pPanel.setBounds(0, 0, 700, 600);
        pPanel.setPreferredSize(new Dimension((c - (100 * (dSz.width / 800))), d));
        fHead.add(pPanel);

        fHead.setVisible(true);

        //Buttonfunktionen einrichten
        bEnd.addMouseListener(new java.awt.event.MouseAdapter() {

            @Override
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                System.exit(0);
            }
        });
        for (int a = 0; a <= 6; a++) {
            for (int b = 0; b <= 5; b++) {
                iFeld[a][b] = 0;
            }
        }
        bStart.addMouseListener(new java.awt.event.MouseAdapter() {

            @Override
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                System.out.println("start!");
                backBuffer = pPanel.createImage(pPanel.getWidth(), pPanel.getHeight());
                zeichnen();
            }
        });
    }

    //<editor-fold defaultstate="collapsed" desc="Noch zu definierende Funktionen">
    @Override
    public void run() {
        throw new UnsupportedOperationException("Not supported yet.");
    }
    
    @Override
    public void keyTyped(KeyEvent e) {
        throw new UnsupportedOperationException("Not supported yet.");
    }
    
    @Override
    public void keyPressed(KeyEvent e) {
        throw new UnsupportedOperationException("Not supported yet.");
    }
    
    @Override
    public void keyReleased(KeyEvent e) {
        throw new UnsupportedOperationException("Not supported yet.");
    }
    
    @Override
    public void actionPerformed(ActionEvent e) {
        throw new UnsupportedOperationException("Not supported yet.");
    }
    //</editor-fold>
    
    //Versuch des Umschreibens der Paint Funktionen :(
    @Override
    public void paint(Graphics g) {
        super.paint(g);
        zeichnen();
        System.out.println("paint");
    }

    @Override
    public void paintComponent(Graphics g) {
        System.out.println("UHH");
        super.paintComponent(g);
        zeichnen();
    }

    //Funktion zum zeichnen des Feldes
    public void zeichnen() {
        Graphics g = backBuffer.getGraphics();
        for (int e = 0; e < 7; e++) {
            for (int f = 0; f < 6; f++) {
                if (iFeld[e][f] == 0) {
                    g.drawImage(imgLeer, e * 100, f * 100, 100, 100, this);
                } else if (iFeld[e][f] == 1) {
                    g.drawImage(imgRot, e * 100, f * 100, 100, 100, this);
                } else if (iFeld[e][f] == 2) {
                    g.drawImage(imgGelb, e * 100, f * 100, 100, 100, this);
                } else {
                    System.out.println("Arrayfehler!");
                }
            }
        }
        System.out.println("zeichne" + imgLeer.getSource());
    }
}

Ich hoffe ihr versteht unser Problem (wir nämlich nicht!).
Danke!
 
S

SlaterB

Gast
das Vier_Gewinnt-Panel ist nicht in die GUI eingebunden, schmeiße das Attribut pPanel weg,
und die meisten dessen Vorkommen durch 'this' ersetzen

in den Listener gehört noch ein repaint();
in den Zeichnen-Methoden musst du aufpassen ob backBuffer nicht noch anfangs null ist,

backBuffer selber muss schließlich in paintComponent() dann auch gemalt werden,
nur drauf zeichnen und es nie zeigen, das wird ein vergessenes Meisterwerk

die paint-Methode ganz entfernen, paintComponent() ist korrekt
 
S

Spacerat

Gast
Oh ja... sag' ich mal.
1. siehe SlaterB
2. Wenn man an der Methode "zeichnen()" festhalten will (man kann sie ja immer noch aus "paintComponent()" aufrufen) ist es wichtig, dieser das Graphics-Objekt mitzugeben, statt es in dieser neu initialisieren zu lassen (von wegen, vergessenes Meisterwerk... überflüssiges SonstwasWerk. Swing "backbufferd" standardmässig von Haus aus ;)).
 

LIO-GmbH

Mitglied
Also, schonmal danke für die Tipps.

Wir haben mal versucht das ganze umzusetzen. Leider ohne richtigen Erfolg.
Wir haben versucht, das ganze, was wir in die zeichnen() Methode geschrieben haben im Vier_Gewinnt() auszuführen. Ergebnis: Man sieht kurz, das zu Zeichnende.
Außerdem haben wir festgestellt, dass sich aus unserem Vier_Gewinnt() kein Graphics Objekt ziehen lässt (also mit this.getGraphics() gibts ne nullpointerexception). Woran liegt das?

Grüße
 
S

SlaterB

Gast
niemals getGraphics() von GUI-Komponenten benutzen, von Images ok,
getGraphics() des Panels liefert null, bevor es aus dem Bildschirm zu sehen ist und später sind dort Zeichungen reichlich unbeständig, wie du beides festgestellt hast

paintComponent() zeichnet, da hast du dann auch gleich ein Graphics-Objekt, fertig, bitte nicht zu modifizieren versuchen bevor du nicht selber gewisse Experten-Kenntnisse hast (theoretisch geht vieles)

ansonsten wirds langsam vage mit den Fehlern, wie ist denn der aktuelle Code aus,
idealerweise mit getGraphics() schon überwunden (auf Bildern weiterhin ok),
also die neuesten Erkenntnisse bereits eingebunden?
 

LIO-GmbH

Mitglied
Also, wir haben jetzt auch getGraphics() komplett rausgestrichen. Leider ist mir immer noch nicht klar, 1.) warum wir im Konstruktor nicht mit this auf den frame zugreifen können und 2.) er unsere ausgabe in paintComponent() nicht ausgibt... er also scheinbar nicht darauf zugreift, trotz dem repaint() beim Listener und hier liegt denke ich auch irgentwo der Fehler, weil wenn er painComponent() nicht ausführt, führt er auch zeichen() nicht aus...

--> Ende vom Lied, same problem anyway!???:L

Java:
public class Vier_Gewinnt extends JPanel implements Runnable, KeyListener, ActionListener {

    //Variablen Deklaration
    static Vier_Gewinnt vg;
    public static int[][] iFeld = new int[7][6];
    public JFrame fHead;
    static Dimension dSz;
    static int c;
    static int d;
    static ImageIcon imgIGelb;
    static ImageIcon imgIRot;
    static ImageIcon imgILeer;
    static Image imgGelb;
    static Image imgRot;
    static Image imgLeer;
    static Image backBuffer;

    public static void main(String[] args) {
        //Bilder laden aus src - Ordner
        try {
            imgIGelb = new ImageIcon(ImageIO.read(new File("FeldGelb.jpeg")));
            imgIRot = new ImageIcon(ImageIO.read(new File("FeldRot.jpeg")));
            imgILeer = new ImageIcon(ImageIO.read(new File("FeldLeer.jpeg")));
            System.out.println("Bild: " + imgIGelb);
        } catch (IOException ex) {
            Logger.getLogger(Vier_Gewinnt.class.getName()).log(Level.SEVERE, null, ex);
        }
        imgGelb = imgIGelb.getImage();
        imgRot = imgIRot.getImage();
        imgLeer = imgILeer.getImage();
        vg = new Vier_Gewinnt();
    }

    public Vier_Gewinnt() {

        //Bildschirmgröße auslesen und für weitere Anpassungen vorbereiten
        dSz = Toolkit.getDefaultToolkit().getScreenSize();
        c = 800 * (dSz.width / 800);
        d = 600 * (dSz.height / 600);

        //Frame erstellen und definieren
        fHead = new JFrame();
        fHead.setUndecorated(true);
        fHead.setLayout(null);
        fHead.setBounds((int) ((dSz.width / 2) - (c / 2)), (int) ((dSz.height / 2) - (d / 2)), c, d);
        fHead.setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

        //Buttons erstellen und dem Frame zufügen
        JButton bStart = new JButton("Start");
        bStart.setPreferredSize(new Dimension(100, 50));
        bStart.setBounds(700 * (dSz.width / 800), 0, 100, 50);
        fHead.add(bStart);
        JButton bEnd = new JButton("Ende");
        bEnd.setPreferredSize(new Dimension(100, 50));
        bEnd.setBounds(700 * (dSz.width / 800), 550 * (dSz.height / 600), 100, 50);
        fHead.add(bEnd);

        fHead.setVisible(true);

        System.out.println("zeichne" + imgLeer.getSource());

        //Buttonfunktionen einrichten
        bEnd.addMouseListener(new java.awt.event.MouseAdapter() {

            @Override
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                System.exit(0);
            }
        });
        for (int a = 0; a <= 6; a++) {
            for (int b = 0; b <= 5; b++) {
                iFeld[a][b] = 0;
            }
        }
        bStart.addMouseListener(new java.awt.event.MouseAdapter() {

            @Override
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                fHead.repaint();
                System.out.println("start");
            }
        });
    }

    //<editor-fold defaultstate="collapsed" desc="Noch zu definierende Funktionen">
    @Override
    public void run() {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public void keyTyped(KeyEvent e) {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public void keyPressed(KeyEvent e) {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public void keyReleased(KeyEvent e) {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        throw new UnsupportedOperationException("Not supported yet.");
    }
    //</editor-fold>

    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        zeichnen(g);
        System.out.println("pc");
    }

//    Funktion zum zeichnen des Feldes
    public void zeichnen(Graphics g) {
        for (int e = 0; e < 7; e++) {
            for (int f = 0; f < 6; f++) {
                if (iFeld[e][f] == 0) {
                    g.drawImage(imgLeer, e * 100, f * 100, 100, 100, this);
                } else if (iFeld[e][f] == 1) {
                    g.drawImage(imgRot, e * 100, f * 100, 100, 100, this);
                } else if (iFeld[e][f] == 2) {
                    g.drawImage(imgGelb, e * 100, f * 100, 100, 100, this);
                } else {
                    System.out.println("Arrayfehler!");
                }
            }
        }
        System.out.println("zeichne" + imgLeer.getSource());
    }
}
 

Kevin94

Top Contributor
Du fügst die VierGewinnt Instanz niemals dem Frame hinzu.

Übliche Vorgehensweise ist übrigens, dass man entweder von JFrame erbt und in dessen Konstruktor die Initialisation vornimmt, oder das Frame in der main-Methode intialisiert.
 
S

SlaterB

Gast
das VierGewinnt-Objekt vg ist nicht ins JFrame eingebunden..

der statischen Variable wird das Objekt in der main aber auch erst zugewiesen, wenn der Konstruktor fertig ist,
recht spät, im Konstruktor könntest du vg nicht benutzten,
es sei denn dort findet die Zuweisung statt, etwa
vg = this;

oder eben mit this arbeiten

> warum wir im Konstruktor nicht mit this auf den frame zugreifen können
bleibt leider eine Frage ohne Code oder jede Erklärung,
this ist natürlich hier ein Panel und kein Frame, sonst gibt es keine Probleme mit this im Konstruktor
 

LIO-GmbH

Mitglied
Okay, danke für all eure Hilfen. Leider ist es uns bisher nicht gelungen das alles so umzusetzen, wie wir es gerne hätten.
Dennoch war es überaus hilfreich für die weitere Programierung. Wir versuchen jetzt das ganze jetzt per, von Netbeans vorgegebener GUI.

Grüße
lio
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
S Interface JButton etc. wird in JFrame mit paint() nicht angezeigt Java Basics - Anfänger-Themen 6
T Vererbung Wann wird die Methode paint aufgerufen? Java Basics - Anfänger-Themen 4
T paint() wird nicht aufgerufen Java Basics - Anfänger-Themen 2
G hintergrund wird nicht gezeichnet bei paint() Java Basics - Anfänger-Themen 3
K Wieso wird "paint" nicht ausgeführt ? Java Basics - Anfänger-Themen 2
F Swing - Fehler - Paint Methode Java Basics - Anfänger-Themen 7
S awt: paint Methode zeigt nichts an Java Basics - Anfänger-Themen 9
S Paint Anwendung: Freihandlinien zeichnen Java Basics - Anfänger-Themen 4
S Erste Schritte drawOval Problem in Paint Anwendung Java Basics - Anfänger-Themen 1
R Begrenzer Anzahl von paint() ? Java Basics - Anfänger-Themen 3
S KeyListener/ActionListener/paint()/repaint() Java Basics - Anfänger-Themen 3
thet1983 start & paint Methode? Java Basics - Anfänger-Themen 0
M Probleme mit paint() aus java.awt.Graphics Java Basics - Anfänger-Themen 2
D Wert einer Variable in paint-Methode verwenden Java Basics - Anfänger-Themen 2
OnDemand Berechnung in die start und paint Methode eines Applets Java Basics - Anfänger-Themen 28
N aus Container components paint Java Basics - Anfänger-Themen 2
J paint() vs repaint() Java Basics - Anfänger-Themen 3
A Problem mit paint() Java Basics - Anfänger-Themen 2
A Aufruf der paint() Methode Java Basics - Anfänger-Themen 3
Dogge Problem mit paint(Graphics g) im Applet Java Basics - Anfänger-Themen 13
J Problem mit paint(Graphics g) Java Basics - Anfänger-Themen 4
L Erste Schritte Swing oder SWT Paint mit Grafikkarte? Java Basics - Anfänger-Themen 7
K paint() mit einfügen Java Basics - Anfänger-Themen 14
K doppeltes paint beim Drucken Java Basics - Anfänger-Themen 8
J paint-methode blockiert settings von JComponents Java Basics - Anfänger-Themen 5
F Eine Frage über paint() Funktion Java Basics - Anfänger-Themen 2
S [Applet] Objekte von init bei paint benutzen Java Basics - Anfänger-Themen 9
R Methoden Zeichnen auf Button-Druck durch Paint-Methode Java Basics - Anfänger-Themen 2
W repaint() ruft paint() nicht auf Java Basics - Anfänger-Themen 9
J Zweimal im gleichen Paint-Fenster malen Java Basics - Anfänger-Themen 8
A paint() methode von externer Klasse aufrufen Java Basics - Anfänger-Themen 3
J Paint Methode von JPanel aufrufen Java Basics - Anfänger-Themen 15
V paint funktioniert nicht Java Basics - Anfänger-Themen 14
Q Zeichnen außerhalb der paint-methode Java Basics - Anfänger-Themen 7
O Paint Programm mit Fehler Java Basics - Anfänger-Themen 2
A Methoden Variablen in paint methode Java Basics - Anfänger-Themen 4
K Problem mit Parameter von paint(Graphics g) Java Basics - Anfänger-Themen 3
Y im applet malen ohne repaint paint ? Java Basics - Anfänger-Themen 6
S Datentypen Paint Programm Java Basics - Anfänger-Themen 7
M paint-Methode funzt nicht Java Basics - Anfänger-Themen 11
L Paint zeichnet nicht gespeicherte Objekte Java Basics - Anfänger-Themen 3
D OOP paint() Methode aus Unterklasse anstoßen Java Basics - Anfänger-Themen 3
A paint() - warum nicht aufrufen? Java Basics - Anfänger-Themen 3
K Scrollbar - Bild - paint-Methode - zoom Java Basics - Anfänger-Themen 10
S super.paint() Java Basics - Anfänger-Themen 4
S Bild aus paint() Methode auslagern Java Basics - Anfänger-Themen 14
T Etwas an paint()-Methode übergeben? Java Basics - Anfänger-Themen 6
TheKing Paint-Methode aufrufen Java Basics - Anfänger-Themen 14
N paint methode statt Event-Handling-Methode Java Basics - Anfänger-Themen 3
M Paint und JColorChooser Java Basics - Anfänger-Themen 12
H Paint Methode malt nicht im Panel Java Basics - Anfänger-Themen 4
S Frage zur paint-Methode Java Basics - Anfänger-Themen 3
B Applet: Event-Handling-Methode in start- bzw. paint-Methode Java Basics - Anfänger-Themen 7
G Nichtstatische Objekte in der paint()-Methode Java Basics - Anfänger-Themen 16
K JPanel, JFrame, paint() und wo ist mein Viereck ? Java Basics - Anfänger-Themen 19
F Frage zu JPanel und Paint Java Basics - Anfänger-Themen 5
P paint Methode Java Basics - Anfänger-Themen 3
M Problem mit paint() und Container. Java Basics - Anfänger-Themen 8
B Paint(Component) und externe Objekte Java Basics - Anfänger-Themen 6
T rotes herz public void paint(Graphics g) Java Basics - Anfänger-Themen 2
F Applets und die paint-Methode Java Basics - Anfänger-Themen 3
G frage zu paint Java Basics - Anfänger-Themen 3
T Mehrere paint Methoden in unterschiedlichen Klassen Java Basics - Anfänger-Themen 7
G start-oder paint-Methode anstatt Event-Handling-Methode? Java Basics - Anfänger-Themen 3
G Hilfe in paint() ; zeichnen Java Basics - Anfänger-Themen 15
C Einfaches Paint-Programm Java Basics - Anfänger-Themen 9
T .paint() aufrufen Java Basics - Anfänger-Themen 23
S Paint Teilweise Zeitverzögert Java Basics - Anfänger-Themen 6
R paint problem Java Basics - Anfänger-Themen 6
G mit paint() ins JPanel malen. Java Basics - Anfänger-Themen 6
M Auf Panels oder Labels malen? (paint) Java Basics - Anfänger-Themen 9
G repaint in paint aufrufen? Java Basics - Anfänger-Themen 9
V paint()-methode manuell aufrufen? kein autostart erwuenscht Java Basics - Anfänger-Themen 3
B Problem mit Einfügen von Choice (in ein Applet) aus Paint Java Basics - Anfänger-Themen 13
7 In Paint keine Schleife? Java Basics - Anfänger-Themen 13
T paint() wieder aus einder anderen methode aufrufen funzt nid Java Basics - Anfänger-Themen 2
G Paint auf Panel Java Basics - Anfänger-Themen 4
G Paint Methode löscht alles Java Basics - Anfänger-Themen 4
S paint() direkt auf JFrame seit 1.5 nicht mehr möglich? Java Basics - Anfänger-Themen 5
A Variablenübergabe in die Paint-Funktion Java Basics - Anfänger-Themen 4
D Zeichnen mit Paint zerstört ganzes Fenster Java Basics - Anfänger-Themen 5
G Klassen und paint methode Java Basics - Anfänger-Themen 2
T paint() ohne konstruktor aufzurufen? Java Basics - Anfänger-Themen 5
P paint() Java Basics - Anfänger-Themen 6
U paint Java Basics - Anfänger-Themen 8
X Malen außerhalb der paint() Methode Java Basics - Anfänger-Themen 4
C zu viele paint()'s. Java Basics - Anfänger-Themen 6
G Zeichnen ausserhalb der paint Methode Java Basics - Anfänger-Themen 4
V Problem mit der Anzeige einer paint-Methode in einem Panel Java Basics - Anfänger-Themen 2
N Probleme mit paint() bei Implementierung in ein Panel Java Basics - Anfänger-Themen 4
Dilandau paint(Graphics g) { unbekannt in try{} / catch{} }? Java Basics - Anfänger-Themen 5
D von paint() und repaint() im Applet Java Basics - Anfänger-Themen 4
C Ausgaben mit der Paint-Methode Java Basics - Anfänger-Themen 5
K Warum wird mir auf der Konsole des Servers nicht "xxxx" angezeigt (Server/Client) Java Basics - Anfänger-Themen 4
K Warum wird hier nur etwas in eine txt Datei geschrieben und nicht in alle drei (InputStream/OutputStream/Reader/Writer) Java Basics - Anfänger-Themen 1
I Exception wird gefangen, aber trotzdem in Error Log? Java Basics - Anfänger-Themen 10
H JDK installieren jdk-21 wird nicht erkannt Java Basics - Anfänger-Themen 13
T if-else Bedingung wird ignoriert Java Basics - Anfänger-Themen 4
K Warum wird mir "Empfangen vom Client:" nicht sofort ausgegeben(Server/Client) Java Basics - Anfänger-Themen 3
P Webseite vom Smartmeter wird nur unleserlich angezeigt Java Basics - Anfänger-Themen 7

Ähnliche Java Themen

Neue Themen


Oben