1

JComponent と JPanel で描画が異なる理由を理解する助けが必要です。

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;

import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class Particle extends JComponent implements Runnable{
    private int x = 45;
    private int y = 45;
    private int cx;
    private int cy;
    private int size;
    private Color color;
    private JFrame frame;

    public Color getColor(){
        return color = new Color(100,0,190);
    }

    public Particle(){
        frame = new JFrame();
        frame.setSize(400, 400);
        frame.setResizable(false);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(this);
        frame.setVisible(true);
    }

    public void update(){
        x+=1;
        y+=1;
    }

    public void paintComponent(Graphics g){
        Graphics2D g2d = (Graphics2D) g.create();
        g2d.setColor(getColor());

        g2d.fillRect(x, y, 4, 4);
    }

    public void startThread(){
        Thread thread = new Thread(this);
        thread.start();
    }

    @Override
    public void run() {
        for(int i = 0; i <= 200; i++){
            try{
                update();
                repaint();
                Thread.sleep(4);    
            }catch(Exception e){
                System.out.print("Exception at thread.start()");
            }
        }
    }

    public static void main(String[] args) {
        Particle particle = new Particle();
        particle.startThread();
    }
}

この上の例では、「粒子」はポイント A からポイント B に問題なく移動します。

しかし、Particle を JComponent から JPanel にサブクラス化すると..

描画は線を形成します..つまり、長方形は開始位置から消えることはありません..

これはなぜですか?

4

2 に答える 2

5

Toilalによって解決策が投稿されました。理由を説明したい:

API ドキュメントpaintComponentJComponent

さらに、super の実装を呼び出さない場合は、不透明なプロパティを尊重する必要があります。つまり、このコンポーネントが不透明な場合は、不透明でない色で背景を完全に塗りつぶす必要があります。opaque プロパティを尊重しないと、視覚的なアーティファクトが表示される可能性があります。

_setOpaqueJComponent

の場合、このプロパティのデフォルト値は false ですJComponent。ただし、ほとんどの標準JComponentサブクラス ( や などJButton)でのこのプロパティのデフォルト値JTreeは、ルック アンド フィールに依存します。

次のコードを追加します。

System.out.println(isOpaque());
  • JComponent場合によってはfalse印刷されます。
  • JPanel場合によってはtrue印刷されます。

それで全部です。

于 2013-06-08T10:38:28.033 に答える
3

paintComponent 実装で super.paintComponent(g) を呼び出します。

public void paintComponent(Graphics g) {
  super.paintComponent(g);

  Graphics2D g2d = (Graphics2D) g.create();
  g2d.setColor(getColor());
  g2d.fillRect(x, y, 4, 4);

}
于 2013-06-08T10:16:35.723 に答える