【问题标题】:Simplest way to set image as JPanel background将图像设置为 JPanel 背景的最简单方法
【发布时间】:2013-10-08 04:11:54
【问题描述】:

如何在不创建新类或方法的情况下将背景图像添加到我的 JPanel,而只需将其与 JPanel 的其余属性一起插入?

我正在尝试使用图像设置 JPanel 的背景,但是,我发现的每个示例似乎都建议使用自己的类扩展面板。

我一直在寻找一种方法来简单地添加图像,而无需创建全新的类并在同一方法中(试图使事情保持井井有条且简单)。

这是设置我的 JPanel 的方法示例:

public static JPanel drawGamePanel(){
    //Create game panel and attributes
    JPanel gamePanel = new JPanel();
    Image background = Toolkit.getDefaultToolkit().createImage("Background.png");
    gamePanel.drawImage(background, 0, 0, null);
    //Set Return
    return gamePanel;
}

【问题讨论】:

  • 那么创建自定义JPanel有什么问题?
  • 如何在不创建新类或方法的情况下将背景图像添加到我的 JPanel,而只需将其与 JPanel 的其余属性一起插入?
  • 据我所知,您只能更改颜色或像您看到的示例中那样创建 extends JPanel :)

标签: java image swing background jpanel


【解决方案1】:

我正在尝试使用图像设置 JPanel 的背景,但是,我发现的每个示例似乎都建议使用自己的类扩展面板

是的,您必须扩展 JPanel 并覆盖 paintcomponent(Graphics g) 函数才能这样做。

@Override
  protected void paintComponent(Graphics g) {

    super.paintComponent(g);
        g.drawImage(bgImage, 0, 0, null);
}

我一直在寻找一种方法来简单地添加图像,而无需创建一个全新的类并使用相同的方法(试图让事情保持井井有条)。

您可以使用其他允许直接将图像添加为图标的组件,例如JLabel 如果你愿意的话。

ImageIcon icon = new ImageIcon(imgURL); 
JLabel thumb = new JLabel();
thumb.setIcon(icon);

但又是在括号中试图让事情保持井井有条!是什么让你认为仅仅创建一个新班级就会把你带到一个混乱的世界?

