# GlassPane



## jorgeHX (24. November 2004)

hallo,
ich habe ja seit langer Zeit dieses Malproblem. 
Dazu habe ich mir folgende Idee überlegt.

1. Ich schaffe mir eine LayeredPane, in der ich alle Sachen, wie Toolbar oder Background-Image des Editors auf der hintersten Ebene anordne und lege dann ein JLabel mit meinem Graphics2D-Objekt auf Ebene1. Frage ist, wie kann ich denn die Ebene1 transparent machen, so dass man das Hintergrundbild noch sieht? Das Malen würde ja dann auf Ebene 1 ablaufen.

2. Ich dachte an eine GlassPane, die ich über den Editorbereich lege. Allerdings ist der Editorbereich eine JComponent die ich der contentPane dann hinzufügen würde. Wie kann ich denn über diese Componente eine GlassPane legen?

Vielleicht kennt ja jemand die Problematik und kann mir hier Ideen oder seine Lösungen vorschlagen,

Gruß,
Jorge


----------



## Snape (24. November 2004)

*Zu Frage 1*



			
				jorgeHX hat gesagt.:
			
		

> hallo,
> ich habe ja seit langer Zeit dieses Malproblem.
> Dazu habe ich mir folgende Idee überlegt.
> 
> 1. Ich schaffe mir eine LayeredPane, in der ich alle Sachen, wie Toolbar oder Background-Image des Editors auf der hintersten Ebene anordne und lege dann ein JLabel mit meinem Graphics2D-Objekt auf Ebene1. Frage ist, wie kann ich denn die Ebene1 transparent machen, so dass man das Hintergrundbild noch sieht? Das Malen würde ja dann auf Ebene 1 ablaufen.



Die Ebene, die durchsichtig sein soll, entsprechend auf durchsichtig setzen mittels setOpaque(false)


----------



## jorgeHX (24. November 2004)

Hallo snape,
bist du dir ganz sicher, dass ich dann auf der LayeredPane in Ebene 1 herummalen kann und die Veränderung dennoch auf der darunterliegenden Pane (in diesem Fall mein Hintergrundbild) zu sehen ist?

Das wäre ja dann ein Traum, da ich dann jegliches Malen auf der Ebene1 erledigen könnte und darüberhinaus das eigentliche Bild nicht ansprechen würde.

Kannst du mir vielleicht auch kurz verraten wie ich dann auf der transparenten Ebene1 einen gemalten Punkt wieder verschwinden lassen kann, d.h. in quasi transparent wieder übermalen kann?

Damit wäre mein Problem dann endlich gelöst 

Super vielen Dank, wenn das echt klappt.

Jorge


----------



## jorgeHX (25. November 2004)

*Re: Zu Frage 1*

Ich habe das so gemacht wie du es gesagt hast. Auf der hinteren Ebene liegt mein Bild als JLabel in einem Panel verpackt und der LayeredPane hinzugefügt. Davor liegt (eine Ebene höher) eine JComponent (mit einem Graphics2D-Objekt) welche ich ebenfalls der LayeredPane hinzufüge. Leider ist die vordere Ebene komplett schwarz so dass ich zwar zeichnen kann, aber das Hintergrundbild nicht sehe.

HILFE, bitte


----------



## jorgeHX (25. November 2004)

*Re: Zu Frage 1*

Leider ist es doch noch nicht transparent. Ich hatte einen Fehler gemacht.  
Mein BufferedImage erscheint immer pechschwarz und ist nicht durchsichtig. Woran kann das denn liegen?


----------



## Snape (25. November 2004)

*Re: Zu Frage 1*



			
				jorgeHX hat gesagt.:
			
		

> Leider ist es doch noch nicht transparent. Ich hatte einen Fehler gemacht.
> Mein BufferedImage erscheint immer pechschwarz und ist nicht durchsichtig. Woran kann das denn liegen?



Evtl. am Grafikformat. Nicht alle Grafikformate sind transparent. png ist es z.B.


----------



## jorgeHX (25. November 2004)

*Re: Zu Frage 1*

guten morgen snape,
also ich habe jpg-Bilder hier. Aber eigentlich ist das doch gar nicht wichtig oder? immerhin ist ja nur ein Bild im Spiel, nämlich das in der hinteren Ebene.

