Java 添加方法paint()时,JPanel的背景色替换为灰色

Java 添加方法paint()时,JPanel的背景色替换为灰色,java,swing,jpanel,paint,Java,Swing,Jpanel,Paint,我编写了以下基本Java Swing示例,它是一个带有蓝色背景的JPanel: public类Chart1扩展了JFrame{ 私人主面板1主面板; public Chart1()引发InterruptedException{ 设置大小(600500); setLocationRelativeTo(空); setDefaultCloseOperation(关闭时退出); //创建并添加主面板 main=新的主面板1(); this.getContentPane().add(main,Border

我编写了以下基本Java Swing示例,它是一个带有蓝色背景的JPanel:

public类Chart1扩展了JFrame{
私人主面板1主面板;
public Chart1()引发InterruptedException{
设置大小(600500);
setLocationRelativeTo(空);
setDefaultCloseOperation(关闭时退出);
//创建并添加主面板
main=新的主面板1();
this.getContentPane().add(main,BorderLayout.CENTER);
//绘图窗口
此.setVisible(true);
}
}
公共类MainPanel1扩展了JPanel{
公共主面板1(){
挫折背景(颜色:蓝色);
}
}
我得到以下结果:

到目前为止,一切顺利

现在我添加了一个
paint()
方法。源代码如下:

公共类MainPanel1扩展了JPanel{
公共主面板1(){
挫折背景(颜色:蓝色);
}
公共空间涂料(图g){
}
}
然后,即使不在
paint()中执行任何操作,我也会得到一个灰色背景,为什么?我怎样才能解决这个问题

答案是paint(Java1.0-1.1方法)在JComponents中调用paintBackground。当您重写它时,它不会调用所有的swing paint方法。但是如果你添加super.paint(g),它看起来就像以前一样

另外-请注意,JFrame中的默认ContentPane已经是一个JPanel。与其用JPanel替换ContentPane,您只需调用:

((JPanel) myFrame.getContentPane()).setBackground(Color.blue);
答案是paint(Java1.0-1.1方法)在JComponents中调用paintBackground。当您重写它时,它不会调用所有的swing paint方法。但是如果你添加super.paint(g),它看起来就像以前一样

另外-请注意,JFrame中的默认ContentPane已经是一个JPanel。与其用JPanel替换ContentPane,您只需调用:

((JPanel) myFrame.getContentPane()).setBackground(Color.blue);

您不应该覆盖
paint
,而应该覆盖
paintComponent
。问题仍然会出现,因此您需要调用
super.paintComponent(g)

因此,将绘制方法更改为以下内容

public class MainPanel1 extends JPanel {        
    
    public MainPanel1() {
        setBackground(Color.BLUE);
    }
    
    public void paintComponent(Graphics g) {
         // The following statement ensures that
         // the background color will be applied
         // as well as other preparations for 
         // doing graphics.
 
         super.paintComponent(g);
         // If you have other graphics
         // code, add it here.
   }

}
并且不要在
Chart1
类中对
JFrame
进行子类化。这是坏习惯。使用一个实例

JFrame frame = new JFrame();

您不应该覆盖
paint
,而应该覆盖
paintComponent
。问题仍然会出现,因此您需要调用
super.paintComponent(g)

因此,将绘制方法更改为以下内容

public class MainPanel1 extends JPanel {        
    
    public MainPanel1() {
        setBackground(Color.BLUE);
    }
    
    public void paintComponent(Graphics g) {
         // The following statement ensures that
         // the background color will be applied
         // as well as other preparations for 
         // doing graphics.
 
         super.paintComponent(g);
         // If you have other graphics
         // code, add it here.
   }

}
并且不要在
Chart1
类中对
JFrame
进行子类化。这是坏习惯。使用一个实例

JFrame frame = new JFrame();

您可以将
super.paint(g)
放在重写的绘制方法中。这将继续使用填充背景色的正常绘制代码。另外,通常的建议是重写
paintComponent
而不是
paint
。您可以将
super.paint(g)
放在重写的绘制方法中。这将继续使用填充背景色的正常绘制代码。另外,通常的建议是覆盖
paintComponent
而不是
paint
。谢谢,这就澄清了问题。对于ContentPane/JPanel,这是SO的简化版本,实际代码包含3个面板,因此我需要这个JPanel。@M.E.很高兴这对您有所帮助。一条建议:一般来说(以及在可能的情况下),最好使用现成的Swing/View组件(无扩展),并将GUI的整个控件放在自己的类中;它使调试更容易。虽然如果您要在此处创建可重用的swing组件(例如ColorButton(一个允许用户在配置窗口中配置颜色属性的swing扩展名:),但组件本身包含逻辑是有意义的。谢谢,这就说明了这一点。对于ContentPane/JPanel,这是SO的简化版本,实际代码包含3个面板,因此我需要这个JPanel。@M.E.很高兴这对您有所帮助。一条建议:一般来说(以及在可能的情况下),最好使用现成的Swing/View组件(无扩展),并将GUI的整个控件放在自己的类中;它使调试更容易。尽管如果您正在创建可重用的swing组件(例如ColorButton(一个允许用户在配置窗口中配置颜色属性的swing扩展),组件本身包含LogicHelp注释是有意义的。我在读了你的回答后也看到了这一点:有用的评论。在读了你的回答后,我也看到了这一点: