繁体   English   中英

JPanel中的JButton在通过调整大小或动作重新绘制之前无法正常显示

[英]JButtons in JPanel don't display properly until repainted through resize or action

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

这是我的问题:我正在构建一个可视日历。 我有一个父面板,里面有多个面板。 我重新绘制父面板,并使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);
}
  1. 不应在paint方法中加载image 相反,它应该声明为类属性并预加载。
  2. Toolkit方法是异步的,因此将组件用作ImageObserver更为重要。

    g.drawImage(image, 0, 0, this.getWidth(), this.getHeight(), this);


这是一个有效的SSCCE ,就像你似乎正在尝试的那样。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM