【发布时间】:2019-07-27 12:38:41
【问题描述】:
我正在为 swing 开发一种新的外观和感觉,现在当我在 JComponent 中创建阴影时遇到问题 一个示例当我去创建颜色与白色不同的 JButton 时我有一个不正确的问题阴影效果
这是创建阴影的代码。
protected void paintShadow(@NotNull Graphics g, @NotNull JComponent c){
int shade = 0;
int topOpacity = 80;
int pixels = UIManager.getInt("Button[Default].shadowPixel");
JButton b = (JButton) c;
for (int i = 0; i < pixels; i++) {
g.setColor(new Color(shade, shade, shade, ((topOpacity / pixels) * i)));
g.drawRoundRect(i, i, b.getWidth() - ((i * 2) + 1), b.getHeight() - ((i * 2) + 1), 7, 7);
}
}
这就是白色的正确效果
这是用其他颜色的错误效果
如何概括我的方法绘制阴影?
这是此代码的最小示例
import javax.swing.*;
import javax.swing.plaf.basic.BasicButtonUI;
import java.awt.*;
/**
* @author https://github.com/vincenzopalazzo
*/
public class MaterialMain extends JFrame {
static {
UIManager.put("Button[Default].shadowPixel", 3);
}
public void init() {
JPanel panel = new JPanel();
JButton witheRightEffect = new JButton("shadow withe");
witheRightEffect.setUI(new ShadowButtonUI());
JButton otherColorWrongEffect = new JButton("shadow other color");
otherColorWrongEffect.setBackground(Color.GREEN);
otherColorWrongEffect.setUI(new ShadowButtonUI());
panel.add(witheRightEffect);
panel.add(otherColorWrongEffect);
setTitle("Look and feel");
setDefaultCloseOperation(EXIT_ON_CLOSE);
setSize(630, 360);
add(panel);
setLocationRelativeTo(null);
setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
MaterialMain main = new MaterialMain();
main.init();
}
});
}
public class ShadowButtonUI extends BasicButtonUI{
@Override
public void installUI(JComponent c) {
super.installUI(c);
c.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
}
@Override
public void paint(Graphics g, JComponent c) {
super.paint(g, c);
paintShadow(g, c);
}
protected void paintShadow( Graphics g, JComponent c){
int shade = 0;
int topOpacity = 80;
int pixels = UIManager.getInt("Button[Default].shadowPixel");
JButton b = (JButton) c;
for (int i = 0; i < pixels; i++) {
g.setColor(new Color(shade, shade, shade, ((topOpacity / pixels) * i)));
g.drawRoundRect(i, i, b.getWidth() - ((i * 2) + 1), b.getHeight() - ((i * 2) + 1), 7, 7);
}
}
}
}
按钮白色是正确的效果,但按钮绿色阴影是错误的
【问题讨论】:
-
非常感谢您的回答,但是为了添加一个示例,我需要所有的外观和提要,所以在帖子中我添加了对 Github 项目的引用
-
“我添加了对 Github 项目的引用” 我没有关注代码链接。如果您不能将其归结为 MRE / SSCCE,那么预计会获得更少的帮助,如果有的话,以后会。
-
#vincenzopalazzo 不可能知道您在寻找什么 - 正如您所说的外观和感觉 - 所以它看起来不错!去吧!
-
我建议使用公式 ((topOpacity / 像素) * i) 进行良好的调试 - 打印出所有值,看看你得到的是你所期望的。
-
我添加了最小示例,非常感谢您的帮助@AndrewThompson
标签: java swing material-design look-and-feel