JPanel setBackground(Color.BLACK)什么都不做

时间:2012-04-13 21:15:54

标签: java swing background jpanel setbackground

我有以下的自定义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;
    }
}

6 个答案:

答案 0 :(得分:15)

您还必须调用super.paintComponent();,以允许Java API绘制原始背景。 super指的是原始的JPanel代码。

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

    g.setColor(Color.red);
    g.fillOval(player.getxCenter(), player.getyCenter(), player.getRadius(), player.getRadius());
}

答案 1 :(得分:14)

如果您的面板“不透明”(透明),您将看不到背景颜色。

答案 2 :(得分: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;
    }
}

答案 3 :(得分:3)

您需要在Board构造函数中创建一个新的Jpanel对象。 例如

public Board(){
    JPanel pane = new JPanel();
    pane.setBackground(Color.ORANGE);// sets the background to orange
} 

答案 4 :(得分:3)

setOpaque(false); 

已更改为

setOpaque(true);

答案 5 :(得分:-1)

为了将背景完全设置为给定的颜色:

1)首先设置背景颜色

2)调用方法"清除(0,0,this.getWidth(),this.getHeight())" (组件涂料区域的宽度和高度)

我认为这是设置背景的基本程序...... 我有同样的问题。

另一个有用的提示:如果你想在特定的区域(比如一个面具或一个"洞")中绘制,请使用"来调用图形的setClip()方法。孔"形状(任何形状),然后调用Clear()方法(背景应该先设置为"孔"颜色)。

你可以通过调用方法clip()(你想要的任何时候)来制作更复杂的剪辑区域。在调用方法setClip()以获得裁剪形状的交叉点之后。

我没有找到任何关于剪辑区域的联合或反转的方法,只有交叉点,太糟糕......

希望有所帮助