Java 当我改变其中一些按钮的背景色而不是其他按钮的背景色时,如何使这些按钮看起来都一样?
我有一个JFrame,我在上面放了几个JButton。一半的JButton都有颜色编码——也就是说,当X事件发生时,我把它们变成蓝色——我使用btn.setBackgroundColor(颜色)。当我使用setBackgroundColor时,我可以看到正常的JButtons有阴影/着色/一些使用setBackgroundColor的按钮没有的东西。我尝试过将颜色透明到有限的程度,但我仍然得到一块平坦的颜色,而不是着色按钮的着色版本 这似乎是一件很容易修复的事情,但它现在正困扰着我。我不想改变默认的LAF——这很好。我不想放弃颜色的改变。我确实希望所有按钮都显示为样式(我将用于HTML的单词) 所以我错过了一些东西…是什么 编辑以添加:Java 当我改变其中一些按钮的背景色而不是其他按钮的背景色时,如何使这些按钮看起来都一样?,java,swing,jbutton,look-and-feel,Java,Swing,Jbutton,Look And Feel,我有一个JFrame,我在上面放了几个JButton。一半的JButton都有颜色编码——也就是说,当X事件发生时,我把它们变成蓝色——我使用btn.setBackgroundColor(颜色)。当我使用setBackgroundColor时,我可以看到正常的JButtons有阴影/着色/一些使用setBackgroundColor的按钮没有的东西。我尝试过将颜色透明到有限的程度,但我仍然得到一块平坦的颜色,而不是着色按钮的着色版本 这似乎是一件很容易修复的事情,但它现在正困扰着我。我不想改变默
JFrame frame = new JFrame();
frame.add(new JButton("42"));
JButton btn24 = new JButton("24");
btn24.setBackground(Color.red);
frame.add(btn24);
frame.setVisible(true);
在上面的示例中,在我的Windows机器上,“42”将在底部和顶部显示轻微的颜色变化,从而产生圆形和阴影效果。“24”按钮将显示一个红方块。我的问题是:有没有办法让“24”显示圆形/阴影/顶部带有红色色调的样式?或者我需要简单地把所有的按钮做成正方形,以获得统一的外观
谢谢 创建自定义JButton并覆盖绘制方法,如下图所示:
import static javax.swing.JFrame.EXIT_ON_CLOSE;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.GradientPaint;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Paint;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class Test {
public static void main(String[] args) {
JButton btn24 = new DepthButton("24");
JButton btn25 = new DepthButton("25");
btn24.setBackground(Color.red);
btn25.setBackground(Color.GREEN);
JPanel pane = new JPanel(new BorderLayout());
pane.add(new JButton("42"), BorderLayout.PAGE_START);
pane.add(btn24, BorderLayout.PAGE_END);
pane.add(btn25, BorderLayout.CENTER);
frame.add(pane);
frame.pack();
frame.setDefaultCloseOperation(EXIT_ON_CLOSE);
frame.setVisible(true);
}
/**
*
* @author Romain Guy
*/
public static class DepthButton extends JButton {
/** Creates a new instance of DepthButton */
public DepthButton(String text) {
super(text);
setContentAreaFilled(false);
}
@Override
protected void paintComponent(Graphics g) {
Graphics2D g2 = (Graphics2D) g;
GradientPaint p;
p = new GradientPaint(0, 0, new Color(0xFFFFFF), 0, getHeight(), getBackground());
Paint oldPaint = g2.getPaint();
g2.setPaint(p);
g2.fillRect(0, 0, getWidth(), getHeight());
g2.setPaint(oldPaint);
super.paintComponent(g);
}
}
}
结果如下:
这个例子来自一本关于高级JavaSwing的好书:肮脏的富客户端
发布您已经尝试过的代码,可能是您所说的“着色/着色/有挫折背景色的人所没有的东西”的图像,请看@mKorbel的答案。然后投票表决他的答案,因为它真的很神奇。再看看camickr的答案,我在看@mKorbel的答案。camickr的测试代码显示了与我在Windows和Java 7上看到的setBackgroundColor几乎相同的东西。对不起,我没有投票权。我确实多看了一些,现在正在看GradientPaint。实现起来很麻烦,但看起来我想要的是用渐变色覆盖paintComponent。亲爱的气垫船和Java Devil,是的——问题是当你设置背景色时——无论你是使用.setBackground(颜色)还是在它上面绘制矩形/形状——都(默认情况下)不使用渐变色。因此,在上面的示例中,42按钮具有渐变(着色/样式),因为在默认LAF中,它使用渐变绘制按钮。24按钮(至少在我的系统上默认)以普通的颜色显示颜色,而不是渐变。谢谢你给我指明了正确的方向。如果我有代表,我会投@mKorbel(和气垫船)的票。我试过了,它似乎在我的windows机器上工作。我使用了getBackground而不是新颜色(0xC8D2DE)