12

次のカスタムJPanelがあり、Netbeans GUIビルダーを使用してフレームに追加しましたが、背景は変更されません。g.fillOval()で描画している円を見ることができます。どうしたの?

public class Board extends JPanel{

    private Player player;

    public Board(){
        setOpaque(false);
        setBackground(Color.BLACK);  
    }

    public void paintComponent(Graphics g){  
        super.paintComponent(g);
        g.setColor(Color.red);
        g.fillOval(player.getxCenter(), player.getyCenter(), player.getRadius(), player.getRadius());
    }

    public void updatePlayer(Player player){
        this.player=player;
    }
}
4

6 に答える 6

16

パネルが「不透明」(透明) でない場合、背景色は表示されません。

于 2012-04-14T00:28:34.537 に答える
15

super.paintComponent();Java APIが元の背景を描画できるようにするには、も呼び出す必要があります。スーパーは元のJPanelコードを参照します。

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

    g.setColor(Color.red);
    g.fillOval(player.getxCenter(), player.getyCenter(), player.getRadius(), player.getRadius());
}
于 2012-04-13T21:16:42.990 に答える
4
setOpaque(false); 

に変更

setOpaque(true);
于 2014-09-09T18:09:44.270 に答える
3

必要最小限の実装を試してみたところ、うまくいきました:

public class Test {

    public static void main(String[] args) {
            JFrame frame = new JFrame("Hello");
            frame.setPreferredSize(new Dimension(200, 200));
            frame.add(new Board());
            frame.pack();
            frame.setVisible(true);
    }
}

public class Board extends JPanel {

    private Player player = new Player();

    public Board(){
        setBackground(Color.BLACK);
    }

    public void paintComponent(Graphics g){  
        super.paintComponent(g);
        g.setColor(Color.red);
        g.fillOval(player.getCenter().x, player.getCenter().y,
             player.getRadius(), player.getRadius());
    } 
}

public class Player {

    private Point center = new Point(50, 50);

    public Point getCenter() {
        return center;
    }

    private int radius = 10;

    public int getRadius() {
        return radius;
    }
}
于 2012-04-14T00:45:21.880 に答える
0

背景を特定の色に完全に設定するには:

1)最初に背景色を設定します

2) メソッド「Clear(0,0,this.getWidth(),this.getHeight())」を呼び出します (コンポーネントのペイント領域の幅と高さ)

背景を設定するのが基本的な手順だと思います...同じ問題がありました。

もう 1 つの便利なヒント: 特定のゾーン (マスクや「穴」など) ではなく描画したい場合は、「穴」形状 (任意の形状) でグラフィックスの setClip() メソッドを呼び出してから、 Clear() メソッド (背景は事前に「穴」の色に設定されている必要があります)。

メソッド setClip() を呼び出した後、(いつでも) メソッド clip() を呼び出して、より複雑なクリップ ゾーンを作成し、クリッピング シェイプの交差を作成できます。

クリップ ゾーンの結合または反転の方法は見つかりませんでした。交差点だけでした。残念です...

それが役に立てば幸い

于 2016-02-28T17:24:53.533 に答える