【问题标题】:Place JLabel on top of JLabel with image in将 JLabel 放在 JLabel 的顶部,其中包含图像
【发布时间】:2012-09-03 21:02:32
【问题描述】:

我很确定以前有人问过这个问题,但我的情况略有不同,因为我试图将 JLabel 放在作为背景的 JLabel 之上,我想使用 JLabel 显示不断变化的数字和数字需要显示在背景上,但是我有点摇摆不定,在此先感谢乔纳森

【问题讨论】:

  • 是的,它可以做到,但很难帮助您只说出您想要什么而不告诉我们您尝试过什么或您到底卡在哪里。请帮助我们通过改进此问题来帮助您,包括显示您的代码尝试,最好是sscce。有关对我们有帮助的更多信息,请查看 Jon Skeet 的博客:Asking the Perfect Question
  • 您的问题是什么?即使这对您来说很明显,添加一个明确的问题也是值得的。
  • 而 this 是 Jon Skeet 博客中写出好问题的新候选名单。

标签: java swing jpanel jlabel


【解决方案1】:

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

您可以从没有混乱的布局管理器中受益。

我将从阅读槽 Performing Custom Painting 和 Graphics2D Trail 开始。

如果这看起来令人生畏,JLabel 实际上是Container 的一种类型,这意味着它实际上可以“包含”其他组件。

示例

背景窗格...

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);

}

【讨论】:

  • 是的,我在最后暗示过,这对我来说似乎很乱,并不是说它不能完成,但我没有这个问题的上下文:P跨度>
  • 谢谢,我认为这将是最好的方法,你能给我一个代码示例吗?
  • 喜欢程序员的廉价笑话 :) 非常感谢,这是我正在开发的测验系统。
【解决方案2】:

在运行时:

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

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

【讨论】:

  • “将标签移至其父级”是什么意思?为什么不将 JLabel 添加到另一个 JLabel 上,因为它完全可行且可行?
【解决方案3】:

你可以这样做:

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

【讨论】:

  • JLabel 具有与JComponent 相同的默认null 布局。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-23
  • 2018-07-07
  • 1970-01-01
  • 2012-03-19
相关资源
最近更新 更多