# neuzeichnen von graphics nach minimierung oder ähnlichem



## housemusic (16. Mrz 2007)

hallo, 
ich habe folgendes problem
 ich habe ein fenster, in dem ich einen graphen zusammenbasteln kann. doch sobald ich minimiere oder ein 
aderes fenster überlagere und danach wegziehe, ist nur noch das bild des jlabels zu erkennen. wie kann ich das ändern? 
ich habe bereits alle zu zeichnenen sachen in collections und einen knopf, um alles neu zu zeichnen, aber das ist ja nicht das gelbe vom ei. 
wie macht man sowas ? (habe auch mit diversen listenern probiert, dass die aktion automatisch aufgerufen wird, aber das ist wohl von der laune meines pcs abhängig, wann er das macht und wann nicht) 
also wie kriege ich meine graphicen ordentlich auf mein JLayeredFrame gebannt ? 

mfg
stephan


foto des frames:


----------



## André Uhres (17. Mrz 2007)

Jede JComponent hat eine Methode "protected void paintComponent(Graphics g)".
Diese musst du überschreiben und auf das Graphics Objekt "g" zeichnen.
"paintComponent" wird vom System automatisch aufgerufen, 
wenn die Komponente neu gezeichnet werden muss.


----------



## housemusic (17. Mrz 2007)

sorry aber auf dem gebiet bin ich dann wohl noch anfänger. 
ich hab die methode 

```
public void paintKante(Graphics g, pKante pka)
	{
		g.drawLine(pka.getX1()+7, pka.getY1()+7, pka.getX2()+7, pka.getY2()+7);
		int xx=(pka.getX1()+pka.getX2())/2;
		int yy=(pka.getY1()+pka.getY2())/2;
		g.setColor(Color.BLUE);
		g.drawString(""+pka.getGewicht(), xx ,yy);
		g.setColor(Color.BLACK);
		
	}
```

und die wird im mouselistener aufgerufen 



```
paintKante(Boden.getGraphics(), pka);
```

was genau muss ich jetzt tun, damit die bleiben? wie überschreib ich sowas was muss ich dazu machen ? 

gruß 
stephan


----------



## Wildcard (17. Mrz 2007)

Um mir erneute lange Erklärungen zu sparen warum das falsch ist, such einfach mal hier nach getGraphics


----------



## André Uhres (17. Mrz 2007)

housemusic hat gesagt.:
			
		

> ..was genau muss ich jetzt tun, damit die bleiben? wie überschreib ich sowas was muss ich dazu machen ? ..


Überschreiben geht so:

```
boden = new JLabel(){
            protected void paintComponent(final Graphics g) {
                super.paintComponent(g);
                paintKante(g, pka);
            }
        };
```
Um "paintKante" aus einer anderen Methode aufzurufen: 
	
	
	
	





```
boden.repaint();
```
Und hier ein kleines Demoprogramm:

```
package paint;
/*
 * GrafikDemo.java
 */
import java.awt.*;
import java.awt.event.*;
import java.net.*;
import javax.swing.*;
public class GrafikDemo extends JFrame {
    private JLabel boden;
    private pKante pka = new pKante();
    public GrafikDemo() {
        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        setSize(400,300);
        setResizable(false);
        setLocationRelativeTo(null);
        boden = new JLabel(){
            protected void paintComponent(final Graphics g) {
                super.paintComponent(g);
                paintKante(g, pka);
            }
        };
        initBoden();
        add(boden);
    }
    private void initBoden() {
        URL url = null;//url für das Hintergrundbild
        try {
            url = new URL("http://www.bigfoto.com/themes/nature/sky/clouds-v7u2.jpg");
        } catch (MalformedURLException ex) {
            ex.printStackTrace();
        }
        boden.setIcon(new ImageIcon(url));
        JButton button = new JButton("TEST");
        button.setBounds(150, 240, 100, 25);
        boden.add(button);
        button.addActionListener(new ActionListener() {
            public void actionPerformed(final ActionEvent e) {
                doButtonAction(e);
            }
        });
    }
    private void doButtonAction(final ActionEvent e){
        System.out.println("doButtonAction");
        pka.x1 = 200;
        boden.repaint();
    }
    public void paintKante(final Graphics g, final pKante pka) {
        g.drawLine(pka.getX1()+7, pka.getY1()+7, pka.getX2()+7, pka.getY2()+7);
        int xx=(pka.getX1()+pka.getX2())/2;
        int yy=(pka.getY1()+pka.getY2())/2;
        g.setColor(Color.BLUE);
        g.drawString(""+pka.getGewicht(), xx ,yy);
        g.setColor(Color.BLACK);
    }
    public static void main(final String args[]) {new GrafikDemo().setVisible(true);}
}
class pKante{
    public int x1 = 0;
    public int getX1() {return x1;}
    public int getY1() {return 150;}
    public int getX2() {return 100;}
    public int getY2() {return 100;}
    public int getGewicht() {return 50;}
}
```
Tipp: um Verwechslungen auszuschliessen, werden normalerweise die Variablennamen 
immer mit einem kleinem Anfangsbuchstaben geschrieben (Boden->boden) und die Klassennamen immer
mit einem grossem Anfangsbuchstaben (pKante->PKante).


