2016-03-30 12 views
0

Warum wird mein java.awt.Window nicht neu gezeichnet, nachdem ich die repaint() Methode aufgerufen habe?Wie ein java.awt.Window neu zu streichen?

public class Counter extends Window implements ActionListener { 

private static final long serialVersionUID = 1L; 
private Timer timer; 
private int time; 

public Counter() { 
    super(null); 
    setAlwaysOnTop(true); 
    setBounds(getGraphicsConfiguration().getBounds()); 
    setBackground(new Color(0, true)); 
    setVisible(true); 
    timer = new Timer(1000, this); 
    timer.start(); 
} 

@Override 
public void paint(Graphics g) { 
    super.paint(g); 
    g.clearRect(0, 0, getWidth(), getHeight()); 
    g.setColor(Color.RED); 
    g.drawString(String.valueOf(time), getWidth()/2, getHeight()/2); 
} 

@Override 
public void update(Graphics g) { 
    super.update(g); 
} 

@Override 
public void actionPerformed(ActionEvent e) { 
    time++; 
    repaint(); 
} 

Wie Sie sehen können, habe ich einen Timer mit einer Verzögerung von 1 Sekunde erstellt. Danach rufe ich repaint() auf, um die Nummer des Counters auf dem Bildschirm zu zeichnen. Aber es zeichnet nur eine Null auf meinem Bildschirm und hört dann auf zu zeichnen (die Null bleibt auf dem Bildschirm). Zuerst dachte ich, dass die Paint-Methode nur einmal aufgerufen wird, aber ich habe eine System.out.prinln() getestet und probiert, dass die Paint-Methode jede Sekunde ausgeführt wird, so dass sie das Fenster neu streichen sollte ... Also ich weiß nicht wo Ich machte einen Fehler.

Und ja, es ist meine Absicht, die awt.Window und keine JFrame zu verwenden oder Rahmen etc ..

+0

Sind Sie sicher, Ihre actionperformed Methode wird aufgerufen? In Ihrer println() Innenfarbe drucken Sie Ihre Zeit Variable, um sicherzustellen, dass es überhaupt aktualisiert wird –

+0

@GordonAllocman yep Sir, actionperformed heißt, ich habe es getestet, Zeit zählt auch 0,1,2,3 .... – AvarionDE

+0

Rufen Sie explizit die Methode "Invalidate" für diese Komponente auf. Dies erzwingt ein Repaint, da das gesamte Containertool ungültig wird (und Komponenten neu darin angeordnet werden müssen). – Jorge

Antwort

1

Ich habe endlich den Code auf Windows 7 laufen, und ich konnte das Problem replizieren. Aus irgendeinem Grund wird paint nicht aufgerufen; warum, ich weiß es nicht. Weil ich es nicht so machen würde, hatte ich dieses Problem nie.

Stattdessen würde ich, indem der Zähler Klasse von etwas JPanel oder JComponent verlängern beginnen (nur nicht vergessen JPanel transparent zu machen), und fügen Sie dann zu einem JWindow, etwa so:

import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.EventQueue; 
import java.awt.Graphics; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import javax.swing.JPanel; 
import javax.swing.JWindow; 
import javax.swing.Timer; 


public class Counter extends JPanel implements ActionListener { 

    public static void main(String[] args) { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       JWindow window = new JWindow(); 
       window.add(new Counter()); 
       window.pack(); 
       window.setLocationRelativeTo(null); 
       window.setBackground(new Color(0, 0, 0, 0)); 
       window.setVisible(true); 
      } 
     }); 
    } 

    private static final long serialVersionUID = 1L; 
    private Timer timer; 
    private int time; 

    public Counter() { 
     setOpaque(false); 
     timer = new Timer(1000, this); 
     timer.start(); 
    } 

    @Override 
    public Dimension getPreferredSize() { 
     return new Dimension(200, 200); 
    } 

    @Override 
    protected void paintComponent(Graphics g) { 
     super.paintComponent(g); //To change body of generated methods, choose Tools | Templates. 
     System.out.println(time); 
     g.clearRect(0, 0, getWidth(), getHeight()); 
     g.setColor(Color.RED); 
     g.drawString(String.valueOf(time), getWidth()/2, getHeight()/2); 
    } 

    @Override 
    public void actionPerformed(ActionEvent e) { 
     time++; 
     System.out.println("..." + time); 
     repaint(); 
    } 
} 
+0

vielen Dank! funktioniert gut! – AvarionDE

Verwandte Themen