2016-11-02 8 views
0

私はJavaペイントと再ペイント作業を理解するためにいくつかのコードを作成したので、私はJavaペイントを学びたいと思います。ここに2つのコードサンプルがあり、それらの違いは何ですか?なぜ仕事を再描画しないのですか?Java repaint()はどのように機能しますか?

最初のコードサンプル(それが動作)

package com.oguz; 
import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.Graphics; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
public class PaintTest3 extends JFrame{ 
    JPanel panel1; 
    int i = 1; 
    public PaintTest3() { 
     panel1 = new JPanel(); 
     JButton btn = new JButton("Button"); 
     btn.addActionListener(new ActionListener(){ 
      @Override 
      public void actionPerformed(ActionEvent arg0) { 
       i++; 
       Graphics g = panel1.getGraphics(); 
       g.setColor(Color.BLACK); 
       g.drawLine(10, 10, i * 5, 10); 
      } 
     }); 
     add(panel1); 
     add(btn, BorderLayout.NORTH); 
    } 
    public static void main(String args[]){ 
     PaintTest3 pt = new PaintTest3(); 
     pt.setDefaultCloseOperation(EXIT_ON_CLOSE); 
     pt.setSize(600, 500); 
     pt.setVisible(true); 
    } 
} 
+0

どのような違いが最初にあるのかを教えてください。それから、重要な理由を教えてください。 –

答えて

1

私はあなたの2番目のバージョンを試してみました。私が変更しなければならなかったのは、ボタンの後ろに描画されていたので、ラインをさらに下にすることでした:g.drawLine(10, 100, i * 5, 100);理想的には、領域を描画する場合は、JPanelをカスタムpaintで拡張し、ボタンの下に配置することをお勧めします。

さらに再描画を説明するには、「再描画」のポイントは、コンポーネントを再描画する必要がある何かを変更したことをウィンドウマネージャに伝えることです。再描画操作はpaintを使用して(実際には別のスレッドで)後で実行されます。ウィンドウマネージャは、いくつかの再ペイントコールのために一度ペイントすることができます(十分速く発生した場合)。あなた自身のコードでpaintを呼び出すべきではありません。それを実装し、必要に応じて呼び出すようにしてください。

最初の実装での問題は、ボタンを押さずにペイントを行わなければならない場合は何も起こりません。たとえば、ウィンドウのサイズを変更したり、最小化/最大化したりした場合などです。

要約すると、2番目の実装は正しいです。ラインを正しく配置する必要があり、理想的にはフレームではなくパネルに描画するだけです。

0

再描画は、()

public void paint(Graphics g){} 

メソッドを呼び出します。これは、大規模なプログラムで何度もペイントメソッドが呼び出されるため、コーディングプロセスを簡単にするためです。 Graphicsオブジェクトをパラメータとして渡すたびに。これを最小限に抑えるために、私たちは再描画()を行います。

+0

投稿された2番目のサンプルは動作しません。私はactionPerformedでrepaint()を使用しました。 –

+0

@ user125318あなたの質問のタイトルは完全に間違っています。 – byxor

+0

なぜですか?私はrepaint()の仕事を理解していない。もしrepaint()がShree Naathとして働いているのであれば、なぜ2番目のサンプルは動作しないのですか? –

関連する問題