現在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);
}
}
ソースはこのようになっています。これからどうすれば背景画像が表示されるか教えていただきたいです。 よろしくお願いします。
A 回答 (2件)
- 最新から表示
- 回答順に表示
No.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); // 子供コンポーネントの描画等、上位クラスで実現している表示内容の描画
}
}
No.1
- 回答日時:
単純に、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 …
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Java java 入力 3 4 3 出力 ABC DEFG HIJ このようなプログラムの書き方を教えてくだ 2 2022/07/15 14:18
- C言語・C++・C# C#テキストボックスの文字を配列にいれてその後表示する 4 2022/07/17 04:47
- JavaScript GoogleChart 階層ごとのブロックの長さを個別に設定したい 1 2022/07/06 14:27
- JavaScript 1日1回引けるJavaScriptおみくじについて 1 2022/12/12 22:28
- PHP jpgraphで表示されない 2 2022/10/22 09:12
- 英語 難解な英文 2 2023/07/28 22:24
- 英語 英文解釈 4 2023/07/26 13:54
- Ruby 【JAVA】数字をひし形に出力するプログラムについて 2 2022/07/11 23:32
- 英語 課題でこの英語の文章のSVOの分析や()等の括りを出されたため、できるだけ完璧にしたいのですが、自身 1 2022/12/16 13:29
- その他(クラウドサービス・オンラインストレージ) Google ColabでGoogleドライブのサブフォルダにファイルを生成する方法 1 2022/10/31 17:37
このQ&Aを見た人はこんなQ&Aも見ています
-
性格の違いは生まれた順番で決まる?長男長女・中間子・末っ子・一人っ子の性格の傾向
同じ環境で生まれ育っても、生まれ順で性格は違うものなのだろうか。家庭教育研究家の田宮由美さんに教えてもらった。
-
画面を隠す・消す方法を教えてください。
Java
-
Buttonを押すと画像が表示されるには?
Java
-
JButton-背景の透明化
Java
-
-
4
パネルに画像
Java
-
5
【swing】ボタンクリックにより、パネルごとの差し替えを行う
Java
-
6
JPanelの重ね方/OverlayLayout他
Java
-
7
JavaのswingでCardLayoutの画面遷移がしたいです
Java
-
8
ボタンの複数割り当てについて
Java
-
9
javaプログラムで背景色を変更するには
Java
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C# DataGridView のCellPaintin...
-
VB.NET フォーム上に描いたグ...
-
Exception occurred during eve...
-
DirectXのスプライト機能で3D回転
-
BMP画像を画像処理して連続に表...
-
エクセルVBAで、条件に一致する...
-
複数の変数を宣言する時、同時...
-
変数名の付け方
-
「タイプ初期化子が例外をスロ...
-
private static という変数の修飾
-
エクセルVBA 画像を貼り付ける...
-
パワーポイントのVBAでテキスト...
-
SQLを連続発行する時の正しい(?...
-
生成したインスタンスを削除す...
-
VBAでの[]
-
インスタンス参照でアクセスで...
-
コマンドライン引数のチェック
-
Java初級 引数に適用できません
-
エクセルVBAにおけるON TIMEメ...
-
C#のクラスで値渡しをする
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VB.NET フォーム上に描いたグ...
-
C# DataGridView のCellPaintin...
-
VB.NETのSendMessageを教えてく...
-
canvasで表示されてる画像を1...
-
Exception occurred during eve...
-
requestanimationframeを一斉に...
-
Labelコントロールの背景をグラ...
-
SwingとEDT(イベントディスパッ...
-
C# リストビューの特定のセルの...
-
MFCでMSペイントみたいなツー...
-
画面のちらつきの原因が知りた...
-
JAVAでの背景画像表示
-
Androidで画像の中で指定した範...
-
このプログラミングをどう組み...
-
描画してもウィンドウをリサイ...
-
JavaScriptで直線を描画したい
-
SwingのpaintComponent(...
-
BMP画像を画像処理して連続に表...
-
Java 15パズルを作ったのですが...
-
<JFreeChart> 縦軸の値の間隔を...
おすすめ情報