Hintergrundbild bei dieser uhr

MScalli

Erfahrenes Mitglied
Hi leutz.
habe eine Uhr im netz gefunden die eigentlich einwandfrei aussieht..
(also zeiger usw..)
habe bisschen was verändert und so würde es mir reichen.
jetzt wollte ich fragen ob ich da irgendwie nen hintergrund rein bekomme..
das Problem ist das jedes mal ein leeres rechteck über die gezeichnete uhr gelegt wird und dann neu gezeichnet wird.

hier mal der code
Code:
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.RenderingHints;
import java.util.Calendar;
import java.util.GregorianCalendar;

import javax.swing.JPanel;

public class ClockPanel extends JPanel {

    Image buffer;
    Graphics2D gBuffer;
    int LAENGE_SEC = 37;
    int LAENGE_MIN = 35;
    int LAENGE_HOU = 25;

    Calendar date;

    int nn=50, r=40; // Zentrum und Radius
    
    ClockPanel(){
    	setBounds(980,600,100,100);
    	
    	setVisible(true);
    }

    public void paint(Graphics g) {

        // Double-Buffering
        if (buffer==null) {
            buffer=createImage(this.getSize().width, this.getSize().height);
            gBuffer=(Graphics2D)buffer.getGraphics();
        }
        gBuffer.clearRect(0,0,this.getSize().width, this.getSize().height);

        // Antialiasing
        gBuffer.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);

        //gBuffer.drawOval(nn-2,nn-2,4,4);

        // Striche bei 3, 6, 9 und 12 Uhr
        for (int i=0;i<4;i++) {
            gBuffer.drawLine(nn+(int)((r-7)*Math.cos(Math.toRadians(90*i))),nn+(int)((r-7)*Math.sin(Math.toRadians(90*i))),nn+(int)(r*Math.cos(Math.toRadians(90*i))),nn+(int)(r*Math.sin(Math.toRadians(90*i))));
        }
        // Striche bei jeder Stunde
        for (int i=0;i<12;i++) {
            gBuffer.drawLine(nn+(int)((r-5)*Math.cos(Math.toRadians(30*i))),nn+(int)((r-5)*Math.sin(Math.toRadians(30*i))),nn+(int)(r*Math.cos(Math.toRadians(30*i))),nn+(int)(r*Math.sin(Math.toRadians(30*i))));
        }
        // Striche bei jeder Minute (optional)
        for (int i=0;i<60;i++) {
            gBuffer.drawLine(nn+(int)((r-2)*Math.cos(Math.toRadians(6*i))),nn+(int)((r-2)*Math.sin(Math.toRadians(6*i))),nn+(int)(r*Math.cos(Math.toRadians(6*i))),nn+(int)(r*Math.sin(Math.toRadians(6*i))));
        }

        date = new GregorianCalendar();

        int hours = date.get(Calendar.HOUR_OF_DAY);
        int minutes = date.get(Calendar.MINUTE);
        int seconds = date.get(Calendar.SECOND);

        // Stunden
        gBuffer.drawLine(nn,nn,nn+(int)(LAENGE_HOU*Math.cos(Math.toRadians(hours%12*30+minutes/2.0-90))),nn+(int)(LAENGE_HOU*Math.sin(Math.toRadians(hours%12*30+minutes/2.0-90))));

        // Minuten
        gBuffer.drawLine(nn,nn,nn+(int)(LAENGE_MIN*Math.cos(Math.toRadians(minutes*6-90))),nn+(int)(LAENGE_MIN*Math.sin(Math.toRadians(minutes*6-90))));

        // Sekunden
        gBuffer.drawLine(nn,nn,nn+(int)(LAENGE_SEC*Math.cos(Math.toRadians(seconds*6-LAENGE_SEC))),nn+(int)(LAENGE_SEC*Math.sin(Math.toRadians(seconds*6-LAENGE_SEC))));

        g.drawImage (buffer, 0, 0, this);

        // Verzögerung
        try {Thread.sleep(50);}
        catch (InterruptedException e) {}

        repaint();
    }

    public void update(Graphics g) {paint(g);}
    
}

am coolsten wär hier ja ein rundes JPanel.. und dann ein rundes Zifffernblatt als hintergrund!!

ein hintergrundbild einzubinden wär nicht das problem.. geht bei meinem desktop so
Code:
        desktop = new JDesktopPane() {
	        @Override 
	        public void paint( Graphics g )
	        {
	        	g.drawImage(MyParam.ICON_BACKGROUND.getImage(), 0, 0, getSize().width, getSize().height, null);
	        	super.paint(g);
	        }
        };

aber ob das bei diesem JPanel geht weiss ich echt nicht.. also ich habs leider noch nicht geschafft..
kann mir mal helfen bitte

schon mal thx im vorraus

gruss
MScalli
 
Hallo,

was ist denn genau dein Problem?

Könntest du vielleicht mal nen Screenshot posten?

MFG

Sascha
 
würde ich gerne machen.. weiss leider nicht wie ich den posten kann ;)

