# Klasse in GUI einbinden



## A0D0S0 (25. Sep 2011)

Hallo, wir haben die Aufgabe für die Schule ein Hangman zu programmieren.

Meine Klassen stehen so weit , nur es gibt ein kleines Problem.

Die Klasse in der ich mein Strichmänchen zeichne ist eine extrene. Nun will ich diese in eine GUI einbinden 

[Java]
public class HangmanGraphic extends JPanel
{
    private int level;

    public void paintComponent(Graphics g){
        super.paintComponent(g);

        while(level < 10){
            if(level == 1){
                g.drawLine(300,300,300,100);
            }
            if(level == 2){
                g.drawLine(300,100,170,100);
            }
            if(level == 3){
                g.drawLine(250,100,300,150);
            }
            if(level == 4){
                g.drawLine(170,100,170,123);
            }
            if(level == 5){
                g.drawOval(161,123,20,20);
            }
            if(level == 6){
                g.drawLine(170,143,170,185);
            }
            if(level == 7){
                g.drawLine(170,160,150,150);
            }
            if(level == 8){
                g.drawLine(170,160,190,150);
            }
            if(level == 9){
                g.drawLine(170,185,155,198);
            }
            if(level == 10){
                g.drawLine(170,185,186,199);
            }
        }
        showMessageDialog(null,"Spiel beendet");
    }

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

    public int getLevel(){
        return level;
    }
}
[/code]

Das ist meine zeichen  - Klasse.

Die folgende Klasse ist die GUI:

```
public class HangmanPanel extends JPanel 
{
    private Button newGame, exit, WordList;
    private Label usedWordsRight,usedWordsFalse, showStatus;
    private Panel p1,p2;

    private Hangman h;
    private WordList w = new WordList();

    public HangmanPanel(){
        newGame = new Button("NEW GAME");
        exit = new Button("X");
        WordList = new Button("WORD LIST");

        usedWordsRight = new Label("right");
        usedWordsFalse = new Label("false");
        showStatus = new Label("status");

        p1 = new Panel();
        p2 = new Panel();

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

        p1.setLayout(new GridLayout(6,1));  
        p2.setLayout(new GridLayout(3,1));

        p1.add(newGame);
        p1.add(exit);
        p1.add(WordList);

        p2.add(showStatus);
        p2.add(usedWordsRight);
        p2.add(usedWordsFalse);

        ActionHandler h = new ActionHandler();
        newGame.addActionListener(h);
        exit.addActionListener(h);
        WordList.addActionListener(h);

    }
    private class ActionHandler implements ActionListener
    {
        public void actionPerformed(ActionEvent e){
            if(e.getSource()==newGame){
                h = new Hangman();
                showStatus.setText("");
                w.readWordList();
                h.arrange(w.newWord());
                h.scan(showStatus,usedWordsFalse,usedWordsRight);
                showStatus.setText(h.getStatus());
            }
            if(e.getSource()==exit){
                System.exit(0);
            }
            if(e.getSource()==WordList){
                WordListGUI wlg = new WordListGUI();
                wlg.setVisible(true);
                
            }
        }
    }
}
```

ich hab mir das einbinden so vorgstellt, dass es quasi eine bild in bild funktion ist.

Danke für die Antworten im vorraus !

greez A0D0S0


----------



## Gast2 (25. Sep 2011)

Hm, wo soll man da Anfangen..

Die paintComponent Methode der HangmanGraphic macht so gar keinen sinn. Du blockierst die Methode mit ner while-Schleife und am Ende sagst du dann "Spiel vorbei".
Das gehört da auf keinen Fall rein.

Deine Klasse HangmanGraphic erbt doch schon von JPanel, warum fügst du die nicht einfach irgendwo in dein Frame ein?


----------



## A0D0S0 (25. Sep 2011)

EikeB hat gesagt.:


> Hm, wo soll man da Anfangen..
> 
> Die paintComponent Methode der HangmanGraphic macht so gar keinen sinn. Du blockierst die Methode mit ner while-Schleife und am Ende sagst du dann "Spiel vorbei".
> Das gehört da auf keinen Fall rein.
> ...



Danke für die rasche antwort.
ich wei, dass muss ich mir nochmal anschauen.

Könntest du mir sagen wie ich das Panel in einen Fram einfüge ? 

greez A0D0S0


----------



## Gast2 (25. Sep 2011)

```
frame.add(deinPanel);
```

so wie du es mit den Panels p1 und p2 auch schon machst.

PS:
Man sollte idR nicht AWT und Swingkomponenten mischen.


----------



## A0D0S0 (25. Sep 2011)

EikeB hat gesagt.:


> ```
> frame.add(deinPanel);
> ```
> 
> ...




ich habs jetzt mit dem Befehl probiert. 
in testgraphic wird einfach nur ein Strich gezeichnet :



```
public class testgraphic extends JPanel
 {
     public void paintComponent(Graphics g){
        super.paintComponent(g);      
        g.drawLine(300,100,170,100);
    }
}
```