----------



## Guest (17. Mrz 2007)

ja das sagt mir eclipse auch immer ^^ muss ich mir mal angewöhnen.
erstmal vielen dank für die antwort, das habe ich soweit alles hinbekommen und gut verstanden. 

aaabber jetzt kommts  :roll: 

ich will ja auf den boden nicht nur linien zeichnen, sondern auch die knotenpunkte und die namen. 


```
boden = new JLabel(){
            protected void paintComponent(final Graphics g) {
                super.paintComponent(g);
                paintKante(g, pka);
            }
        };
```

du rufst jetzt boden.repaint() auf aber wie kann ich da zwischen punkten, verbindungen und namen unterscheiden ? 
ich hab in der oberfläche bis jetzt so checkboxen gehabt, und je nach dem, welche ich aktiviert hatte, hat er was anderes gemalt. so, wie ich das jetzt verstanden hab, is das jetzt futsch ?


----------



## André Uhres (17. Mrz 2007)

Anonymous hat gesagt.:
			
		

> ..je nach dem, welche ich aktiviert hatte, hat er was anderes gemalt.
> so, wie ich das jetzt verstanden hab, is das jetzt futsch ?


All den Code, der etwas zeichnen soll , tust du ebenfalls in die Methode "paintComponent", 
und schon ist die Welt wieder in Ordnung   .


----------



## Gast (17. Mrz 2007)

ja das habe ich schon probiert. aber dann kommt immer alles auf einmal und ich hab auch keine globale kante und auch keine globalen knoten. muss die pKante global sein ?
na ja jedenfalls rufst du repaint() auf und dann kommt alles auf einmal, aber was is, wenn ich jetzt nur einen punkt machen will oder nur einen strich von a nach b ?

gruß
stephan


----------



## André Uhres (17. Mrz 2007)

Gast hat gesagt.:
			
		

> ja das habe ich schon probiert. aber dann kommt immer alles auf einmal ..


Was redest du denn da? Das war doch der Sinn der ganzen Operation, oder was? 
Ich zitiere: "neuzeichnen von graphics nach minimierung oder ähnlichem".
Da muss doch immer alles auf einmal kommen  :?


----------



## Gast (17. Mrz 2007)

ach so ist das gemeint!!!  na ja ich dachte, ich würde nur fehler machen beim zeichnen. 
also ich zeichne ganz normal wie sonst? 
also 
mouselistener click
{ if (selected mach knoten) mach einen knoten k(x,y), zeichne (knoten k, boden.getgraphics)
}

und dann soll ich in den windowlistener die methode packen ?
na ich werd das jetzt mal testen! 
glaub nich, dass das so geht aber mal probieren!


----------



## Guest (17. Mrz 2007)

JAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA DANKE DANKE !!!!!!!!!!!! ES GEEEHT    
kann es manchmal schwer sein, das leichte im leben zu finden! 

okay also als zusammenfassung, was ich bloß tun musste, um mein problem zu lösen, 



> public JLayeredPane boden=new JLayeredPane();


 =>


```
public JLayeredPane boden=new JLayeredPane()
	{
		
		private static final long serialVersionUID = 1L;

		protected void paintComponent(final Graphics g) 
		{
            super.paintComponent(g);
            repaintAlles();
		}
		
	};
```


wobei repaintAlles() ne methode ist, die aus zwei collections alle möglichen dinge, die schon auf das feld gepackt wurden, ausliest und schreibt. 

danke
-> problem gelöst


----------