【讨论】:

    【解决方案2】:

    将图像设置为JPanel背景的最简单方法

    不要使用 JPanel。只需使用带有图标的 JLabel,就不需要自定义代码。

    请参阅Background Panel 了解更多信息以及使用 3 种不同绘制选项在 JPanel 上绘制图像的解决方案:

    1. 缩放
    2. 平铺
    3. 实际

    【讨论】:

      【解决方案3】:

      据我所知,您可以这样做的方法是覆盖需要继承 JPanelpaintComponent 方法

       @Override
      protected void paintComponent(Graphics g) {
          super.paintComponent(g); // paint the background image and scale it to fill the entire space
          g.drawImage(/*....*/);
      }
      

      创建第二个自定义 JPanel 并放置的另一种方式(有点复杂)是作为你的主要背景

      图像面板

      public class ImagePanel extends JPanel
      {
      private static final long serialVersionUID = 1L;
      private Image image = null;
      private int iWidth2;
      private int iHeight2;
      
      public ImagePanel(Image image)
      {
          this.image = image;
          this.iWidth2 = image.getWidth(this)/2;
          this.iHeight2 = image.getHeight(this)/2;
      }
      
      
      public void paintComponent(Graphics g)
      {
          super.paintComponent(g);
          if (image != null)
          {
              int x = this.getParent().getWidth()/2 - iWidth2;
              int y = this.getParent().getHeight()/2 - iHeight2;
              g.drawImage(image,x,y,this);
          }
      }
      }
      

      空面板

      public class EmptyPanel extends JPanel{
      
      private static final long serialVersionUID = 1L;
      
      public EmptyPanel() {
          super();
          init();
      }
      
      @Override
      public boolean isOptimizedDrawingEnabled() {
          return false;
      }
      
      
      public void init(){
      
          LayoutManager overlay = new OverlayLayout(this);
          this.setLayout(overlay);
      
          ImagePanel iPanel = new ImagePanel(new IconToImage(IconFactory.BG_CENTER).getImage());
          iPanel.setLayout(new BorderLayout());   
          this.add(iPanel);
          iPanel.setOpaque(false);                
      }
      }
      

      IconToImage

      public class IconToImage {
      
      Icon icon;
      Image image;
      
      
      public IconToImage(Icon icon) {
          this.icon = icon;
          image = iconToImage();
      }
      
      public Image iconToImage() { 
          if (icon instanceof ImageIcon) { 
              return ((ImageIcon)icon).getImage(); 
          } else { 
              int w = icon.getIconWidth(); 
              int h = icon.getIconHeight(); 
              GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); 
              GraphicsDevice gd = ge.getDefaultScreenDevice(); 
              GraphicsConfiguration gc = gd.getDefaultConfiguration(); 
              BufferedImage image = gc.createCompatibleImage(w, h); 
              Graphics2D g = image.createGraphics(); 
              icon.paintIcon(null, g, 0, 0); 
              g.dispose(); 
              return image; 
          } 
      }
      
      
      /**
       * @return the image
       */
      public Image getImage() {
          return image;
      }
      }
      

      【讨论】:

      • 代码注释不应该在下一行吗? “创建第二个自定义 JPanel 并将其作为主面板的背景的另一种方法(有点复杂)”“第二个面板”实际上是如何朝着解决方案发展的?似乎又回到了相同的基本问题(只是在不同的面板中)。
      • @AndrewThompson 如果他的主类扩展了其他类,他不能从JPanel继承,因此他可以添加新的自定义JPanel
      【解决方案4】:

      在添加到框架的 JPanel 的背景上绘制图像。使用布局管理器通常将您的按钮和其他组件添加到面板。如果你添加其他子面板,也许你想设置 child.setOpaque(false)。

      import javax.imageio.ImageIO;
      import javax.swing.*;
      import java.awt.*;
      import java.io.IOException;
      import java.net.URL;
      
      public class BackgroundImageApp {
          private JFrame frame;
      
          private BackgroundImageApp create() {
              frame = createFrame();
              frame.getContentPane().add(createContent());
      
              return this;
          }
      
          private JFrame createFrame() {
              JFrame frame = new JFrame(getClass().getName());
              frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
      
              return frame;
          }
      
          private void show() {
              frame.pack();
              frame.setLocationRelativeTo(null);
              frame.setVisible(true);
          }
      
          private Component createContent() {
              final Image image = requestImage();
      
              JPanel panel = new JPanel() {
                  @Override
                  protected void paintComponent(Graphics g) {
                      super.paintComponent(g);
                      g.drawImage(image, 0, 0, null);
                  }
              };
      
              panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
              for (String label : new String[]{"One", "Dois", "Drei", "Quatro", "Peace"}) {
                  JButton button = new JButton(label);
                  button.setAlignmentX(Component.CENTER_ALIGNMENT);
                  panel.add(Box.createRigidArea(new Dimension(15, 15)));
                  panel.add(button);
              }
      
              panel.setPreferredSize(new Dimension(500, 500));
      
              return panel;
          }
      
          private Image requestImage() {
              Image image = null;
      
              try {
                  image = ImageIO.read(new URL("http://www.johnlennon.com/wp-content/themes/jl/images/home-gallery/2.jpg"));
              } catch (IOException e) {
                  e.printStackTrace();
              }
      
              return image;
          }
      
          public static void main(String[] args) {
              SwingUtilities.invokeLater(new Runnable() {
                  @Override
                  public void run() {
                      new BackgroundImageApp().create().show();
                  }
              });
          }
      }
      

      【讨论】:

        【解决方案5】:
        class Logo extends JPanel
        {
            Logo()
            {
                //code
            }
            @Override
            public void paintComponent(Graphics g) 
            {
                super.paintComponent(g);
                ImageIcon img = new ImageIcon("logo.jpg");
                g.drawImage(img.getImage(), 0, 0, this.getWidth(), this.getHeight(), null);
            }
        }
        

        【讨论】:

          【解决方案6】:

          如下初始化您的 JPANEL。注意缺少的分号.. 而是打开一个花括号,然后覆盖该方法.. 这样您就不必扩展任何内容

            ImageIcon img = new ImageIcon("background.jpg");
            JPanel panel1 = new JPanel()
            {
               @Override
               protected void paintComponent(Graphics g)
               {
                  super.paintComponent(g);
                  g.drawImage(img.getImage(), 0, 0, null);
               }
            };
          

          【讨论】:

            【解决方案7】:
            public demo1() {
                initComponents();
                ImageIcon img = new ImageIcon("C:\\Users\\AMIT TIWARI\\Documents\\NetBeansProjects\\try\\src\\com\\dd.jpeg"); //full path of image
                Image img2 = img.getImage().getScaledInstance(mylabel.getWidth(), mylabel.getHeight(),1);
                ImageIcon img3 = new ImageIcon(img2);
                mylabel.setIcon(img3);
            }
            

            【讨论】:

              猜你喜欢
              • 2021-11-12
              • 2014-01-19
              • 2016-08-10
              • 1970-01-01
              • 2013-05-16
              • 2015-08-17
              • 2011-06-24
              相关资源
              最近更新 更多