Imageの上にJLabelとJTextFieldを配置するにはどうすればいいですか?

私は背景画像とテキストを JLabel の形式で表示するゲームを作成しようとしています。それをどうやってやりますか?

私がこれをやっている主な理由は、異なるフォントサイズの2つの異なるテキストエリアを持つことができるようにすることです。 g.drawString()を使用すると、全体で1つのテキストサイズしか使用できません。

これまでのところ私のコードです:

package com.cgp.buildtown;

import java.awt.Font;
import java.awt.FontFormatException;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GraphicsEnvironment;
import java.awt.RenderingHints;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.swing.JPanel;

public class Intro extends JPanel implements Runnable {
    private static final long serialVersionUID = 1L;
    private Thread thread;
    private BufferedImage bg;
    private Font font;

    public Intro() {
        super();
        loadImages();
        setFont(loadFont(50f));
    }

    private Font loadFont(Float f) {
        try {
            font = Font.createFont(Font.TRUETYPE_FONT, new File("res/komikatext.ttf"));
            GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
            ge.registerFont(font);
        } catch (FontFormatException | IOException e) {
            e.printStackTrace();
        }
        return font.deriveFont(f);
    }

    private void loadImages() {
        try {
            bg = ImageIO.read(new File("res/introbg.png"));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public void addNotify() {
        super.addNotify();
        thread = new Thread(this);
        thread.start();
    }

    public void run() {
        while(true) {
            repaint();
        }
    }

    public void paint(Graphics g) {
        super.paint(g);

        Graphics2D g2 = (Graphics2D) g;
        g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);

        g.drawImage(bg, 0, 0, null);
    }
}
0
先端に感謝します。
追加された 著者 Cg2916,
1. JPanel paint()をオーバーライドしないでください。 paintComponent()を使用します。 2. SSCCE を作成するには、 main(String [])を追加します。
追加された 著者 Andrew Thompson,

2 答え

ここには一つの方法があります。

Intro. screen

もちろん、それはあなた自身のコード/仕様から単純にハッキングされたバージョンです。同じアイデアをもっとうまく実装するには、バックグラウンドパネル

import java.awt.*;
import java.awt.image.BufferedImage;
import javax.swing.*;
import javax.swing.border.EmptyBorder;

import java.net.URL;
import javax.imageio.ImageIO;

public class Intro extends JPanel implements Runnable {
    private static final long serialVersionUID = 1L;
    private Thread thread;
    private BufferedImage bg;
    private String html =
        "<html><body style='color: yellow;'>" +
        "

Game

" + "

Welcome to the Game!"; public Intro() { super(); loadImages(); setLayout(new BorderLayout()); setBorder(new EmptyBorder(40,40,40,40)); add(new JLabel(html), BorderLayout.NORTH); add(new JTextField("..enter name"), BorderLayout.SOUTH); } private void loadImages() { try { URL url = new URL("http://pscode.org/media/stromlo2.jpg"); bg = ImageIO.read(url); setPreferredSize(new Dimension(bg.getWidth(), bg.getHeight())); } catch (Exception e) { e.printStackTrace(); } } public void addNotify() { super.addNotify(); thread = new Thread(this); thread.start(); } public void run() { while(true) { repaint(); } } public void paintComponent(Graphics g) { super.paintComponent(g); Graphics2D g2 = (Graphics2D) g; g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); g.drawImage(bg, 0, 0, this); } public static void main(String[] args) { JOptionPane.showMessageDialog(null, new Intro()); } }

4
追加された
paintComponent +1用
追加された 著者 mKorbel,
1つの問題。 JLabelは私のカスタムフォントが好きではありません。これはg.drawString()で動作するため、正しく読み込まれています。
追加された 著者 Cg2916,
コンパイル時にそれを行いますが、JLabelが必要とするフォントを使用していないという問題は解決しません。
追加された 著者 Cg2916,
「正しくロードされています」これは正しくロードされず、エンドユーザーのマシンに正しくロードされません(そのため、SSCCEでは機能しません)。展開時に、フォントをJarに入れ、 this.getClass()。getResource( "/ res/komikatext.ttf"); を使用してURLを取得します。
追加された 著者 Andrew Thompson,
HTMLスタイルでフォントを設定する必要があります。代わりに、 HTMLを使用せず JLabel.setFont(Font) を選択します。
追加された 著者 Andrew Thompson,

最初に背景画像をロードし、そのプロパティを不透明にしてから他のコンポーネントを追加します。

2
追加された
docs.oracle.com/javase/1.4。 2/docs/api/javax/swing /&hellip; ここでsetOpaque(boolean isOpaque)trueの場合、コンポーネントはその境界内のすべてのピクセルをペイントします。
追加された 著者 DEVANG SHARMA,
「不透明なプロパティ」 JavaDocsのこの「プロパティ」にリンクできますか?
追加された 著者 Andrew Thompson,
今、私は分かる。編集の可能性はありますか? 1) ""不透明なプロパティ "変更してから JComponent プロパティ" を不透明にし、2) JREは JComponent.setOpaque(boolean)
追加された 著者 Andrew Thompson,