Java 绘制带有JLabel的JPanel渐变背景时出现问题

Java 绘制带有JLabel的JPanel渐变背景时出现问题,java,swing,jpanel,paint,jlabel,Java,Swing,Jpanel,Paint,Jlabel,我有以下代码来绘制JPanel的背景: @Override public void paintComponent(Graphics g) { UIDefaults uid = UIManager.getDefaults(); Graphics2D g2d = (Graphics2D)g; Dimension d = this.getSize(); g2d.setPaint(new GradientPaint(0, 0, uid.getColor("ToolBa

我有以下代码来绘制JPanel的背景:

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

    g2d.setPaint(new GradientPaint(0, 0, uid.getColor("ToolBar.light"), 0, d.height, uid.getColor("ToolBar.shadow"), true));
    g2d.fillRect(0, 0, d.width , d.height);

    g2d.setColor(uid.getColor("ToolBar.light"));
    g2d.drawLine(0, d.height-2, d.width, d.height-2);

    g2d.setColor(uid.getColor("ToolBar.highlight"));
    g2d.drawLine(0, d.height-1, d.width, d.height-1);
 }
我在这个JPanel中有一个JLabel(不透明=false),但是JLabel的背景仍然是灰色的。如何在这个JPanel背景上为JLabel绘制带有透明背景的渐变

完整的工作示例如下:

DemoFrame.java:

import javax.swing.UIManager;

public class DemoFrame extends javax.swing.JFrame {

    public DemoFrame() {
        initComponents();
    }

    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">
    private void initComponents() {

        panelHeader = new Extras.JPanelHeader();
        labelTitle = new javax.swing.JLabel();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

        panelHeader.setOpaque(false);
        panelHeader.setPreferredSize(new java.awt.Dimension(172, 29));
        panelHeader.setLayout(new java.awt.FlowLayout(java.awt.FlowLayout.LEFT));

        labelTitle.setFont(new java.awt.Font("Tahoma", 1, 14)); // NOI18N
        labelTitle.setText("Criar Novo Utilizador");
        labelTitle.setOpaque(true);
        panelHeader.add(labelTitle);

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addComponent(panelHeader, javax.swing.GroupLayout.DEFAULT_SIZE, 200, Short.MAX_VALUE)
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addComponent(panelHeader, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(83, Short.MAX_VALUE))
        );

        pack();
    }// </editor-fold>

    public static void main(String args[]) {
        try {
            UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
        } catch (Exception ex) {
            ex.printStackTrace();
        }

        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new DemoFrame().setVisible(true);
            }
        });
    }

    // Variables declaration - do not modify
    private javax.swing.JLabel labelTitle;
    private Extras.JPanelHeader panelHeader;
    // End of variables declaration

}
import java.awt.Dimension;
import java.awt.GradientPaint;
import java.awt.Graphics;
import java.awt.Graphics2D;
import javax.swing.JPanel;
import javax.swing.UIDefaults;
import javax.swing.UIManager;

public class JPanelHeader extends JPanel {

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

        g2d.setPaint(new GradientPaint(0, 0, uid.getColor("ToolBar.shadow"), 0, d.height, uid.getColor("ToolBar.background"), false));
        g2d.fillRect(0, 0, d.width , d.height);

        g2d.setColor(uid.getColor("ToolBar.light"));
        g2d.drawLine(0, d.height-2, d.width, d.height-2);

        g2d.setColor(uid.getColor("ToolBar.highlight"));
        g2d.drawLine(0, d.height-1, d.width, d.height-1);
     }

}

你一定是用了些威德拉夫。如果是这样的话,那么应该在你的问题中公布。事实上,每一个问题都应该贴上a,这样我们就可以确切地看到你在做什么

使用alpha值作为背景可能会导致问题,如所示

下面是一个简单的SSCCE,它表明您不需要做任何特殊的事情来正确地绘制标签:

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class FaceComponent2 extends JPanel
{
    protected void paintComponent(Graphics g)
    {
        UIDefaults uid = UIManager.getDefaults();
        Graphics2D g2d = (Graphics2D)g;
        Dimension d = this.getSize();

        g2d.setPaint(new GradientPaint(0, 0, uid.getColor("ToolBar.light"),
            0, d.height, uid.getColor("ToolBar.shadow"), true));
        g2d.fillRect(0, 0, d.width , d.height);

        g2d.setColor(uid.getColor("ToolBar.light"));
        g2d.drawLine(0, d.height-2, d.width, d.height-2);

        g2d.setColor(uid.getColor("ToolBar.highlight"));
        g2d.drawLine(0, d.height-1, d.width, d.height-1);
    }


    public static void main(String args[])
        throws Exception
    {
        JComponent face = new FaceComponent2();
        face.setLayout( new GridLayout(0, 1) );
        face.setPreferredSize( new Dimension(250, 250) );
        face.add( new JLabel("Line1") );
        face.add( new JLabel("Line2") );
        face.add( new JLabel("Line3") );

        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().add( face );
        frame.pack();
        frame.setLocationRelativeTo( null );
        frame.setVisible( true );

    }
}

您是否尝试将JLabel的背景色设置为alpha为0的某个颜色?
myLabel.setBackgroundColor(新颜色(0,0,0,0))
或类似的东西,对吗?默认情况下JLabel是非不透明(透明)的。所有你需要做的就是添加标签到面板上,它应该正确地绘制。如果您需要更多帮助,请发布您的SSCCE()。我已经两次声明,解决您的问题不需要特殊编码。您只需创建标签并将其添加到面板中。我甚至发布了一个工作示例。我提供了一个链接来解释setOpaque()方法是如何工作的,但在最近的SSCCE中,出于某种原因,您使用了labelTitle.setOpaque(true)。这是你的问题,摆脱它。没有理由玩弄颜色的alpha值(我再次试图解释您为什么不想这样做)。顺便说一下,您不应该使用:panelHeader.setOpaque(false);。如果正在绘制渐变背景,则面板标题不透明。您不会注意到任何绘画问题,但它令人困惑。我忘记了外观,我正在
main()
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName())如果相关的话,我在Windows上遇到了这个问题。顺便说一下,你的例子看起来很奇怪。我的意思是,我运行了代码,但窗口是空的,我必须调整它的大小使它显示一些东西。这段代码没有什么棘手的地方,发布的代码运行良好,大小合适。我在XP上使用JDK6.7。它与默认的金属LAF和Windows LAF一起工作。如果您甚至不能让发布的代码正常工作,那么您的系统可能有问题,尽管我不知道可能是什么问题。无论如何,这是发布SSCCE的另一个原因,因此我们可以帮助确定问题是与代码有关还是与Java版本或操作系统有关。我用一个演示问题的最小示例更新了主要帖子。