java - JLabel 之上的 JPanel

标签 java swing jframe jpanel background-image

美好的一天!

是否可以在 JLabel 之上添加 JPanel?

我希望我的 JFrame 有背景图片,为此,我使用了这段代码(基于过去的 stackoverflow 答案):

 setLocation(150,50);
 setSize(700,650);
 setVisible(true);
 JLabel contentPane = new JLabel();
 contentPane.setIcon(new ImageIcon("pics/b1.jpg"));
 contentPane.setLayout( new BorderLayout());
 setContentPane( contentPane );

现在我的问题是,由于 JLabel 背景,我无法在我的 JFrame 上放置面板。 请帮忙。

谢谢。

最佳答案

要为 JFrame 创建背景图像,我建议您在 JPanel 的 paintComponent 方法中绘制图像,然后将此 JPanel 添加到填充 contentPane 的 contentPane BorderLayout.CENTER。您甚至可能希望将 JPanel 的 preferredSize 设置为图像的首选大小。然后您可以将任何您想要的组件添加到图像面板,而不必担心尝试将组件添加到 JLabel,这对我来说似乎很糟糕。

例如,这是一个执行此操作但略有不同的程序。它创建一个 ImagePanel 对象,一个 JPanel,它绘制图像并根据图像调整自身大小,然后将其放置在 JScrollPane 中,然后将其添加到 contentPane 中,但是您可以摆脱 JScrollPane 并将图像 JPanel 直接放在contentPane 改为:

import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Image;
import java.io.IOException;
import java.net.URL;

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

public class BigDukeImage {
   public static final String IMAGE_PATH = "http://" + "duke.kenai.com/nyanya/NyaNya.jpg";
   private static final Dimension SCROLLPANE_SIZE = new Dimension(900, 700);

   private static void createAndShowUI() {
      Image image = null;
      try {
         URL url = new URL(IMAGE_PATH);
         image = ImageIO.read(url);
         // JLabel label = new JLabel(new ImageIcon(image));
         ImagePanelA imagePanel = new ImagePanelA(image);

         JScrollPane scrollpane = new JScrollPane();
         // scrollpane.getViewport().add(label);
         scrollpane.getViewport().add(imagePanel);
         scrollpane.setPreferredSize(SCROLLPANE_SIZE);

         JFrame frame = new JFrame("Big Duke Image");
         frame.getContentPane().add(scrollpane);
         frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
         frame.pack();
         frame.setLocationRelativeTo(null);
         frame.setVisible(true);

         JScrollBar vertSBar = scrollpane.getVerticalScrollBar();
         JScrollBar horzSBar = scrollpane.getHorizontalScrollBar();

         vertSBar.setValue((vertSBar.getMaximum() - vertSBar.getVisibleAmount()) / 2);
         horzSBar.setValue((horzSBar.getMaximum() - horzSBar.getVisibleAmount()) / 2);

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

   }

   public static void main(String[] args) {
      java.awt.EventQueue.invokeLater(new Runnable() {
         public void run() {
            createAndShowUI();
         }
      });
   }
}

@SuppressWarnings("serial")
class ImagePanelA extends JPanel {

   private Image image;

   public ImagePanelA(Image image) {
      this.image = image;
      setPreferredSize(new Dimension(image.getWidth(null), image.getHeight(null)));
   }

   @Override
   protected void paintComponent(Graphics g) {
      super.paintComponent(g);
      if (image != null) {
         g.drawImage(image, 0, 0, null);
      }
   }
}

关于java - JLabel 之上的 JPanel,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5079486/

相关文章:

java - 如何手动序列化一个类?

java - Play Framework 配置

java - 从 Java 中的 Arraylist 中删除特定元素?

java - 在面板上添加ActionListener。如何映射到主框架?

java - 按下按钮时运行线程

java - MigLayout 限制 JList 在 JScrollPane 上的滚动

java - 在java中检测多个按键

java - 打印预览(打包不起作用)

Java JTabbedPane 插入颜色

java - 如何将 Swing 组件从 JFrame 移动到 JScrollPane?