1

私はしばらくの間この問題を抱えており、多くのフォーラムやサイト (これを含む) を検索しましたが、それでも私の質問に対する答えは見つかりませんでした.

これは私の問題です。視覚的なカレンダーを作成しています。複数のパネルを含む親パネルがあります。親パネルを再描画し、3 つのオーバーレイを不透明 (false) にします。フレームのサイズを変更するまで、親パネルのペイントは表示されません(または、3 つのうちの 1 つをオーバーレイするボタンを使用しますが、コードが長くなるため、この例では省略されています)。

とにかく、これがコードです。問題の部分に単純化しました。

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);
  }
}

なぜそれが行われるのかわかりません+オンラインで回答を見つけることができませんでした.同じ問題を抱えている人だけが質問を放棄しました:/

誰でも私を助けることができますか?

4

2 に答える 2

3
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. imageを paint メソッドにロードしないでください。代わりに、クラス属性として宣言してプリロードする必要があります。
  2. メソッドは非同期であるため、Toolkitコンポーネントを として使用することがさらに重要ImageObserverです。

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


これは、あなたが試みているように見えるもののようなものである実用的なSSCCEです。

于 2012-05-31T14:54:06.120 に答える
0

の戻り値を確認してくださいGraphics.drawImage()。false を返しているに違いありません。これは、ペイントしている画像がまだ完全にロードされておらず、スケーリングされていないことを意味します。コンストラクターpaintComponentなど、メソッド以外の場所に画像をロードしてみてください。Calendar

于 2012-05-31T15:05:56.120 に答える