我有一个Java应用程序,它使用本地的LAF(Look and Feel)如下:
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
这很好运作,但是我想让一个按钮拥有红色背景色,结果却像这样:
![enter image description here](https://istack.dev59.com/VTAzo.webp)
我有一个Java应用程序,它使用本地的LAF(Look and Feel)如下:
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
我创建了自己的 CustomColorButton,具有漂亮的渐变色结束效果,并能够在 点击 和 鼠标悬停 时正常运行。
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
CustomColorButton button = new CustomColorButton(Color.RED, Color.WHITE); // Background and font color
button.setText("Color button!");
The CustomColorButton class:
public class CustomColorButton extends JButton implements ActionListener, MouseListener
{
private boolean hovered = false;
private boolean clicked = false;
private Color normalColor = null;
private Color lightColor = null;
private Color darkColor = null;
public CustomColorButton(Color normalRedColor, Color fontColor)
{
setForeground(fontColor);
this.normalColor = normalRedColor;
this.lightColor = normalRedColor.brighter();
this.darkColor = normalRedColor.darker();
addActionListener(this);
addMouseListener(this);
setContentAreaFilled(false);
}
/**
* Overpainting component, so it can have different colors
*/
@Override
public void paintComponent(Graphics g)
{
super.paintComponent(g);
Graphics2D g2d = (Graphics2D) g;
GradientPaint gp = null;
if (clicked)
gp = new GradientPaint(0, 0, darkColor, 0, getHeight(), darkColor.darker());
else if (hovered)
gp = new GradientPaint(0, 0, lightColor, 0, getHeight(), lightColor.darker());
else
gp = new GradientPaint(0, 0, normalColor, 0, getHeight(), normalColor.darker());
g2d.setPaint(gp);
// Draws the rounded opaque panel with borders
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); // For High quality
g2d.fillRoundRect(0, 0, getWidth(), getHeight(), 7, 7);
g2d.setColor(darkColor.darker().darker());
g2d.drawRoundRect(0, 0, getWidth() - 1, getHeight() - 1, 7, 7);
super.paintComponent(g);
}
@Override
public void actionPerformed(ActionEvent arg0)
{
System.out.println("Button clicked!");
}
@Override
public void mouseClicked(MouseEvent arg0)
{
}
@Override
public void mouseEntered(MouseEvent arg0)
{
hovered = true;
clicked = false;
repaint();
}
@Override
public void mouseExited(MouseEvent arg0)
{
hovered = false;
clicked = false;
repaint();
}
@Override
public void mousePressed(MouseEvent arg0)
{
hovered = true;
clicked = true;
repaint();
}
@Override
public void mouseReleased(MouseEvent arg0)
{
hovered = true;
clicked = false;
repaint();
}
}
如果有人遇到和我一样的问题,这里是我采用的解决方法:
我使用ImageIcon将图像作为按钮的子项添加:
BufferedImage stopPicture = null;
try {
stopPicture = ImageIO.read(new File("stop.png"));
} catch (IOException ex) { }
JLabel picLabel = new JLabel(new ImageIcon( stopPicture ));
JButton btnStop = new JButton("");
btnStop.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
SerialTest.getInstance().stopMoving();
}
});
btnStop.add(picLabel);
JButton button = new JButton();
button.setBackground(bg);
变成
JXButton button = new JXButton();
button.setBackgroundPainter(new MattePainter(bg));
如果你必须坚持使用基本的JButton,我认为由于L&F的工作方式,没有解决方案。
图标
; 更多建议在这里。 - trashgod