0

背景として画像を使用していますが、別の画像を JButton として使用しています。現在、背景画像はボタンに重なって表示されていないため、表示されません。repaint() をコメントアウトすると、ボタンが前面に表示されますが、ボタンを再配置したため、そのスペースが背景画像からフェードアウトします。基本的に、ボタンを背景画像の前に配置するには、コードで何をする必要がありますか (背景画像はそのままです)。

public class Start extends JFrame {

JPanel jp = new JPanel();
JButton startButton = new JButton();
private Image dbImage;
private Graphics dbg;
Image backgroundFirst;
int backx;
int backy;

public Start() {
    ImageIcon i = new ImageIcon(
            "C:/Users/Mel/workspace/camptycoon/javagame/src/javagame/background1.png");
    backgroundFirst = i.getImage();

    startButton
            .setIcon(new ImageIcon(
                    "C:/Users/Mel/workspace/camptycoon/javagame/src/javagame/start.png"));
    jp.add(startButton);
    startButton.setLayout(getLayout());
    add(jp);
    validate();

    // Frame Properties
    setTitle("Counselor Training");
    setVisible(true);
    setSize(755, 600);
    setDefaultCloseOperation(EXIT_ON_CLOSE);

}

public LayoutManager getLayout() {
    int x = 540;
    int y = 475;
    startButton.setLocation(x, y);
    startButton.setBorder(null);

    return null;

}

public void paint(Graphics g) {
    dbImage = createImage(getWidth(), getHeight());
    dbg = dbImage.getGraphics();
    paintComponent(dbg);
    g.drawImage(dbImage, 0, 0, this);
}

public void paintComponent(Graphics g) {
    backx = 10;
    backy = 30;

    g.setColor(Color.BLUE);
    g.drawImage(backgroundFirst, backx, backy, this);
    //repaint();
}

}
4

1 に答える 1

3

一般的に使用されるいくつかのソリューションを知っています。

  • ImageIcon に画像を保持する JLabel を contentPane として使用して、適切なレイアウト マネージャーを提供するか、または
  • JPanel を contentPane として使用し、そのpaintComponent(...)メソッドで画像を描画します。
  • 最下層のコンポーネント (おそらく JLabel) が保持する画像を含む JLayeredPane の使用。これは主に、あるレイヤーから別のレイヤーにコンポーネント/スプライトを持ち上げたいアニメーション作業に使用しました。

その他の注意事項:

  • オーバーライドであると思われるすべてのメソッドにアノテーションを使用することを忘れない@Overrideでください。実際にはオーバーライドされていないメソッド (つまり、上記の `paintComponent(...) メソッド) に驚くかもしれません。
  • JFrame のメソッドをオーバーライドすることはほとんどありません。なぜなら、JFramepaint(...)は自分が思っていることを実行していない可能性が高く、望ましくない副作用の危険にさらされているからです。
  • 実際、どのコンポーネントのpaint(...)メソッドもオーバーライドしないようにすることをお勧めします。
  • null レイアウトを使用しないように努める必要があります。
  • あなたのgetLayout()メソッドのオーバーライドは私には不自然に見えます。これをしないでください。
  • 画像表示コンポーネントの上に JPanel をネストする場合は、上にある JPanel (またはその他のコンポーネント) を呼び出して非透過として設定しsetOpaque(false)てください。
于 2013-02-09T20:59:04.480 に答える