2011-12-19 8 views
0

私は、背景イメージとテキストをJLabelの形式で表示するゲームを作成しようとしています。それをどうやってやりますか?Imageの上にJLabelとJTextFieldを配置するにはどうすればよいですか?

私がこれをやっている主要な理由は、異なるフォントサイズの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); 
    } 
} 
+2

1. 'JPanel'の' paint() 'をオーバーライドしないでください。 'paintComponent()'を使用してください。 2. [SSCCE](http://sscce.org/)を作成するには、 'main(String [])'を追加します。 –

+0

チップをありがとう。 – Cg2916

答えて

4

は一つの方法です。

Intro. screen

しかし、単に自分のコード/スペック外のハッキングバージョンですもちろん。同じアイデアをもっとうまく実装するには、Background Panelを参照してください。

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;'>" + 
     "<h1>Game</h1>" + 
     "<p>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()); 
    } 
} 
+0

問題が1つあります。 JLabelは私のカスタムフォントが好きではありません。これはg.drawString()で動作するため、正しく読み込まれています。 – Cg2916

+0

*「正しくロードされています」*ここで正しく読み込まれず、エンドユーザーのマシンに正しくロードされません(SSCCEでは動作しないため)。展開時に、フォントをJarに入れ、 'this.getClass()。getResource("/res/komikatext.ttf ");'を使用してURLを取得します。 –

+0

コンパイル時にそれを行いますが、JLabelが私が望むフォントを使用していないという問題は解決しません。 – Cg2916

-2

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

+0

* "その不透明なプロパティ" * JavaDocsのこの 'プロパティ'にリンクできますか? –

+0

http://docs.oracle.com/javase/1.4.2/docs/api/javax/swing/JComponent.htmlここでsetOpaque(boolean isOpaque) trueの場合、コンポーネントはその境界内のすべてのピクセルをペイントします。 –

+0

私は今理解しています。編集の可能性はありますか? 1)変更する* "次にそのプロパティ" *を* "*に変更し、次に' JComponent'プロパティ "*を不透明にし、廃止されたJREからそのリンクの更新をJava 7ドキュメントにポイントするようにします。[JComponent.setOpaque(boolean )](http://docs.oracle.com/javase/7/docs/api/javax/swing/JComponent.html#setOpaque%28boolean%29)? –

関連する問題