将一个JLabel与图像中的JLabel上方(Place JLabel on top of JLab

2019-06-27 18:07发布

我敢肯定,这个问题已经被问过,但我的情况是在我试图把一个JLabel上的一个JLabel充当背景顶部略有不同,我想显示改变使用中的JLabel数字和数字需要显示在背景,但是我提前,乔纳森感到有点摇摆的n00b的,谢谢

Answer 1:

如果没有充分理解你的要求,如果你只需要显示在背景图片的文字,你会更好顶部放置一个自定义面板,能画的背景上的标签。

你得到一个布局管理器的好处而不乱。

我由具有读取槽开始执行风俗画和Graphics2D的足迹 。

如果这似乎令人心悸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);

}



Answer 2:

在运行时:

  • 从其父取下标签
  • 添加一个容器,其支持层
  • 增加2倍层,但保留Z顺序

请享用。 (用于复制 - 粘贴没有给出完整的代码)



Answer 3:

你可以做到这一点的:

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


文章来源: Place JLabel on top of JLabel with image in