Java 绘制带有JLabel的JPanel渐变背景时出现问题
我有以下代码来绘制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
@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版本或操作系统有关。我用一个演示问题的最小示例更新了主要帖子。