Проблема рисования градиента для jpanel фон с надписи на ней
У меня есть следующий код для рисования фона 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);
}
У меня есть JLabel внутри этой JPanel (с непрозрачным = false), но фон JLabel все еще какой-то серый. Как я могу нарисовать градиент на этом фоне JPanel с прозрачным фоном для JLabel?
Полный рабочий пример ниже:
Демо-фрейм.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
}
JPanelHeader.java:
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);
}
}
1 ответ:
Вы, должно быть, используете какой-то wierd LAF. Если это так, то это должно быть опубликовано в вашем вопросе. На самом деле SSCCE должен быть размещен с каждым вопросом, чтобы мы могли точно видеть, что вы делаете.
Использование Альфа-значения для фонов может вызвать проблемы, как показано на примерефонов с прозрачностью .
Вот простой 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 ); } }