das problem ist das die Zeiger gezeichnet werden und dannach wird mit clearRect() einfach ein Rechteck drüber gezeichnet, dann wieder die Zeiger und die skala sonst würden ja die alten zeiger auch stehen bleiben..
(sieht man gut wenn man die Zeile clearRect() einfach auskommentiert.
Ich hätte gerne ein Bild als hintergrund(also ne Uhr) und dann die Zeiger darauf!!

Habe auch versucht das einfach Transparent zu machen(mit setOpaque(true)) geht aber auch nicht.
 
Du kannst hier doch einfach Dateien anhängen.
Wenn du antwortest (nicht Direktantwort), dann scroll mal weiter runter.

Hast du diese Zeile schon mal in die paint()-Methode der Uhr gepackt?
Code:
g.drawImage(MyParam.ICON_BACKGROUND.getImage(), 0, 0, getSize().width, getSize().height, null);

MFG

Sascha
 
ja.. habs auch mit 2* repaint() versucht..
also zuerst das bild einfügen, dann repaint und dann

g.drawImage (buffer, 0, 0, this);

und wieder repaint()...
ging leider nicht.

also wenn ich nur die zeile
Code:
g.drawImage(MyParam.ICON_BACKGROUND.getImage(), 0, 0, getSize().width,getSize().height, null);

nehme wird halt das Bild angezeigt, aber die Zeiger nicht mehr gezeichnet.. (das passiert ja auch über drawImage(...)

Habe mal nen screenShot angehängt ;)
 

Anhänge

  • ScreenShot.jpg
    ScreenShot.jpg
    9,8 KB · Aufrufe: 93
Versuch es mal mir der Uhr
Java:
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.RenderingHints;
import java.util.Calendar;
import java.util.GregorianCalendar;

import javax.swing.JPanel;

public class ClockPanel extends JPanel {

    Image buffer;
    Graphics2D gBuffer;
    int LAENGE_SEC = 37;
    int LAENGE_MIN = 35;
    int LAENGE_HOU = 25;

    Calendar date;

    int nn=50, r=40; // Zentrum und Radius
    
    ClockPanel(){
    	setBounds(980,600,100,100);
    	
    	setVisible(true);
    }

    public void paint(Graphics g) {

        // Double-Buffering
        if (buffer==null) {
            buffer=new BufferedImage(this.getSize().width, this.getSize().height,BufferedImage.TYPE_INT_ARGB);
            gBuffer=(Graphics2D)buffer.getGraphics();
        }
        gBuffer.clearRect(0,0,this.getSize().width, this.getSize().height);

        // Antialiasing
        gBuffer.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);

        //gBuffer.drawOval(nn-2,nn-2,4,4);

        // Striche bei 3, 6, 9 und 12 Uhr
        for (int i=0;i<4;i++) {
            gBuffer.drawLine(nn+(int)((r-7)*Math.cos(Math.toRadians(90*i))),nn+(int)((r-7)*Math.sin(Math.toRadians(90*i))),nn+(int)(r*Math.cos(Math.toRadians(90*i))),nn+(int)(r*Math.sin(Math.toRadians(90*i))));
        }
        // Striche bei jeder Stunde
        for (int i=0;i<12;i++) {
            gBuffer.drawLine(nn+(int)((r-5)*Math.cos(Math.toRadians(30*i))),nn+(int)((r-5)*Math.sin(Math.toRadians(30*i))),nn+(int)(r*Math.cos(Math.toRadians(30*i))),nn+(int)(r*Math.sin(Math.toRadians(30*i))));
        }
        // Striche bei jeder Minute (optional)
        for (int i=0;i<60;i++) {
            gBuffer.drawLine(nn+(int)((r-2)*Math.cos(Math.toRadians(6*i))),nn+(int)((r-2)*Math.sin(Math.toRadians(6*i))),nn+(int)(r*Math.cos(Math.toRadians(6*i))),nn+(int)(r*Math.sin(Math.toRadians(6*i))));
        }

        date = new GregorianCalendar();

        int hours = date.get(Calendar.HOUR_OF_DAY);
        int minutes = date.get(Calendar.MINUTE);
        int seconds = date.get(Calendar.SECOND);

        // Stunden
        gBuffer.drawLine(nn,nn,nn+(int)(LAENGE_HOU*Math.cos(Math.toRadians(hours%12*30+minutes/2.0-90))),nn+(int)(LAENGE_HOU*Math.sin(Math.toRadians(hours%12*30+minutes/2.0-90))));

        // Minuten
        gBuffer.drawLine(nn,nn,nn+(int)(LAENGE_MIN*Math.cos(Math.toRadians(minutes*6-90))),nn+(int)(LAENGE_MIN*Math.sin(Math.toRadians(minutes*6-90))));

        // Sekunden
        gBuffer.drawLine(nn,nn,nn+(int)(LAENGE_SEC*Math.cos(Math.toRadians(seconds*6-LAENGE_SEC))),nn+(int)(LAENGE_SEC*Math.sin(Math.toRadians(seconds*6-LAENGE_SEC))));

        g.drawImage (buffer, 0, 0, this);

        // Verzögerung
        try {Thread.sleep(50);}
        catch (InterruptedException e) {}

        repaint();
    }

    public void update(Graphics g) {paint(g);}
    
}

Ich hab es nicht getestet, aber so könnte es gehen.


Noch ein kleiner Hinweis. Pushposting sind hier nicht erlaubt. Aus diesem Grund habe ich diesen Post auch wieder gelöscht.

MFG

Sascha

MFG

Sascha
 
Pushposting heisst wenn ich nach ner zeit noch mal nachfrage
OK.. sry.

Werde das sofort mal testen.
 
ne, bekomm das hintergrundbild so auch nicht rein.
habe es auch mit opaque versucht(bei dem BufferedImage).

der einzige unterschied ist das der hintergrund jetzt die Farbe der Zeiger angenommen hat(schwarz) und die Zeiger die Farbe des Hintergrundes(weiss);

Ich bekomms nicht in den Griff..
eigentlich muss ich doch nur statt dem clerRect ein bild drüber legen und dann die Zeiger und die skala neu drauf zeichnen..
Weiss echt nicht mehr weiter
 
Mir konnte in nem anderen Forum geholfen werden..
des Rätsels lösung nach gBuffer.setRenderingHint diese Zeile einfügen..

Code:
gBuffer.drawImage(MyParam.ICON_BACKGROUND.getImage(), 0, 0, getSize().width, getSize().height, null);
 
Zurück