在JScrollPane中包含两个JLabel(一个在另一个之上)

时间:2014-03-28 20:58:47

标签: java swing jframe jscrollpane jlabel

我正在使用Netbeans 8.0,我正在尝试为Java程序创建图形界面。我有一个需要滚动条的大背景图像(例如.png,2000x1500像素),我想在背景图像的顶部放置多个文本标签。

换句话说,我试图做的是将JLabel(文本)放在另一个JLabel(图像)的顶部,并将整个事物包含在JScrollPane中,like this

我尝试了很多不同的布局(包括空布局和免费设计)但没有成功。 Netbeans只允许我将一个JLabel包含在JScrollPane中,但不能同时包含两者。我使用的是正确的方法吗?

1 个答案:

答案 0 :(得分:4)

如果您希望将一个标签粘贴在另一个标签上,则为背景标签指定布局并将叠加JLabel添加到其上。

例如:

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.net.URL;

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

public class OverlayingLabels extends JPanel {
   private static final String IMAGE_PATH = "https://duke.kenai.com/italian/BouncingDuke.gif";

   public OverlayingLabels() {
      setLayout(new BorderLayout());
      try {
         URL imageUrl = new URL(IMAGE_PATH);
         BufferedImage image = ImageIO.read(imageUrl);
         ImageIcon icon = new ImageIcon(image);

         JLabel bigLabel = new JLabel(icon);
         bigLabel.setLayout(new FlowLayout());

         JLabel littleLabel = new JLabel("Little Label");
         littleLabel.setFont(littleLabel.getFont().deriveFont(Font.BOLD, 36));
         littleLabel.setForeground(Color.YELLOW);

         // ****** here we add the little label to the big label ******
         bigLabel.add(littleLabel);

         JScrollPane scrollPane = new JScrollPane(bigLabel);
         scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
         int width = bigLabel.getPreferredSize().width;
         int height = bigLabel.getPreferredSize().height / 2;
         scrollPane.getViewport().setPreferredSize(new Dimension(width, height));
         add(scrollPane);

      } catch (IOException e) {
         e.printStackTrace();
      }
   }

   private static void createAndShowGui() {
      OverlayingLabels mainPanel = new OverlayingLabels();

      JFrame frame = new JFrame("OverlayingLabels");
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.getContentPane().add(mainPanel);
      frame.pack();
      frame.setLocationByPlatform(true);
      frame.setVisible(true);
   }

   public static void main(String[] args) {
      SwingUtilities.invokeLater(new Runnable() {
         public void run() {
            createAndShowGui();
         }
      });
   }
}