Paint Methode externer auruf

A0D0S0

Mitglied
Hallo,
bin gerade dabei mir n kleines Hangman Spiel zu schreiben.
Hangman steht soweit , jetzt bin ich bei der Grafikklasse, nur die will nicht so ganz wie ich will

DAS ist die Graphics Klasse zum zeichnen:
Java:
import java.awt.*;
import java.awt.Graphics;
import javax.swing.*;
/**
 * Beschreiben Sie hier die Klasse HangmanGraphic.
 * 

 * @version 2011-09-23
 */
public class HangmanGraphic extends JPanel
{
    private int level = 0;

    public HangmanGraphic(){
        Dimension d = new Dimension(400,400);
        setPreferredSize(d);
    }
   
    public void paint(Graphics g){
        
        if(getLevel()  == 1){
            g.drawLine(300,300,300,100);
            repaint();
            System.out.println(level);
        }
        if(getLevel()  == 2){
            g.drawLine(300,100,170,100);
            g.drawLine(300,300,300,100);
            repaint();
            System.out.println(level);
        }
        if(getLevel()  == 3){
            g.drawLine(250,100,300,150);
            g.drawLine(300,100,170,100);
            g.drawLine(300,300,300,100);
            repaint();
        }
        if(getLevel()  == 4){
            g.drawLine(170,100,170,123);
            g.drawLine(250,100,300,150);
            g.drawLine(300,100,170,100);
            g.drawLine(300,300,300,100);
            repaint();
        }
        if(getLevel()  == 5){
            g.drawOval(161,123,20,20);
            g.drawLine(170,100,170,123);
            g.drawLine(250,100,300,150);
            g.drawLine(300,100,170,100);
            g.drawLine(300,300,300,100);
            repaint();
        }
        if(getLevel()  == 6){
            g.drawLine(170,143,170,185);
            g.drawOval(161,123,20,20);
            g.drawLine(170,100,170,123);
            g.drawLine(250,100,300,150);
            g.drawLine(300,100,170,100);
            g.drawLine(300,300,300,100);
            repaint();
        }
        if(getLevel()  == 7){
            g.drawLine(170,160,150,150);
            g.drawLine(170,143,170,185);
            g.drawOval(161,123,20,20);
            g.drawLine(170,100,170,123);
            g.drawLine(250,100,300,150);
            g.drawLine(300,100,170,100);
            g.drawLine(300,300,300,100);
            repaint();
        }
        if(getLevel()  == 8){
            g.drawLine(170,160,190,150);
            g.drawLine(170,160,150,150);
            g.drawLine(170,143,170,185);
            g.drawOval(161,123,20,20);
            g.drawLine(170,100,170,123);
            g.drawLine(250,100,300,150);
            g.drawLine(300,100,170,100);
            g.drawLine(300,300,300,100);
            repaint();
        }
        if(getLevel()  == 9){
            g.drawLine(170,185,155,198);
            g.drawLine(170,160,190,150);
            g.drawLine(170,160,150,150);
            g.drawLine(170,143,170,185);
            g.drawOval(161,123,20,20);
            g.drawLine(170,100,170,123);
            g.drawLine(250,100,300,150);
            g.drawLine(300,100,170,100);
            g.drawLine(300,300,300,100);
            repaint();
        }
        if(getLevel()  == 10){
            g.drawLine(170,185,186,199);
            g.drawLine(170,185,155,198);
            g.drawLine(170,160,190,150);
            g.drawLine(170,160,150,150);
            g.drawLine(170,143,170,185);
            g.drawOval(161,123,20,20);
            g.drawLine(170,100,170,123);
            g.drawLine(250,100,300,150);
            g.drawLine(300,100,170,100);
            g.drawLine(300,300,300,100);
            repaint();
        }

    }

    public void setLevel(int level){
        this.level = level;
    }

    public int getLevel(){
        return level;
    }
}

in nem Panel wird bei jedme Buttondruck (nur zum Test) oder wie beim Hangman wenn ein falsches Wort eingegeben wurde ein Strich gezeichnet.

Nun habe ich festgestellt , dass wenn ich da Level neu setzte er nicht überprüft, wie hoch es ist und dementsprechend zeichnet ( er geht nicht in die paint Methode ren) (deshalb die Printlns bei der Abfrage 😉)


Hier mein Panel:
Java:
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
import java.util.ArrayList;

public class testPanel extends JPanel{
	
