Java 将JLabel放置在JLabel的顶部,图像位于

Java 将JLabel放置在JLabel的顶部,图像位于,java,swing,jpanel,jlabel,Java,Swing,Jpanel,Jlabel,我很确定以前有人问过这个问题,但我的情况略有不同,因为我试图将一个JLabel放在一个JLabel上作为背景,我想使用JLabel显示不断变化的数字,数字需要显示在背景上,但是我有点像swing n00b,提前感谢,Jonathan如果您不完全理解您的要求,只需要在背景图像上显示文本,最好将标签放在能够绘制背景的自定义面板上 您可以享受布局管理器带来的好处,而不会造成混乱 我会从一个阅读槽开始 如果这看起来令人望而生畏,JLabel实际上是一种容器,这意味着它实际上可以“包含”其他组件 示例 背

我很确定以前有人问过这个问题,但我的情况略有不同,因为我试图将一个JLabel放在一个JLabel上作为背景,我想使用JLabel显示不断变化的数字,数字需要显示在背景上,但是我有点像swing n00b,提前感谢,Jonathan

如果您不完全理解您的要求,只需要在背景图像上显示文本,最好将标签放在能够绘制背景的自定义面板上

您可以享受布局管理器带来的好处,而不会造成混乱

我会从一个阅读槽开始

如果这看起来令人望而生畏,
JLabel
实际上是一种
容器
,这意味着它实际上可以“包含”其他组件

示例

背景窗格

public class PaintPane extends JPanel {

    private Image background;

    public PaintPane(Image image) {     
        // This is just an example, I'd prefer to use setters/getters
        // and would also need to provide alignment options ;)
        background = image;            
    }

    @Override
    public Dimension getPreferredSize() {
        return background == null ? new Dimension(0, 0) : new Dimension(background.getWidth(this), background.getHeight(this));            
    }

    @Override
    protected void paintComponent(Graphics g) {

        super.paintComponent(g);

        if (background != null) {                
            Insets insets = getInsets();

            int width = getWidth() - 1 - (insets.left + insets.right);
            int height = getHeight() - 1 - (insets.top + insets.bottom);

            int x = (width - background.getWidth(this)) / 2;
            int y = (height - background.getHeight(this)) / 2;

            g.drawImage(background, x, y, this);                
        }

    }

}
用…建造的

public TestLayoutOverlay() throws IOException { // Extends JFrame...

    setTitle("test");
    setLayout(new GridBagLayout());
    setDefaultCloseOperation(EXIT_ON_CLOSE);

    PaintPane pane = new PaintPane(ImageIO.read(new File("fire.jpg")));
    pane.setLayout(new BorderLayout());
    add(pane);

    JLabel label = new JLabel("I'm on fire");
    label.setFont(label.getFont().deriveFont(Font.BOLD, 48));
    label.setForeground(Color.WHITE);
    label.setHorizontalAlignment(JLabel.CENTER);
    pane.add(label);

    pack();
    setLocationRelativeTo(null);
    setVisible(true);

}
为了证明我没有偏见;),使用标签的示例

public TestLayoutOverlay() {

    setTitle("test");
    setLayout(new GridBagLayout());
    setDefaultCloseOperation(EXIT_ON_CLOSE);

    JLabel background = new JLabel(new ImageIcon("fire.jpg"));
    background.setLayout(new BorderLayout());
    add(background);

    JLabel label = new JLabel("I'm on fire");
    label.setFont(label.getFont().deriveFont(Font.BOLD, 48));
    label.setForeground(Color.WHITE);
    label.setHorizontalAlignment(JLabel.CENTER);
    background.add(label);

    pack();
    setLocationRelativeTo(null);
    setVisible(true);

}
运行时:

  • 从其父项中删除标签
  • 添加支持层的容器
  • 添加2x层,但保持Z顺序

享受。(没有提供复制粘贴的完整代码)

您可以通过以下方式执行此操作:

JLabel l1=new JLabel();
JLabel l2=new JLabel();
l1.add(l2, JLabel.NORTH);

是的,这是可以做到的,但是你很难帮助你说你想要什么,而不告诉我们你做了什么,或者你到底被困在哪里。请帮助我们改进此问题,包括显示您的代码尝试,最好是。更多关于什么能帮助我们的信息,请看Jon Skeet的博客:你的问题是什么?即使你觉得这很明显,添加一个明确的问题也是值得的。而新的短名单是从Jon Skeet的博客中写出一个好问题的。什么是“将标签移除给它的父母”呢?为什么不在另一个JLabel上添加一个JLabel,因为它是完全可行的?是的,我在最后暗示过,它看起来很混乱,不是说它不能完成,但我不知道问题的背景:PThanks,我认为这将是最好的方法,你能为我提供一个代码示例plz吗?我喜欢程序员的低级笑话:)非常感谢,这是我正在开发的一个测验系统。
JLabel
JComponent
具有相同的默认
null
布局。