带有Swing的BG图像,不覆盖paintComponent

时间:2011-09-24 21:42:07

标签: java image background jframe jpanel

我目前正在设计一个菜单,其中包含多个屏幕,每个屏幕上都有多个按钮。要在背景图像的顶部使用按钮,这是在jLabel中(默认情况下,我不能将按钮放在jLabel的TOP上),我使用GridBagLayout和两个面板/菜单屏幕,一个面板包含按钮(opaque = false)和一个带有背景图片的面板,或jLabel。为了切换当前显示的面板,根据用户在菜单中的位置,我用不同的方法制作每个菜单屏幕(也就是每两个面板),而不是类。

现在,我已经到了我正在处理不必要复杂的界面部分的地步,我觉得GridBag不会满足我的目的,所以我想知道是否有不同的方法绘制我的背景图像,仍然可以在图像上使用我的按钮。

我查找的最流行的方法是覆盖paintComponent方法,但我不能这样做,因为我已经在单独的方法中创建了JPanel,而不是类。它们都包含在我原来的JFrame中。

非常感谢帮助,谢谢!

刚刚添加了此代码,但由于某些原因,我的背景仍为白色?现在尝试另一个建议,谢谢你们!

private void mainPanel() {

    icon = new ImageIcon(getClass().getResource("/phantasma/menuv1.png"));
mainContainer1 = new javax.swing.JPanel() {
        @Override
        protected void paintComponent(Graphics g) {
            g.drawImage(icon.getImage(), 0,0, null);
            super.paintComponent(g);
        }
    };

2 个答案:

答案 0 :(得分:2)

  

使用Swing而不覆盖paintComponent的BG图像

我不知道为什么所有贴子都建议为此做自定义绘画。如果您需要自动缩放背景图像,则只能进行自定义绘画。

如果您想要以真实尺寸绘制图像,请使用JLabel。

  

我不能把按钮放在jLabel的TOP上,

当然可以。只需为JLabel设置LayoutManager,然后就可以像添加组件到面板一样添加任何组件。

答案 1 :(得分:1)

在上面的评论中,我说:

  

您总是可以创建一个匿名的内部JPanel派生类,并在需要时覆盖paintComponent方法。

作为我的意思的一个例子,您可以在您创建的任何JPanel中覆盖paintComponent,无论它是从独立类派生还是在方法中创建。例如,

import java.awt.Dimension;
import java.awt.Graphics;

import javax.swing.*;

public class AnonInnerPanel {

   private static void createAndShowGui() {
      JPanel mainPanel = new JPanel() {
         @Override
         protected void paintComponent(Graphics g) {
            super.paintComponent(g);
         }

         @Override
         public Dimension getPreferredSize() {
            return new Dimension(300, 200);
         }
      };

      JFrame frame = new JFrame("AnonInnerPanel");
      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();
         }
      });
   }
}