2

私は周りを見回しJPanelて、画像の背景を持つことができるように取り組んできました。これに関する情報が山ほどあることは知っています ( example 1example 2 )。これらのどちらも、まさに私が探しているものではありません。

私が探しているのは、他のすべてを維持しながら、背景画像を設定する関数または機能を追加する方法です。JPanel私が現在抱えている問題は、拡張するいくつかのクラスがJPanelあり、それらを変更して新しいImagePanelクラスを拡張すると、コンストラクターが失敗することです (明らかにパラメーターが異なります)。これらのファイルの 1 つのコンストラクターを作成しましたがsuper( new BorderLayout() );、これを機能させる唯一の方法は、レイアウトまたは背景画像のいずれかを破棄することです。両方を連携させることはできません。

これが最近の絶望的な試みです:

import java.awt.*;
import javax.swing.JPanel;

class ImagePanel extends JPanel {

  private Image img;

  public ImagePanel(Image img, LayoutManager layout) {
    this.img = img;
    Dimension size = new Dimension(img.getWidth(null), img.getHeight(null));
    setPreferredSize(size);
    setMinimumSize(size);
    setMaximumSize(size);
    setSize(size);
    setLayout(null);
    super.setLayout(layout);
  }

  public void paintComponent(Graphics g) {
    g.drawImage(img, 0, 0, null);
  }

}

誰かが私を助けてくれたり、私が探しているものを教えてくれたりしたら、それは素晴らしいことです. バックグラウンドスケーリングなどの非常にクレイジーな機能は必要ありません。画像を背景にして、他のすべての方法でその機能を維持したいだけです。

ありがとう。

4

2 に答える 2

2

コンストラクターは、被相続人間で譲渡できません。つまり、クラスを拡張し、親と同じコンストラクターを提供しない場合、それらのコンストラクター シグネチャは使用できません。

たとえば、サンプル ソース コードでは、その署名に一致するコンストラクターがないため、呼び出すことnew ImagePane(new BorderLayout())ができませんでした。ImagePaneJPanel

クラスのバージョンに固有の特定の初期化パスを使用するようにユーザーを誘導できるため、これは重要です。

親クラスから利用可能なコンストラクターを再利用したい場合は、独自のクラス内でそれらの署名を提供するかsuper(...);、必要なパラメーターを使用して呼び出す必要があります

import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.LayoutManager;
import javax.swing.JPanel;

public class ImagePanel extends JPanel {

    private Image img;

    public ImagePanel(LayoutManager layout) {
        super(layout);
    }

    public ImagePanel(Image img, LayoutManager layout) {
        this(layout);
        this.img = img;
    }

    public Image getImage() {
        return img;
    }

    public void setImage(Image value) {
        if (img != value) {
            Image old = img;
            img = value;
            firePropertyChange("image", old, img);
            revalidate();
        }
    }

    @Override
    public Dimension getPreferredSize() {
        Image img = getImage();
        return img == null ? super.getPreferredSize() : new Dimension(img.getWidth(this), img.getHeight(this));
    }

    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        if (img != null) {
            g.drawImage(img, 0, 0, this);
        }
    }

}

また、カスタム ペインティングの詳細については、カスタム ペインティングの実行をお読みになることをお勧めします...

于 2013-05-16T21:00:15.520 に答える
1

提案を受け入れる場合は、JLayeredPane.

これらのコンテナーにはレイヤーがあり、各レイヤーにはコンポーネントを格納できます。
したがって、JPanel、またはJLabelさらに言えば、背景画像を最下層に配置し、他のものを別のJPanel、上位層に配置することができます。

に固執したい場合はImagePanel、おそらく電話super.paintComponentもする必要があります。

class ImagePanel extends JPanel {
        ...

    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.drawImage(img, 0, 0, this);
    }
}
于 2013-05-16T20:46:12.917 に答える