Java JPanel don'中的按钮;在通过调整大小或操作重新绘制之前,不能正确显示

Java JPanel don'中的按钮;在通过调整大小或操作重新绘制之前,不能正确显示,java,resize,jpanel,paint,paintcomponent,Java,Resize,Jpanel,Paint,Paintcomponent,我有这个问题已经有一段时间了,搜索了很多论坛和网站(包括这一个),但仍然没有找到我问题的答案 这是我的问题: 我正在制作一个可视化日历。我有一个包含多个面板的父面板。我重新绘制父面板,并使3个覆盖层不透明(假)在我调整框架大小之前,父面板的绘制不会显示(或使用覆盖3个按钮之一的按钮,但在本例中这些按钮被忽略,因为这会使代码变长) 无论如何,这是代码,我将其简化为问题部分: public class Calendar extends JPanel{ public static void ma

我有这个问题已经有一段时间了,搜索了很多论坛和网站(包括这一个),但仍然没有找到我问题的答案

这是我的问题: 我正在制作一个可视化日历。我有一个包含多个面板的父面板。我重新绘制父面板,并使3个覆盖层不透明(假)在我调整框架大小之前,父面板的绘制不会显示(或使用覆盖3个按钮之一的按钮,但在本例中这些按钮被忽略,因为这会使代码变长)

无论如何,这是代码,我将其简化为问题部分:

public class Calendar extends JPanel{

  public static void main(String[] args){
    JFrame frame = new JFrame();
    frame.setSize(1600,150);
    frame.add(new Calendar());
    frame.setVisible(true);
  }

  public Calendar(){
    setLayout(new GridBagLayout());
    GridBagConstraints cc = new GridBagConstraints();
    cc.weightx = 1;
    cc.weighty = 1;
    cc.gridx = 0;
    cc.fill = GridBagConstraints.BOTH;

    //Initiate Panels
    JPanel yearpanel = new JPanel();
    JPanel monthpanel = new JPanel();
    JPanel daypanel = new JPanel();

    yearpanel.setLayout(new GridBagLayout());
    monthpanel.setLayout(new GridBagLayout());
    daypanel.setLayout(new GridBagLayout());

    // Set sizes
    int width = (int) this.getPreferredSize().getWidth();
    int height = (int) (this.getPreferredSize().getHeight() / 3);
    yearpanel.setSize(width,height);
    daypanel.setSize(width,height);
    monthpanel.setSize(width,height);

    //make transparent
    yearpanel.setOpaque(false);
    monthpanel.setOpaque(false);
    daypanel.setOpaque(false);
  }        

  @Override
  public void paintComponent(Graphics g) {
    super.paintComponent(g);
    Image image = Toolkit.getDefaultToolkit().getImage("Images/CalendarBackground.jpg");
    g.drawImage(image, 0, 0, this.getWidth(), this.getHeight(), null);
  }
}
我不知道为什么会这样+我在网上找不到答案,只有那些有同样问题的人的问题被放弃了:/

有人能帮我吗

public void paintComponent(Graphics g)
{
    super.paintComponent(g);
    Image image = Toolkit.getDefaultToolkit().getImage("Images/CalendarBackground.jpg");
    g.drawImage(image, 0, 0, this.getWidth(), this.getHeight(), null);
}
  • 不应在绘制方法中加载
    图像。相反,它应该声明为类属性并预加载
  • Toolkit
    方法是异步的,因此将组件用作
    ImageObserver
    更为重要

    g.drawImage(图像,0,0,this.getWidth(),this.getHeight(),this)


  • 这是一个类似于你所尝试的东西


    检查
    Graphics.drawImage()
    的返回值。我打赌它返回false,这意味着您正在绘制的图像尚未完全加载和缩放。尝试将图像加载到
    paintComponent
    方法以外的其他位置,如
    Calendar
    构造函数。

    是否要修改您的-目前它不起作用。您正在创建空的
    JPanel
    s,它们从未添加到顶级
    JPanel
    ——即
    Calendar
    。我正要写同样的建议。另外,您可以使用ImageIO.read(新文件(…)而不是使用工具箱。这将返回可立即使用的BuffereImage。您绝对不应该在paint call中加载图像。@Tony Service面带微笑。:)@Tony“您可以使用ImageIO.read..”这正是链接代码所做的。但是为了安全起见,
    ImagePanel
    声明自己是
    ImageObserver
    。即使使用异步加载的映像,也可以完成此任务。例如,当使用
    ImageIcon
    加载动画GIF(这对于BG来说有点令人不安)时,这会有所帮助。它现在可以工作了!谢谢大家,我自己从来没有想到这一点。:)很高兴你把它整理好了。:)有机会时请回答。(另见附件)