GlassPane

jorgeHX

Erfahrenes Mitglied
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
 
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)
 
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
 
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
 
Re: Zu Frage 1

Leider ist es doch noch nicht transparent. Ich hatte einen Fehler gemacht. :rolleyes:
Mein BufferedImage erscheint immer pechschwarz und ist nicht durchsichtig. Woran kann das denn liegen?
 
Zuletzt bearbeitet:
Re: Zu Frage 1

jorgeHX hat gesagt.:
Leider ist es doch noch nicht transparent. Ich hatte einen Fehler gemacht. :rolleyes:
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.
 
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.

Code:
// 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

Code:
// 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?
 
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?
 
Re: Zu Frage 1

also das Hintergrundbild lege ich ja auch so in die LayeredPane.
Code:
...
// 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.
 
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
 
Zurück