【问题标题】:BG image with Swing without overriding paintComponent带有 Swing 的 BG 图像而不覆盖paintComponent
【发布时间】:2011-09-24 21:42:06
【问题描述】:

我目前正在设计一个包含多个屏幕的菜单,每个屏幕上有多个按钮。要在 jLabel 中的背景图像顶部使用按钮(默认情况下,我不能将按钮放在 jLabel 的顶部),我使用 GridBagLayout 和两个面板/菜单屏幕,一个面板包含按钮(不透明 = false) 和一个带有背景图像的面板,或 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);
        }
    };

【问题讨论】:

  • 为什么不能覆盖paintComponet?我没有看到任何上面的东西让我相信它不能在你的程序中完成。您始终可以创建一个匿名的内部 JPanel 派生类,并在需要时覆盖其中的 paintComponent 方法。
  • 再次根据我的评论,您应该调用 super.paintComponent() 方法作为您的 paintComponent 覆盖的第一个调用。否则你可以抹去之前画的所有东西。
  • @user962797,你为什么要做自定义绘画?您的问题是关于在不覆盖paintComponent() 的情况下绘制图像。你没看我的评论吗?为什么不使用为您绘制的组件?不需要的时候为什么要重新发明轮子。

标签: java image background jframe jpanel


【解决方案1】:

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

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

如果您希望以真实大小绘制图像,请使用 JLabel。

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

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

【讨论】:

  • 现在我的选票已被重新收取,我可以对您的帖子进行投票。这又是一个更好的答案。
  • 我以后可能会尝试这个,但是我必须学习很多关于手动编写布局管理器的东西。 gridbag 很简单,但是关于组布局的东西我不知道,哈哈。再次感谢你们!
  • 使用 JLabel 与使用 JPanel 没有什么不同。无论您使用什么代码将组件添加到面板,标签都将是相同的。唯一的区别是默认情况下 JPanel 使用 FlowLayout。所以你可能需要添加一个label.setLayout( new FlowLayout() );
【解决方案2】:

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

如果需要,您始终可以创建一个匿名的内部 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();
         }
      });
   }
}

【讨论】:

  • 非常感谢!不知道你能做到这一点,我敢肯定我是编程新手:)。我仍然有一个问题,在那之后,由于某种原因,我的背景在此之后仍然是白色的。编辑:哈哈 k
  • 发布代码作为对原始帖子的编辑,而不是在不可读的评论中。还可以看看 camickr 的建议,因为它可能比我的更好。我会投票,但我没有选票!此外,您可能应该在方法的第一行调用super.paintComponent(g),否则它可能会擦除所有绘制的内容。
  • 如果一段时间后我不能让它工作,我会尝试其他建议,但我正在使用构建器进行基本布局,因为我真的不擅长做 LayoutManager东西严格按照代码,大声笑。是的,我将paintComponent调用切换到第一行,仍然显示为白色,目前正在尝试其他东西。感谢您一直以来的帮助。
  • 再次感谢!现在完美运行,太棒了,你可以像这样覆盖:O
猜你喜欢
  • 2012-07-28
  • 1970-01-01
  • 2012-12-27
  • 1970-01-01
  • 2021-05-22
  • 2014-03-12
  • 1970-01-01
  • 1970-01-01
  • 2012-02-27
相关资源
最近更新 更多