Java 带Swing的BG图像,不覆盖组件

Java 带Swing的BG图像,不覆盖组件,java,image,background,jframe,jpanel,Java,Image,Background,Jframe,Jpanel,我目前正在设计一个菜单,有几个屏幕,每个屏幕上有多个按钮。为了使用jLabel中背景图像顶部的按钮(默认情况下,我不能将按钮放在jLabel顶部),我使用了GridBagLayout,它有两个面板/菜单屏幕,一个面板包含按钮(不透明=假),另一个面板包含背景图像,即jLabel。为了切换当前显示的面板,根据用户在菜单中的位置,我将每个菜单屏幕(也称为每2个面板)设置为单独的方法,而不是类 现在,我已经到了一个地步,我正在处理界面中不必要的复杂部分,我觉得GridBag不能满足我的目的,所以我想知

我目前正在设计一个菜单,有几个屏幕,每个屏幕上有多个按钮。为了使用jLabel中背景图像顶部的按钮(默认情况下,我不能将按钮放在jLabel顶部),我使用了GridBagLayout,它有两个面板/菜单屏幕,一个面板包含按钮(不透明=假),另一个面板包含背景图像,即jLabel。为了切换当前显示的面板,根据用户在菜单中的位置,我将每个菜单屏幕(也称为每2个面板)设置为单独的方法,而不是类

现在,我已经到了一个地步,我正在处理界面中不必要的复杂部分,我觉得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);
        }
    };

在我的上述评论中,我声明:

您始终可以创建一个匿名的内部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();
         }
      });
   }
}
带Swing的BG图像,不覆盖组件

我不知道为什么所有的帖子都建议为这个做定制绘画。只有在需要自动缩放背景图像时,才能进行自定义绘制

如果您希望以真实尺寸绘制图像,请使用JLabel

我不能把按钮放在桌子上


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

为什么不能覆盖paintComponet?我看不出有什么比这更能让我相信它不能在你的程序中实现。您始终可以创建一个匿名内部JPanel派生类,并在需要时重写那里的paintComponent方法。同样,根据我的评论,您应该调用
super.paintComponent()
方法作为paintComponent重写的第一个调用。否则您可能会删除以前绘制的所有内容。@user962797,为什么要进行自定义绘制?您的问题是关于在不覆盖paintComponent()的情况下绘制图像。你没读我的评论吗?你为什么不使用一个可以为你画画的组件呢?为什么在你不需要的时候重新发明轮子呢?非常感谢!我不知道你能做到这一点,我相信很明显我是编程新手:)。我仍然有一个问题,在那之后,出于某种原因,我的背景在这之后仍然是白色的。编辑:lol kPost代码作为对原始帖子的编辑,而不是在无法阅读的评论中。还可以看看camickr的建议,因为它可能比我的好。我会投票的,但我没有票了!另外,您可能应该在方法的第一行调用
super.paintComponent(g)
,否则它可能会删除所有绘制的内容。如果我过一段时间后无法使其工作,我将尝试其他建议,但我使用的是基本布局的生成器,因为我非常不擅长严格按照代码来做布局管理器的工作,哈哈。是的,我将paintComponent调用切换到第一行,仍然显示为白色,正在尝试其他东西。感谢您的持续帮助。再次感谢!它现在运行得很好,所以你可以像这样覆盖:一旦我的选票被重新收费,我就可以为你的帖子投票。同样,这是一个更好的答案。我可能稍后会尝试,但我必须学习很多关于手动编码布局管理器的东西。gridbag很简单,但是我知道关于群组布局的事情,哈哈。再次感谢你们两位!使用JLabel与使用JPanel没有什么不同。用于将组件添加到面板的任何代码对于标签都是相同的。唯一的区别是默认情况下JPanel使用FlowLayout。因此,您可能需要添加一个
label.setLayout(newflowlayout())