Hintergrund bei meiner Uhr

Status
Nicht offen für weitere Antworten.

MScalli

Bekanntes Mitglied
Hi Leutz.
Ich hoffe ich werde nicht verschoben, aber das Thema passt irgendwie übewrall rein ;)

Ich habe diese Frage schon in nem anderen Forum gestellt, aber es wurde leider nicht gelöst.
Ich hab nen JDesktopPane und auf diesen adde Ich das JPanel ClockPanel

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);}
    
}

jetzt ist mein Problem das ich jede sekunde das Rechteck "sauber" mache und dann alles neu Zeichne.
Deswegen bekomme ich kein Hintergrundbild rein(soll mal ein Ziffernblatt dahinter stehen).

das Problem in dieser Klasse das ich die drawImage() Methode schon gebrauche.. und deswegen das bild nicht einbinden kann. Denn sonst mache ich es so

Code:
g.drawImage(MyParam.ICON_BACKGROUND.getImage(), 0, 0, getSize().width, getSize().height, null);

kann mir bitte wer helfen.
mache da schon paar tage rum aber bekomm es einfach nicht hin.
Ich will doch nur nen hintergrund und dann die Zeiger darauf zeichnen!!

Danke schon mal..
MScalli
 

Quaxli

Top Contributor
Und warum geht nicht

Code:
gbuffer.drawImage(MyParam.ICON_BACKGROUND.getImage(), 0, 0, getSize().width, getSize().height, null);

in Zeile 40? :bae:
 

MScalli

Bekanntes Mitglied
:applaus: Ich verneige mich ehrfürchtig :applaus:

Ich hab die Zeile überall ausprobiert und habs nicht hin bekommen..
fast 3 tage such ich schon nach ner möglichkeit....

vielen vielen dank Quaxli..

weisst du evtl auch wie ich das alles durchsichtig machen könnte??
also praktisch nur die Zeiger und Ziffernblatt zeichnen und im Hintergrund bleibt mein Hintergrundbild des ganzen Desktop erhalten. geht das ??
 

Quaxli

Top Contributor
Nur über einen Umweg. Google mal nach Killer Game Programming. Da gibt's ein Beispiel für "nicht-rechteckige" GUI's. Das ist in etwa was Du brauchst. Vorgehensweise in Stichworten:

- man nimmt ein Window und setzt es auf undecorated
- über Robot holt man sich das Image eines Screenshot vom Bereich, den das Fenster einnimmt
- diese Screenshot malt man als Hintergrundbild
- dann muß man über geeignete Listener sicherstellen, daß beim Verschieben des Fensters der Hintergrund wieder kopiert wird

Eine einfache Lösung gibt's meines Wissens nicht.
 

MScalli

Bekanntes Mitglied
Ja ok. wär nur ein Bonus gewesen ^^
wenns soviel arbeit ist, und warscheinlich nen haufen power schluckt lass ich das.

Hintergrundbild reicht mir vollkommen aus ..
nochmal dankööööööö!!!
 

MScalli

Bekanntes Mitglied
Sry das ich den Thread noch mal öffne..
aber ich hab jetzt nen weg gefunden das JPanel rund darzustellen.. und der hintergrund würde so bleiben.

leider werden(das glaub ich zumindest) jetzt meine zeiger unsw in der selben Farbe dargestellt und deswegen sieht man nur ein rundes JPanel.

jetzt die Frage..
wie kann ich mitten in der paint methode die Farbe ändern(also nach fillOval).. dann müsste ich es nur noch schaffen zuerst das fillOval zu machen, dann zeichnen.. dann die Farbe umstellen.. und dann wieder zeichnen.

habs mit setColor probiert und repaint nach dem fillOval, dann den rest zeichnen und wieder ein repaint.. aber das geht leider nicht.

hier mal der Code

Code:
  import java.awt.Color;
