JPanel поверх JLabel - PullRequest
       30

JPanel поверх JLabel

1 голос
/ 22 февраля 2011

Добрый день!

Можно ли добавить JPanel поверх JLabel?

Я бы хотел, чтобы у моего 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 );

Теперь моя проблема в том, что я не могуположить панель на мой JFrame из-за фона JLabel.Пожалуйста, помогите.

Спасибо.

Ответы [ 4 ]

3 голосов
/ 22 февраля 2011

Чтобы создать фоновое изображение для JFrame, я рекомендую вам нарисовать изображение в методе paintComponent JPanel, а затем добавить этот JPanel в contentPane BorderLayout.CENTER, который заполняет contentPane. Возможно, вы даже захотите установить предпочтительный размер JPanel для изображения. Затем вы можете добавить любые компоненты, которые вы хотите, на панель изображений, и вам не нужно беспокоиться о попытке добавить компоненты в 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 голосов
/ 22 февраля 2011

Я не могу поместить панель на JFrame из-за фона JLabel

Это потому, что панель непрозрачна, поэтому она рисует поверх надписи. Вам необходимо использовать:

panel.setOpaque( false );
2 голосов
/ 22 февраля 2011

Вы можете использовать JLayeredPane.Это позволяет добавлять компоненты в разные слои и размещать их поверх друг друга.

0 голосов
/ 22 февраля 2011

уверен ... вы можете .... Используйте IDE NetBEans для упрощения таких утомительных задач, как перетаскивание и написание фактического программирования.

...