Ich poste hier mal die paint-Methode. Vielleicht fällt dir ja mein Fehler auf.


```
// overwrites the paint-Method
   public void paintComponent(Graphics g){
      super.paintComponent(g);
      Graphics2D g2d = (Graphics2D)g;
      Rectangle bounds = getBounds();
      // the offScreenImage has to be created to begin
      if((width <=0) || (height <=0) ||
         (width != bounds.width) ||
         (height != bounds.height)){
         createScreenImage(bounds.width, bounds.height);
         width = bounds.width;  // unbedingt nötig, sonst wird nicht gezeichnet
         height = bounds.height;
       }
       // draws the shape depending on the new position of the mouse
       g2d.drawImage(scrImage, 0,0,thumbWidth, thumbHeight, this);
   }
```

hier nun die Methode createScreenImage in gekürzter Version


```
// creats a new BufferedImage with RGB color
   public void createScreenImage(int wid, int ht){
    
      try{
          int thumbWidth = 750;
          int thumbHeight = 550;
          scrImage = new BufferedImage(thumbWidth, thumbHeight, BufferedImage.TYPE_INT_BGR);
          scrGraphic = scrImage.createGraphics();
          scrGraphic.setRenderingHint(RenderingHints.KEY_INTERPOLATION,
                                      RenderingHints.VALUE_INTERPOLATION_BILINEAR);


          scrGraphic.setColor(Color.BLACK);
        }
        catch(Exception e){
        
      }
  }
```

Das gesamte Konstrukt liegt in einer Klasse die von JComponent erbt und welche der LayeredPane in Ebene0 (oberste Ebene) hinzugefügt wird....

Siehst du meinen Fehler?


----------



## Snape (25. November 2004)

*Re: Zu Frage 1*

Mal eine Frage nebenbei:
Warum legst Du das Bild nicht in ein JLabel und dieses entweder direkt auf die LayeredPane oder in ein umgebendes Panel?


----------



## jorgeHX (25. November 2004)

*Re: Zu Frage 1*

also das Hintergrundbild lege ich ja auch so in die LayeredPane.

```
...
// bestimme das Hintergrundbild
    JLabel icon_l = new JLabel();
    icon_l.setBounds(42,24,798,598);
    try{
      ImageIcon icon1 = new ImageIcon(uebungDAO.getGrafik());
      icon_l.setIcon(icon1);
      icon_l.setHorizontalAlignment(icon_l.CENTER);
      icon_l.repaint();
    }
    catch (Exception e){

    }
    layeredPane.add(icon_l, 1);
    
    grBild.setBounds(80,24,760,598);
    layeredPane.add(grBild, 0);
```

grBild ist in diesem Fall mein JComponet mit der oben genannten Paint-Methode. Ich will halt im Panel über dem Hintergrundbild meine Zeichnerei durchführen und zwar deswegen, da ich dann das Bild nicht verändere, bis ich definitiv auf speichern klicke. Dann soll alles gezeichnete in das Bild eingetragen und abgespeichert werden...

Ich dachte eben, dass das die einzige Möglichkeit ist, um verschiedene Objekte auf einem Hintergrundbild zu zeichnen, die dann während des Malprozesses noch verschoben oder gelöscht werden können. 
Wenn ich ja direkt auf das Hintergrundbild male, kann ich ja gezeichnete Shapes nicht wieder so löschen oder verschieben ohne dass das Erscheinungsbild verunstaltet wird.

Verstehst du was ich machen will?

Nochmals vielen Dank, dass du dir die Zeit nimmst.


----------



## jorgeHX (25. November 2004)

*Re: Zu Frage 1*

wenn du nen anderen Vorschlag hast, wie ich mein Zeichnenproblem bewältigen könnte, wäre ich auch begeistert 
Im Moment verzweifle ich daran... oder eher seit Montag verzweifle ich dran


----------



## Snape (25. November 2004)

*Re: Zu Frage 1*

Hi,
sorry, so recht verstehe ich das in der Tat nicht. So viel habe ich mit einer LayeredPane auch noch nicht gemacht, außer einer kleinen Erweiterung des Beispiels aus den Sun Tutorials. Hilft Dir das nicht weiter? Sorry, scheint mir zu sehr in die Tiefe zu gehen, habe derzeit aber anderes zu tun.


----------

