2D-Grafik Problem mit Variablen

scott84

Mitglied
Lieder ist mir keine passende Beschreibung in den Sinn gekommen die das Problem erklärt.

Es geht um folgendes. Ich erzeuge eine Grafik einer Analogen Uhr und weise dem Stunden und Minuten Zeiger Werte mittels einer Funktion zu die wiederum einer Globalen Variable diesen Wert zuweisen soll.

Wenn ich Im Frame versuche den wert auszulesen ist da immer noch 0. erst bei einem repaint() kommen die alten werte. Der Wert der Aktuellen Stunden z.B. ist der Vorherige und nicht der Aktuelle.

Java:
public class Clock3 extends javax.swing.JPanel {
  
    public static int stunde = 0;
    public static int minut = 0;
  
    /**
     * Creates new form Clock3
     */
    public Clock3() {
        initComponents();
      
        setPreferredSize(new Dimension(size, size));
        //setBackground(Color.white);
        /*new Timer(1000, (ActionEvent e) -> {
            repaint();
        }).start();*/
    }
  
    public static int sethour(){
        stunde = (int) (Math.random() * 23-0) + 0;
        return stunde;
    }
  
    public static int setminute(){
        minut = (int) (Math.random() * 59-0) + 0;
        return minut;
    }
  
    final float degrees06 = (float) (PI / 30);
    final float degrees30 = degrees06 * 5;
    final float degrees90 = degrees30 * 3;
    final int size = 400;
    final int spacing = 40;
    final int diameter = size - 2 * spacing;
    final int cx = diameter / 2 + spacing;
    final int cy = diameter / 2 + spacing;
  
    @Override
    public void paintComponent(Graphics gg) {
        super.paintComponent(gg);
        Graphics2D g = (Graphics2D) gg;
        g.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
                RenderingHints.VALUE_ANTIALIAS_ON);
        drawFace(g);
        // final LocalTime time  = LocalTime.now();
        int hour  =  sethour();
        int minute = setminute();
        //int hour = stunde;
        //int minute = minut;
      
        int second = 00;
        float angle = degrees90 - (degrees06 * second);
        // drawHand(g, angle, diameter / 2 - 30, Color.red);
        float minsecs = (minute + second / 60.0F);
        angle = degrees90 - (degrees06 * minsecs);
        drawHand(g, angle, diameter / 3 + 10, Color.black);
        float hourmins = (hour + minsecs / 60.0F);
        angle = degrees90 - (degrees30 * hourmins);
        drawHand(g, angle, diameter / 4 + 10, Color.black);
    }
    private void drawFace(Graphics2D g) {
        g.setStroke(new BasicStroke(2));
        g.setColor(Color.white);
        g.fillOval(spacing, spacing, diameter, diameter);
        g.setColor(Color.black);
        g.drawOval(spacing, spacing, diameter, diameter);
    }
    private void drawHand(Graphics2D g, float angle, int radius, Color color) {
        int x = cx + (int) (radius * cos(angle));
        int y = cy - (int) (radius * sin(angle));
        g.setColor(color);
        g.drawLine(cx, cy, x, y);
    }
  
  
    public int getHour(){
        return Clock3.stunde;
    }
    public int getMinute(){
        return Clock3.minut;
    }
}


Kann jemand helfen? Habe etliches versucht jedoch ohne richtiges Ergebnis.

Danke
 
Zuletzt bearbeitet von einem Moderator:
... die wiederum einer Globalen Variable diesen Wert zuweisen soll.

Frage 1: Warum sind die beiden Werte für Stunden und Minuten überhaupt "static"? Es ist auch fragwürdig warum eine "set" Methode einen Wert zurückliefert. Dafür gibt es ja dann die "get" Methoden.
(Jede Methode sollte nur eine Zuständigkeit haben, und der Name sollte schon verraten welche)

Wenn ich Im Frame versuche den wert auszulesen ist da immer noch 0. erst bei einem repaint() kommen die alten werte. Der Wert der Aktuellen Stunden z.B. ist der Vorherige und nicht der Aktuelle.

Frage 2: Wo genau liegt das Problem? Du meinst du willst im JFrame die Werte auslesen. Wo willst du Werte wie auslesen? (Etwas mehr Code diesbezüglich wäre praktisch)

Kann es einfach sein das du die Werte auslesen willst bevor die Uhr gezeichnet wurde. Da die Werte (0 ist der Initialwert) erst gesetzt werden wenn das Panel gezeichnet wird.
 
Danke für deine Antwort.

Zu 1. Bin gerade bisschen am testen und deswegen die static Variablen. Das mit den methoden ist mir auch aufgefallen, wollte es später ändern.

Zu 2. Das Problem ist ich will im frame die werte der Zeiger mit anderen werten Vergleichen. Diese werden in der paintComponent() erzeugt und sobald die abgearbeitet ist sind die Werte die dort erzeugt werden nicht mehr verfügbar (deshalb der Versuch mit static).

Im Debugger kann ich sehen das wenn Programm gestartet ist und die Uhr gezeichnet wurde sind die static variablen nicht initialisiert obwohl die methode die den wert setzt aufgerufen wurde (setminute(), sethour()). Erst wenn der Button gedrückt wird kann ich die static variablen sehen, jedoch sind sie dann nicht mehr von nutzen da die uhr neu gestellt wird

Code:
public Uhr() {
        initComponents();
    
        int stunde = clock.stunde;
        int minut = clock.minut;
    
        jLabel1.setText(Integer.toString(stunde) + " : " + Integer.toString(minut));
        jLabel2.setText(setTime());
        jLabel3.setText(setTime());
        jLabel4.setText(setTime());
    }

    private String setTime(){
        String erg;
    
        int minute = (int) (Math.random() * 59) + 0;
        int hour = (int) (Math.random() * 23) + 0;
    
        String m = Integer.toString(minute);
        String h = Integer.toString(hour);
    
        erg = h + ":" + m;
    
        return erg;
    }

Brauche die Werte für das erste Label.

Beim Aufruf des Konstruktor müsste doch die Funktionen (setminute(), sethour()) aufgerufen werden da beim Start des Programms (Frame's) die Uhr gestellt ist und nicht auf 0:0 steht. Wieso sind dann aber die werte immer noch auf 0?
 
Das 1te Label setzt Stunde und Minute über die Klasse clock. Aus Deinem Code ist nicht ersichtlich wann clock.stunde und clock.minut gesetzt werden. Diese Members static zu machen ist nicht gerade eine gute Idee. Auch nicht für Testzwecke. Du initialisierst Clock3.stunde = 0 und Clock3.minute = 0. Das bedeutet, dass das 1te Label 0:0 beinhaltet, falls Du nicht vorher Clock3.stunde und Minute andere Werte zuweist.
 
Danke für die Antwort, habe das Problem ganz einfach gelöst, in dem ich im frame das die clock aufruft ich selbst die were für std und min setze ( random ) und dann ein repaint durchführe. variablen und methoden wurden natürlich auch angepasst.
 

Neue Themen


Zurück
Oben