【问题标题】:How do I GradientPaint on multiple jPanels?如何在多个 jPanel 上使用 GradientPaint?
【发布时间】:2011-05-06 00:29:37
【问题描述】:

我有一个视图对象,它是一个 jPanel,并包含其他 jPanel,而这些 jPanel 又包含 jLabels。我想在对象上绘制一个渐变叠加层,使其具有漂亮的时尚外观,而不是无聊的朴素外观。

到目前为止,我的尝试是:

public class InfoDisplay extends javax.swing.JPanel {


    @Override
     public void paintComponent(Graphics g) {
        UIDefaults uid = UIManager.getDefaults();
        Graphics2D g2d = (Graphics2D)g;

        int w = getWidth();
        int h = getHeight();

        Color lightBlue = new Color(41, 117, 200);
        Color darkBlue = new Color(2, 47, 106);

        if (!isOpaque()) {
            super.paintComponent( g );
            return;
        }

        GradientPaint gp = new GradientPaint(0, 0, lightBlue, 0, h, darkBlue );

        g2d.setPaint(gp);
        g2d.fillRect( 0, 0, w, h );

        setOpaque( false );
        super.paintComponent( g );
        setOpaque( true );
    }
}

这似乎根本没有改变对象背景。我对搞乱与 Gui 默认值无关的东西还很陌生。

我使用 Netbeans 中的 Gui 构建器来创建对象,因此 initComponents() 也在类中,但我只发布了与问题相关的源代码。

也许有人可以指出我正确的方向?

【问题讨论】:

  • 你为什么要改变 JPanel 的不透明度。 JPanel 默认是不透明的,而 JComponent 不是。
  • 确实,并且在paintComponent 方法中以一种有趣的方式进行操作。您可能想要发布一个说明您的问题的小型可编译和可运行程序的原始海报,sscce
  • 我的意思是更改主 jPanel 顶部的 jPanel 的不透明度,以便可以查看渐变。谢谢大家的帮助

标签: java jpanel gradient paint


【解决方案1】:

如果您希望背景 JPanel 使用渐变绘制,那么就使用它。不要在代码中使用 setOpaque 和 super.paintComponent 做所有有趣的事情。例如,

import java.awt.Color;
import java.awt.Dimension;
import java.awt.GradientPaint;
import java.awt.Graphics;
import java.awt.Graphics2D;
import javax.swing.*;

@SuppressWarnings("serial")
public class GradientPaintPanel extends JPanel {
   private static final Color LIGHT_BLUE = new Color(41, 117, 200);
   private static final Color DARK_BLUE = new Color(2, 47, 106);

   @Override
   protected void paintComponent(Graphics g) {
      super.paintComponent(g);
      Graphics2D g2 = (Graphics2D) g;
      GradientPaint gradPaint = new GradientPaint(0, 0, LIGHT_BLUE, 0, getHeight(), DARK_BLUE);
      g2.setPaint(gradPaint);
      g2.fillRect(0, 0, getWidth(), getHeight());
   }

   public GradientPaintPanel() {

   }

   private static void createAndShowUI() {
      GradientPaintPanel gradPaintPanel = new GradientPaintPanel();
      gradPaintPanel.setPreferredSize(new Dimension(400, 300));
      JFrame frame = new JFrame("GradientPaintEg");
      frame.getContentPane().add(gradPaintPanel);
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.pack();
      frame.setLocationRelativeTo(null);
      frame.setVisible(true);
   }

   public static void main(String[] args) {
      java.awt.EventQueue.invokeLater(new Runnable() {
         public void run() {
            createAndShowUI();
         }
      });
   }
}

【讨论】:

  • 这很好用。我遇到的问题是我在主面板顶部有 jPanel,我必须设置 opaque false 才能使背景可见
  • @StartingGroovy:是的,然后就像您在 opaque 属性为 false 时所说的那样,让它们成为常规的 JPanel。如果添加 JLabels,请注意默认情况下它们的 opaque 为 false。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-12-06
  • 1970-01-01
  • 2021-05-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多