【问题标题】:JPanel on top of JLabelJLabel 之上的 JPanel
【发布时间】:2011-02-22 14:38:00
【问题描述】:

美好的一天!

是否可以在 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 上放置面板。 请帮忙。

谢谢。

【问题讨论】:

  • 请参阅我的回答。

标签: java swing jframe jpanel background-image


【解决方案1】:

要为 JFrame 创建背景图像,我建议您在 JPanel 的 paintComponent 方法中绘制图像,然后将此 JPanel 添加到 contentPane BorderLayout.CENTER 中,使其填充 contentPane。您甚至可能希望将 JPanel 的 PreferredSize 设置为 Image。然后,您可以将任何您想要的组件添加到图像面板,而不必担心尝试将组件添加到 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);
      }
   }
}

【讨论】:

    【解决方案2】:

    您可以使用 JLayeredPane。这使您可以将组件添加到不同的层并让它们相互叠加。

    【讨论】:

      【解决方案3】:

      由于 JLabel 背景,我无法在 JFrame 上放置面板

      那是因为面板是不透明的,所以它会在标签上方绘制。你需要使用:

      panel.setOpaque( false );
      

      【讨论】:

        【解决方案4】:

        当然..你可以..使用 NetBEans IDE 通过拖放和编写实际编程来简化此类繁琐的任务..

        【讨论】:

        • 对于原型设计或真正了解 Swing 的人来说还可以,但如果您正在尝试学习 Swing,使用 NetBeans 生成代码可能会使这种教育有所退步。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-03-12
        • 1970-01-01
        • 2019-07-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多