Java 如何将JLabel和JTextField放在图像的顶部?

Java 如何将JLabel和JTextField放在图像的顶部?,java,swing,jlabel,bufferedimage,jtextfield,Java,Swing,Jlabel,Bufferedimage,Jtextfield,我正在尝试创建一个游戏,在上面有一个背景图像和文本,形式为JLabels。我该怎么做呢 我这样做的主要原因是我可以有两个不同字体大小的文本区域。使用g.drawString()只允许您在整个过程中使用1个文本大小 以下是我目前的代码: package com.cgp.buildtown; import java.awt.Font; import java.awt.FontFormatException; import java.awt.Graphics; import java.awt.Gra

我正在尝试创建一个游戏,在上面有一个背景图像和文本,形式为
JLabel
s。我该怎么做呢

我这样做的主要原因是我可以有两个不同字体大小的文本区域。使用
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);
    }
}
这里有一个方法

但当然,这仅仅是一个从你自己的代码/规范中删掉的版本。要更好地实现相同的想法,请参见此

import java.awt.*;
导入java.awt.image.buffereImage;
导入javax.swing.*;
导入javax.swing.border.EmptyBorder;
导入java.net.URL;
导入javax.imageio.imageio;
公共类简介扩展了JPanel实现Runnable{
私有静态最终长serialVersionUID=1L;
私有线程;
专用缓冲区映像bg;
私有字符串html=
"" +
“游戏”+
“欢迎参加游戏!”;
公开简介({
超级();
loadImages();
setLayout(新的BorderLayout());
新订单(新订单(40,40,40,40));
添加(新的JLabel(html),BorderLayout.NORTH);
添加(新JTextField(“…输入名称”),BorderLayout.SOUTH);
}
私有void loadImages(){
试一试{
URL=新URL(“http://pscode.org/media/stromlo2.jpg");
bg=ImageIO.read(url);
setPreferredSize(新维度(bg.getWidth(),bg.getHeight());
}捕获(例外e){
e、 printStackTrace();
}
}
public void addNotify(){
super.addNotify();
线程=新线程(此);
thread.start();
}
公开募捐{
while(true){
重新油漆();
}
}
公共组件(图形g){
超级组件(g);
图形2d g2=(图形2d)g;
g2.setRenderingHint(renderingHits.KEY\u ANTIALIASING,renderingHits.VALUE\u ANTIALIAS\u ON);
g、 drawImage(bg,0,0,this);
}
公共静态void main(字符串[]args){
showMessageDialog(null,newintro());
}
}

首先加载背景图像,然后不透明其属性,然后在其上添加其他组件。

1。不要在
JPanel
中重写
paint()
。使用
paintComponent()
。2.若要创建一个,请添加一个
main(字符串[])
。一个问题。JLabel不喜欢我的自定义字体。它加载正确,因为它与g.drawString()一起工作。“它加载正确”它在这里加载不正确,并且不会在最终用户的机器上正确加载(因此,它也不会在SSCCE中工作!)。在部署时,将字体放入Jar中,并使用
this.getClass().getResource(“/res/komikatext.ttf”)获取URL。好的,我会在编译时这样做,但这并不能解决JLabel没有使用我想要的字体的问题。有必要在HTML样式中设置字体。或者,不要使用HTML和调用。“然后不透明它的属性”您可以在JavaDocs中链接到这个“属性”吗?这里setOpaque(boolean isOpaque)如果为true,组件将在其边界内绘制每个像素。我现在明白了。有机会编辑吗?1) 将“then opaque its property”更改为“then opaque the
JComponent
property”,并将该链接从过时的JRE更新为指向位于的Java 7文档?
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());
    }
}