【问题标题】:JPanel setBackground(Color.BLACK) does nothingJPanel setBackground(Color.BLACK) 什么都不做
【发布时间】:2012-04-26 06:22:35
【问题描述】:

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

【问题讨论】:

    标签: java swing background jpanel setbackground


    【解决方案1】:

    您还必须调用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());
    }
    

    【讨论】:

    • 我之前尝试过(谷歌搜索后发现),但它并没有解决问题:(
    • 我不确定,但我认为面板应该是不透明的。
    • @PrimožKralj:如果你没有很快得到一个像样的答案,那么考虑创建并发布一个SSCCE
    【解决方案2】:

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

    【讨论】:

    • “只有当组件不透明时才使用背景颜色……”—setBackground().
    • +1,OP 正在写 setOpaque(false) 并且仍然希望颜色可见:(
    【解决方案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;
        }
    }
    

    【讨论】:

    • 我在 Netbeans 工作,所以这样做并不难,但我还是设法手动创建了 Board() 并将其手动添加到我的 Frame 中。我以为我可以使用集成的 GUI 构建器来处理我的开发板,但这样我就无法更改此 Board JPanel 的大小(甚至不能在代码中更改,因为它是自动生成的,我无法访问它)。
    【解决方案4】:

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

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

    【讨论】:

      【解决方案5】:
      setOpaque(false); 
      

      改为

      setOpaque(true);
      

      【讨论】:

      • 也许您可以用几句话解释发布者的代码有什么问题,然后您的解决方案是什么。谢谢!
      【解决方案6】:

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

      1) 先设置背景色

      2)调用方法“Clear(0,0,this.getWidth(),this.getHeight())”(组件绘制区域的宽度和高度)

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

      另一个有用的提示:如果你想绘制但不在特定区域(类似于蒙版或“洞”),请使用“洞”形状(任何形状)调用图形的 setClip() 方法,然后然后调用 Clear() 方法(背景应事先设置为“孔”颜色)。

      您可以在调用方法 setClip() 之后调用方法 clip()(任何时候)来制作更复杂的剪辑区域,以使剪辑形状相交。

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

      希望对你有帮助

      【讨论】:

      • 这个答案非常模糊,涉及对 OP 无关紧要的随机主题,并且步骤 2 甚至没有编译,或者它可能编译,但是没有给出所述方法的上下文。至少,它不作为JPanel 或JFrame 的成员方法存在。请提供更多背景信息并在您的帖子中保持简洁。
      猜你喜欢
      • 1970-01-01
      • 2014-07-26
      • 1970-01-01
      • 1970-01-01
      • 2017-07-16
      • 1970-01-01
      • 2019-03-08
      • 2016-12-24
      • 2017-04-18
      相关资源
      最近更新 更多