import java.awt.Graphics;
  import java.awt.Graphics2D;
  import java.awt.Image;
  import java.awt.RenderingHints;
  import java.awt.image.BufferedImage;
  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);
          gBuffer.fillOval(0,0,this.getSize().width, this.getSize().height);

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

          
          // 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);}


  }

wenn das irgendwie geht müsste ich nur noch ein rundes gif als hintergrund einfügen(die ecken müssten durchsichtig sein.. und es wär perfekt ;)
 

MScalli

Bekanntes Mitglied
ne, so habe ich es schon probiert.
dann ist der ganze Kreis in dieser Farbe..

weiss leider nicht wie ich nen screenshot einbinden kann, aber ich glaube due weisst wie ich das meine..
ich glaube er zeichnet das erst alles bei draw image, und dann hat alles ja die selbe farbe.. oder?!?![/img]

EDIT: wenn ich die Farbe in der paint() methode ändere gehts..
ging aber gestern abend nicht.. komisch..!!

Noch mal danke, häng mich noch bisschen rein um das zu ner richtig schönen uhr zu machen ;)
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
berserkerdq2 Jemand einen Tipp wie man ein Javafx-Hintergrund "dynamisch" macht Allgemeine Java-Themen 3
B Login für User, der im Hintergrund Schedules ausführt Allgemeine Java-Themen 16
G BlueJ Hintergrund Allgemeine Java-Themen 10
Aruetiise LayoutManager JButton in den Hintergrund Allgemeine Java-Themen 7
I Programm im Hintergrund bei Windows zur Steuerung der Tastatur nutzen Allgemeine Java-Themen 2
S Allgemeine parallelisierte Loesung um Daten im Hintergrund zu laden..? Allgemeine Java-Themen 6
x22 Hintergrund in Netbeans ändern Allgemeine Java-Themen 3
E Hintergrund einer JTable änden Allgemeine Java-Themen 2
J Java-Programm im Hintergrund Allgemeine Java-Themen 3
P Hintergrund-Transparent PNG imageMerge Allgemeine Java-Themen 11
C Programm das im Hintergrund läuft Allgemeine Java-Themen 2
L Problem mit Hintergrund bei JAVA Applet Allgemeine Java-Themen 27
S BufferedImage mit Transparenten Hintergrund Allgemeine Java-Themen 4
F JFrame zeigt Hintergrund und nicht den Inhalt Allgemeine Java-Themen 12
F Programm im Hintergrund Allgemeine Java-Themen 8
G java Programm im Hintergrund laufen lassen Allgemeine Java-Themen 8
M Threads starten und im Hintergrund ablaufen lassen Allgemeine Java-Themen 11
K Bildschirm Hintergrund ändern Allgemeine Java-Themen 19
S Java Programm soll im Hintergrund laufen (vgl. fork() bei C) Allgemeine Java-Themen 10
J JDialog Bild als Hintergrund Allgemeine Java-Themen 19
E Methoden im Hintergrund ausführern Allgemeine Java-Themen 5
J Wie mache ich den Hintergrund einer Image durchsichtig? Allgemeine Java-Themen 7
B Hintergrund bei Swing Allgemeine Java-Themen 6
U OOP Warum kann ich aus meiner Methode keinen String auslesen Allgemeine Java-Themen 4
D Scrollbalken in meiner JTable auf einmal weg. Allgemeine Java-Themen 2
R excel aus meiner java-applicatin öffnen Allgemeine Java-Themen 8
C Frage bzgl. der Benennung meiner Anwendung Allgemeine Java-Themen 5
S Problem mit meiner generischen Klasse Allgemeine Java-Themen 5
M Probleme beim ausführen meiner Klasse Allgemeine Java-Themen 8
M Ideen zu meiner Studienarbeit Allgemeine Java-Themen 5
2 Fehler bei meiner Splitfunktion? Allgemeine Java-Themen 3
D Pfad zu meiner anwendung? Allgemeine Java-Themen 13

Ähnliche Java Themen

Neue Themen


Oben