初めて自分の家と他人の家が違う、と意識した時

現在javaでゲームのメニュー画面を作っているのですが、ボタンを配置する所まではできたんですが、背景に画像を表示することができなくて困っています!

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JLabel;
import javax.swing.ImageIcon;
import java.awt.Container;
import java.awt.BorderLayout;

import javax.swing.border.LineBorder;
import javax.swing.border.EtchedBorder;
import java.awt.Color;
import java.awt.Container;


public class Mati extends JFrame{

public static void main(String[] args){
Mati frame = new Mati();

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setBounds(10, 10,650,650);
frame.setTitle("街");
frame.setVisible(true);

JPanel h = new JPanel();
h.setOpaque(false);

ImageIcon icon1 = new ImageIcon("Mati.jpg");

JLabel label1 = new JLabel(icon1);

JLabel label2 = new JLabel();

h.add(label1);

}


Mati(){


JButton button1 = new JButton("宿屋");
button1.setFont(new Font("Mairyo", Font.PLAIN, 30));

JButton button2 = new JButton("道具屋");
button2.setFont(new Font("Mairyo", Font.PLAIN, 30));

JButton button3 = new JButton("武器屋");
button3.setFont(new Font("Mairyo", Font.PLAIN, 30));

JButton button4 = new JButton("街を出る");
button4.setFont(new Font("Mairyo", Font.PLAIN, 30));

JPanel p = new JPanel();
p.setLayout(new BoxLayout(p, BoxLayout.Y_AXIS));

p.add(Box.createRigidArea(new Dimension(10,30)));
p.add(button1);
p.add(Box.createRigidArea(new Dimension(5,8)));
p.add(button2);
p.add(Box.createRigidArea(new Dimension(5,8)));
p.add(button3);
p.add(Box.createRigidArea(new Dimension(5,8)));
p.add(button4);

getContentPane().add(p, BorderLayout.CENTER);
}
}

ソースはこのようになっています。これからどうすれば背景画像が表示されるか教えていただきたいです。 よろしくお願いします。

「JAVAでの背景画像表示」の質問画像

A 回答 (2件)

標準ライブラリにあるUIコンポーネントを配置することで実現できないような独自の画面表示を行う場合は(背景画像を表示することもこれに当たります)そのような描画をpaintメソッドによって行うようにComponentの派生クラスをを定義してそのコンポーネントを適当な親コンポーネントに配置することで実現します。



質問にあるコードで言えば下記のpがフレームの中身の部分(content pane)を決めるコンポーネントになります。

JPanel p = new JPanel();

pの表示内容はJPanel.paint()で実現されており、このメソッドはJPanelのそもそもの機能である子供コンポーネントを描画することだけを行っています。そこで、子供コンポーネントだけではなく背景イメージも描画してくれるようなJPanelの派生クラスを定義します。このクラスを例えばMatiPanelとしますと、上の行を次のようにします。

JPanel p = new MatiPanel();

さて、MatiPanelの定義ですが、コンストラクターで背景イメージを生成して、背景画像を描画してから子供コンポーネントを描画するには例えば次のようにします。

// 背景画像つきのJPanelの派生クラス
class MatiPanel extends JPanel {
Image backgroundImage;

MatiPanel() {
backgroundImage = Toolkit.getDefaultToolkit().createImage("mati.jpg"); // 背景画像の準備
setOpaque(false); // 背景を透明にする。不透明だと背景画像を描画してもJPanelが背景色で上書きしてしまう。
}

@Override // 上位クラスのメソッドを定義しなおしていることを示すJavaの注釈。なくても構いません
public void paint(Graphics g) {
g.drawImage(backgroundImage, 0, 0, this); // 背景イメージを描画
super.paint(g); // 子供コンポーネントの描画等、上位クラスで実現している表示内容の描画
}
}
    • good
    • 8

単純に、JFrameに何かを表示したいのであれば、paintメソッドをオーバーライドします。



public void paint(Graphics g){
super.paint(g);
g.drawImage(……);
}

ただし、このやり方は、組み込んだコンポーネントの表示更新などで問題を起こしがちなので、あんまり推奨できません。一番いいのは、JPanelなどを継承したイメージ表示のためのクラスを作成し、そこでpaintComponentメソッドをオーバーライドすることでしょう。

protected void paintComponent(Graphics g)
g.drawImage(……);
}

こんな具合です。作成したクラスをJFrameに組み込み表示すればOKです。
イメージのロードはわかりますね? いろいろやりかたはありますがImageIOクラスを利用するあたりが簡単でしょう。

BufferedImage img = ImageIO.read(new FIle(ファイルパス));

これでBufferedImageをロードし、paintComponent内でdrawImageすればいいでしょう。

メソッドの詳細はリファレンスを見て下さい。


http://docs.oracle.com/javase/jp/8/api/java/awt/ …
http://docs.oracle.com/javase/jp/8/api/javax/swi …
http://docs.oracle.com/javase/jp/8/api/java/awt/ …
http://docs.oracle.com/javase/jp/8/api/javax/ima …
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


おすすめ情報