es wird trotzdem nichts angezeigt.

this.add(new testgraphic(),BorderLayout.NORTH);


----------



## Gast2 (25. Sep 2011)

du musst testgraphic noch ne preferredSize mitgeben.


----------



## A0D0S0 (25. Sep 2011)

EikeB hat gesagt.:


> du musst testgraphic noch ne preferredSize mitgeben.



ich hab diese Zeilen jetzt noch zu testgraphic hinzugefügt, selbes Ergebnis wie vorher.

Dimension d = new Dimension(100,100);
setPreferredSize(d);


----------



## Gast2 (25. Sep 2011)

Dann poste bitte mal nen KSKB wo der Fehler auftritt.

EDIT:
Wenn du die größe auf 100x100 gesetzt hast dann wird der Strich auch nicht sichtbar sein, weil er außerhalb davon gezeichnet wird.


----------



## A0D0S0 (25. Sep 2011)

tut mir leid wenn ich dumm frage aber was isn KSKB ?


----------



## Gast2 (25. Sep 2011)

Wenn du einmal mit der Maus dadrüber fährst dann wirds dir gesagt 

Siehe auch nochmal mein Edit.


----------



## A0D0S0 (25. Sep 2011)

und wie erstell ich son KSKB  ?


----------



## Gast2 (25. Sep 2011)

Indem du nen Stück Code postest den man ohne Probleme starten kann und der dein Problem wiederspiegelt.


----------



## A0D0S0 (25. Sep 2011)

nja , es lässt sich ausführen, die Linie wird nur nicht angezeigt .


----------



## Gast2 (25. Sep 2011)

Ja dann poste den Code doch bitte mal.


----------



## A0D0S0 (25. Sep 2011)

ALSO: im MVC prinzip:


Das Panel : 

```
import javax.swing.*;

/**
 * Beschreiben Sie hier die Klasse HangmanPanel.
 * 
 * @author (Ihr Name) 
 * @version (eine Versionsnummer oder ein Datum)
 */
public class HangmanPaneol extends JPanel 
{
    public HangmanPaneol(){
        this.add(new testgraphic());
    }
}
```

Die GUI:

```
import java.awt.*;
import javax.swing.*;
/**
 * GUI - Applikation des  Panels
 * 
 * @author Thomas Raab
 * @version 2011-09-23
 */
public class HangmanGoUI extends JFrame
{
    public static void main(String[]args){
        new HangmanGoUI();
    }

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

und jetzt noch die testgraphic:

```
import javax.swing.*;
import java.awt.*;
/**
 * Beschreiben Sie hier die Klasse testgraphic.
 * 
 * @author (Ihr Name) 
 * @version (eine Versionsnummer oder ein Datum)
 */
public class testgraphic extends JPanel
 {
     public void paintComponent(Graphics g){
        super.paintComponent(g);      
        g.drawLine(300,100,170,100);
        Dimension d = new Dimension(100,100);
        setPreferredSize(d);
    }
}
```


----------



## Gast2 (25. Sep 2011)

die PreferredSize darfst du nicht erst in der paintComponent Methode setzen, da isses zu spät.
=> im Kontruktor setzen.

Die Linie wird immernoch außerhalb von testgraphic gezeichnet, ist also nicht sichtbar.
=> Linie woanders zeichnen, oder das Panel größer machen

Nen paar Anmerkungen:
- Klassen schreibt man groß
- Warum nennst du die Klassen ...GoUI oder ...Paneol?  liest sich komisch...


----------



## A0D0S0 (25. Sep 2011)

EikeB hat gesagt.:


> die PreferredSize darfst du nicht erst in der paintComponent Methode setzen, da isses zu spät.
> => im Kontruktor setzen.
> 
> Die Linie wird immernoch außerhalb von testgraphic gezeichnet, ist also nicht sichtbar.
> ...




1) testgraphic hat keinen Konstruktor ?
2) ich weiß nicht genau was du meinst mit auserhalb

greez A0D0S0


----------



## Gast2 (25. Sep 2011)

A0D0S0 hat gesagt.:


> 1) testgraphic hat keinen Konstruktor ?


Dann erstell einen.
Oder setz die preferredSize über die Referenz die du in HangmanPaneol erstellst.



A0D0S0 hat gesagt.:


> 2) ich weiß nicht genau was du meinst mit auserhalb


Das Panel hat von dir die Größe 100x100 bekommen, der Strich wird aber irgendwo bei (300/100, 170/100) gezeichnet, ist also nichtmehr zu sehen


----------



## A0D0S0 (25. Sep 2011)

EikeB hat gesagt.:


> Dann erstell einen.
> Oder setz die preferredSize über die Referenz die du in HangmanPaneol erstellst.
> 
> 
> Das Panel hat von dir die Größe 100x100 bekommen, der Strich wird aber irgendwo bei (300/100, 170/100) gezeichnet, ist also nichtmehr zu sehen



danke, hat geklappt


----------

