2017-03-20 17 views
0

私は塗料成分の方法を完全に理解していないようです。 何度か、別のコードでうまく動作している間に、いくつかのコードでは再ペイントが動作しない理由がありません。 グラフペイントクラスを作成しようとしています。今はy = xです。それは動作しません。塗料成分はただ一度呼び出されたようだった。何故ですか?Repaint()再塗りつぶし

public class Graph extends JPanel 
{ 
    private int oldX=0,oldY=0,newX=1,newY=1; 
    public Graph() 
    { 
     invokeInitWindow(); 
    } 
    public void invokeInitWindow() 
    { 
     SwingUtilities.invokeLater(new Runnable() 
       { 
        public void run() 
        { 
         init(); 
        } 
       }); 

    } 
    public void init() 
    { 
     JFrame frame = new JFrame(); 
     frame.setPreferredSize(new Dimension(300,300)); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.add(this); 
     frame.pack(); 
     frame.setVisible(true); 
    } 
    public void move() 
    { 
     newY=++newX; 
     oldX=oldY=newX+1; 
    } 
    public void runGraph() 
    { 
     while(newX < 500) 
     { 
      move(); 
      repaint(); 
     } 
    } 
    public static void main(String[] args) 
    { 
     Graph g = new Graph(); 
     g.runGraph(); 
    } 
    public void paintComponent(Graphics g) 
    { 
     g.setColor(Color.BLACK); 
     g.drawLine(oldX, oldY, newX, newY); 
    } 
} 
+1

それは確認されませんでしたが、 whileループは非常に速く実行されているので、フレームが画面に表示される前に終了します。 – MadProgrammer

答えて

0

ので、場所についていくつかSystem.out.printlnコマンドを追加した後、あなたが基本的には競合状態を持っていたことは明らかでした。

つまり、あなたのwhile-loopはとても速く動くことができました。実際にはウィンドウが画面に表示される前に完了していたので、画面のどこかにポイントを描いていました。あなたがする必要がどのような

、それを遅くする(ので、人が実際にそれを見ることができます)ループにわずかな遅延を注入され、何かのような...

public void runGraph() { 
    while (newX < 500) { 
     try { 
      Thread.sleep(40); 
     } catch (InterruptedException ex) { 
      Logger.getLogger(Graph.class.getName()).log(Level.SEVERE, null, ex); 
     } 
     move(); 
     repaint(); 
    } 
} 

コードレビュー

申し訳ありません、自分自身を助けることはできません。あなたがコードしている(重大な)問題の1つは、コンストラクタが副作用を持っているという事実です。つまり、JFrameを作成しています。これはあなたが本当にやりたくないものです。コンストラクタはオブジェクトの状態を初期化する必要があります。

あなたは現時点で設定した方法で、パネルを意味のある方法で再利用することはできませんでした。

第2に、カスタムペイントを行う前に、super.paintComponentを呼び出す必要があります。ペインティングはスイングは、メソッドが何をしているかを正確に把握していなければ、小さなものだが重要な仕事をしている一連のメソッド呼び出しで構成されており、仕事を引き継ぐことになります。super方法。

私はあなたが成長している線を描こうとしていると思いますので、moveメソッドを修正しました。そのため、行の先頭は静止したままです。私はあなたの意図は、それが画面、その場合には、あなたが持っていたようなコードを回復するのは難しいことではないでしょうが下に移動持つようにされている可能性があり、私はちょうど `あなた

import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.Graphics; 
import java.util.logging.Level; 
import java.util.logging.Logger; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.SwingUtilities; 

public class Graph extends JPanel { 

    private int oldX = 0, oldY = 0, newX = 1, newY = 1; 

    public Graph() { 
    } 

    public void move() { 
     newY = ++newX; 
//  oldX = oldY = 
     newX += 1; 
    } 

    public void runGraph() { 
     while (newX < 500) { 
      try { 
       Thread.sleep(40); 
      } catch (InterruptedException ex) { 
       Logger.getLogger(Graph.class.getName()).log(Level.SEVERE, null, ex); 
      } 
      move(); 
      repaint(); 
     } 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      public void run() { 
       Graph g = new Graph(); 
       JFrame frame = new JFrame(); 
       frame.setPreferredSize(new Dimension(300, 300)); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.add(g); 
       frame.pack(); 
       frame.setVisible(true); 
       Thread t = new Thread(new Runnable() { 
        @Override 
        public void run() { 
         g.runGraph(); 
        } 
       }); 
       t.start(); 
      } 
     }); 

    } 

    @Override 
    protected void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     g.setColor(Color.BLACK); 
     g.drawLine(oldX, oldY, newX, newY); 
    } 
} 
+0

ok、すばやく役立つコメントをいただきありがとうございます。実際には私が望んでいたのは、グラフをペイントします。私は毎回リフレッシュするので、私はまだこの問題に苦しんでいます。だから、私が得るものは動いている小さな線ですが、それはどこにあったのか 'とどまることはありません。 – Idan878

+0

ペイントは破壊的です。グラフを「チャンク」にペイントしたい場合は、それらのチャンクの 'List'を維持する必要があり、' paintComponent'が呼び出されたときにそれらをすべてペイントし直します – MadProgrammer