2016-03-30 20 views
0

なぜ私のjava.awt.Windowはrepaint()メソッドを呼び出した後に再描画しないのですか?java.awt.Windowを再描画する方法は?

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

私は、遅延が1秒のタイマーを作成しました。その後、repaint()を呼び出してカウンタの数値を画面に描画します。しかし、それは私の画面上にゼロを描画し、描画を停止します(ゼロは画面にとどまります)。最初に、私はpaintメソッドが一度しか呼び出されないと思ったが、私はSystem.out.prinln()をテストし、paintメソッドが毎秒実行されるように提案したので、実際にウィンドウを再描画する必要があった。私が間違えました。

そして、はい、awt.WindowとないのJFrameを使用するかなどをフレームに私の意図..です

+0

は確かですactionperformedメソッドが呼び出されていますか?あなたのprintln()ペイントの中であなたの時間変数を印刷して、それが更新されていることを確認してください。 –

+0

@GordonAllocman yep sir、actionperformedが呼び出されました。私はテストしました、時間は0,1,2,3 ... – AvarionDE

+0

このコンポーネントの「無効化」メソッドを明示的に呼び出すこれは、コンテナ全体を無効にして(そしてコンポーネントを再レイアウトするよう強制するため)、再描画を強制します。 – Jorge

答えて

1

私は最終的にWindows 7の上のコードを実行するようになった、と私は問題を複製することができます。何らかの理由でpaintが呼び出されていません。なぜ、私は知らない。私はこのようにしないので、私はそのような問題は一度もありませんでした。

代わりに、私はカウンタークラスが何かJPanelまたはJComponentから延びることによって開始(ちょうどJPanelを透明にすることを忘れないでください)、その後JWindowに追加し、このようなものだろう:

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

ありがとう!正常に動作します! – AvarionDE

関連する問題