	private Button addtest;
	private HangmanGraphic h = new HangmanGraphic();
	private Panel p1,p2;
	public testPanel(){
		addtest = new Button("Listadd");
		
		p1 = new Panel();
		p2 = new Panel();
		
		this.setLayout(new BorderLayout());
		this.add(p1,BorderLayout.CENTER);
		this.add(p2,BorderLayout.EAST);
		
		p1.add(new HangmanGraphic());
		p2.add(addtest);
		
		ActionHandler h = new ActionHandler();
	
		addtest.addActionListener(h);
		
		
	}
	private class ActionHandler implements ActionListener
    {
        public void actionPerformed(ActionEvent e){
        	if(e.getSource()==addtest){
        	    h.setLevel(h.getLevel()+1);
        	    repaint();
        	}
        }
    }
}


Die GUI Klasse :
Java:
import java.awt.*;
import javax.swing.*;

/**
 * GUI - Applikation des Hangman Spiels
 * 

 * @version 2011-09-23
 */
public class testGUI extends JFrame
{
    public static void main(String[]args){
        new testGUI();
    }

    public testGUI(){
        setSize(500,500);
        setTitle("Hangman");
        setVisible(true);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        Container c = getContentPane();
        c.add(new testPanel());
    }
}

Repaint und sonstige Methoden schon alle ausprobiert.
Vielleicht kommt einer von euch drauf, wo das Problem liegt.

Vielen Dank schon im Voraus ,
Greez A0D0S0
 
Die Aufrufe von repaint() gehören/müssen aus der paint(...) von HangmanGraphic raus. (üblicherweise überschreibt man bei Swing Komponenten paintComponent(Graphics g))
Ich würde in der setLevel(...) am Ende ein repaint() aufrufen.
Dann existieren zwei Objekte von Typ HangmanGraphic und der ActionListener ruft setLevel an dem auf, welches nicht in der GUI verbaut ist.

Tipp: Wenn man die zu zeichnenden Linien in einer List oder einem Array hält könnte man das levelabhängige Zeichnen des Galgens viel kompakter gestalten.
 
Jup, sowas wie
Java:
if(getLevel() >= 1) zeichneErsteLinie();
if(getLevel() >= 2) zeichneZweiteLinie();
if(getLevel() >= 3) zeichneDritteLinie();
...
würde auch schon helfen.... oder ein Array eben...
 
Die Aufrufe von repaint() gehören/müssen aus der paint(...) von HangmanGraphic raus. (üblicherweise überschreibt man bei Swing Komponenten paintComponent(Graphics g))
Ich würde in der setLevel(...) am Ende ein repaint() aufrufen.
Dann existieren zwei Objekte von Typ HangmanGraphic und der ActionListener ruft setLevel an dem auf, welches nicht in der GUI verbaut ist.

Tipp: Wenn man die zu zeichnenden Linien in einer List oder einem Array hält könnte man das levelabhängige Zeichnen des Galgens viel kompakter gestalten.

Hallo,schonmal danke für die Antwort.

Habe jetzt alle repaints aus dere paint Methode entfernt und eins bei der setLevelMethode der Graphics - Class reingegeben, trotzdem keine Striche :/

greez A0D0S0
 
Nicht AWT (Panel, Frame) und Swing (JPanel, JFrame...) mischen. Lieber nur Swing.

Aufpassen welches HangmanGraphic dort zum anzeigen zum Panel hinzugefügt wird: Du hast ZWEI HangmanGraphic-Objekte erstellt.
Java:
class testPanel extends JPanel{

    private JButton addtest;
    private HangmanGraphic h = new HangmanGraphic();
    private JPanel p1,p2;
    public testPanel(){
        addtest = new JButton("Listadd");

        p1 = new JPanel();
        p2 = new JPanel();

        this.setLayout(new BorderLayout());
        this.add(p1,BorderLayout.CENTER);
        this.add(p2,BorderLayout.EAST);

        p1.add(h); // Hier das oben erstellte HangmanGraphic verwernden
        p2.add(addtest);

        ActionHandler h = new ActionHandler();

        addtest.addActionListener(h);


    }
    private class ActionHandler implements ActionListener
    {
        public void actionPerformed(ActionEvent e){
            if(e.getSource()==addtest){
                h.setLevel(h.getLevel()+1);
                repaint();
            }
        }
    }
}
 
wie gesagt erzeugst Du zwei HangmanGraphic Objekte einmal im Deklarationsteil und ein neues anonymes im Konstruktor. (hier sollte wohl eher das bereits exitierende verwendet werden)
 

Zurück
Oben