java - 将 JLabel 放在 JPanel 中的组件上

标签 java swing jpanel awt

我有一个包含组件 imageWindow(this 的对象)的 JPanel,现在我想在这个 imagewindow 的中心放置一个标签标签,但我做不到?

    JPanel imagePanel = new JPanel();
    imagePanel.setLayout(new GridBagLayout());
    imagePanel.add(ic);  //ic is imageWindow obj
    JLabel l1=new JLabel("First Label.");  

    JPanel example =new JPanel();
    example.add(l1);
    imagePanel.add(example);

我在这里做错的是屏幕显示,我需要把标签放在这里。 enter image description here

我想把标签放在中间,但它总是出现在右边,我做错了什么?

最佳答案

您可以在 JPanel 中显示图像,该 JPanel 在其 paintComponent 方法中绘制图像,为同一 JPanel 提供 GridBagLayout,然后将 JLabel 添加到其中。或者类似地,您可以在 JLabel 中将图像显示为 ImageIcon,为该 JLabel 提供一个 GridBagLayout,然后向其添加包含 JLabel 的文本。

例如,在下面的代码中,我在 JPanel 的 paintComponent 方法中显示图像,为该面板提供 GridBagLayout,然后向该面板添加一个 JLabel 相同没有 gridbag 约束的 JPanel,这将使 JLabel 在 JPanel 上居中:

enter image description here

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.GridBagLayout;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.net.URL;

import javax.imageio.ImageIO;
import javax.swing.*;

public class ImageFun extends JPanel {
    private static final String IMG_PATH = "https://aws.labome.com/figure/te-207-12.png";
    private static final String LABEL_TEXT = "Text is Centered";  // JLabel text
    private static final Font LABEL_FONT = new Font(Font.SANS_SERIF, Font.BOLD, 48);
    private static final Color LABEL_FG = Color.YELLOW;
    private BufferedImage img = null;  // our image

    public ImageFun(BufferedImage img) {
        this.img = img;
        setLayout(new GridBagLayout());

        // create JLabel 
        JLabel label = new JLabel(LABEL_TEXT);
        label.setFont(LABEL_FONT);
        label.setForeground(LABEL_FG);
        add(label);  // add without constraints
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        if (img != null) {
            // only draw if the image is not null
            g.drawImage(img, 0, 0, null);
        }
    }

    @Override
    public Dimension getPreferredSize() {
        if (isPreferredSizeSet() || img == null) {
            return super.getPreferredSize();
        }

        // size the JPanel to match that of the image
        int prefW = img.getWidth();
        int prefH = img.getHeight();
        return new Dimension(prefW, prefH);
    }

    private static void createAndShowGui() {

        BufferedImage bImg = null;
        try {
            // get an image
            URL imgUrl = new URL(IMG_PATH);
            bImg = ImageIO.read(imgUrl);
        } catch (IOException e) {
            e.printStackTrace();
        }

        // shove the image into our JPanel
        ImageFun imageFun = new ImageFun(bImg);

        JFrame frame = new JFrame("Image Fun");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().add(imageFun);
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> createAndShowGui());
    }
}

关于java - 将 JLabel 放在 JPanel 中的组件上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45701380/

相关文章:

java - 如何将 6 个相同大小的 JButtons 放入 JPanel?

java - 使用 ContentResolver.Update() 更新 Android 联系人图片时出现问题

java - 自动注释 Java 类的程序/脚本

java - 无法加载 [org.bouncycaSTLe.jcajce.provider.digest.GOST3411$Mappings]

java - 如何重写Java中的fillOval函数?

java - 启用按钮组

java - ListView onClick获取Firebase数据

java - 如何将图形内容捕获为图像

Java GUI 菜单栏

java - 容器不能包含面板数组的非空值