tutorials.de Buch-Aktion 05/2012
ERLEDIGT
NEIN
ANTWORTEN
10
ZUGRIFFE
1305
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    jorgeHX jorgeHX ist offline Mitglied Brokat
    Registriert seit
    Jun 2004
    Beiträge
    253
    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
     

  2. #2
    Registriert seit
    Apr 2004
    Ort
    Ruhrgebiet
    Beiträge
    1.582
    Zitat Zitat von jorgeHX
    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)
     

  3. #3
    jorgeHX jorgeHX ist offline Mitglied Brokat
    Registriert seit
    Jun 2004
    Beiträge
    253
    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
     

  4. #4
    jorgeHX jorgeHX ist offline Mitglied Brokat
    Registriert seit
    Jun 2004
    Beiträge
    253
    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
     

  5. #5
    jorgeHX jorgeHX ist offline Mitglied Brokat
    Registriert seit
    Jun 2004
    Beiträge
    253
    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?
    Geändert von jorgeHX (25.11.04 um 10:23 Uhr)
     

  6. #6
    Registriert seit
    Apr 2004
    Ort
    Ruhrgebiet
    Beiträge
    1.582
    Zitat Zitat von jorgeHX
    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.
     

  7. #7
    jorgeHX jorgeHX ist offline Mitglied Brokat
    Registriert seit
    Jun 2004
    Beiträge
    253
    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 :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    
    // 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 :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    
    // 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?
     

  8. #8
    Registriert seit
    Apr 2004
    Ort
    Ruhrgebiet
    Beiträge
    1.582
    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?
     

  9. #9
    jorgeHX jorgeHX ist offline Mitglied Brokat
    Registriert seit
    Jun 2004
    Beiträge
    253
    also das Hintergrundbild lege ich ja auch so in die LayeredPane.
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    
    ...
    // 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.
     

  10. #10
    jorgeHX jorgeHX ist offline Mitglied Brokat
    Registriert seit
    Jun 2004
    Beiträge
    253
    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
     

  11. #11
    Registriert seit
    Apr 2004
    Ort
    Ruhrgebiet
    Beiträge
    1.582
    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.
     

Ähnliche Themen

  1. "Loch" ins GlassPane
    Von MScalli im Forum Swing, Java2D/3D, SWT, JFace
    Antworten: 3
    Letzter Beitrag: 29.10.09, 15:07
  2. GUI friert ein! (Thread,GUI,EDT,GLASSPANE)
    Von benhaze im Forum Swing, Java2D/3D, SWT, JFace
    Antworten: 2
    Letzter Beitrag: 09.01.09, 15:25
  3. Glasspane wird nciht angezeigt
    Von LightBear im Forum Swing, Java2D/3D, SWT, JFace
    Antworten: 2
    Letzter Beitrag: 07.08.08, 13:25
  4. Frage zur GlassPane
    Von AzraelCole im Forum Swing, Java2D/3D, SWT, JFace
    Antworten: 3
    Letzter Beitrag: 07.07.06, 23:55
  5. GlassPane reagiert nicht auf listener
    Von mrno im Forum Java
    Antworten: 11
    Letzter Beitrag: 30.03.06, 22:10