Java 如何在Swing中创建带有边框阴影的JButton

Java 如何在Swing中创建带有边框阴影的JButton,java,swing,jbutton,Java,Swing,Jbutton,如何创建这样一个内部阴影处于Swing状态的JButton 我想用不同的边框颜色创建JButton,比如顶部和左侧边框颜色应该是黑色,右侧和底部边框颜色应该是白色 但总的来说,我希望顶部和左侧的内部阴影为深灰色,如上图所示。首先,我认为您可以通过简单的斜面顺序来实现这一点,但不幸的是,您无法轻松设置边框的厚度。。。所以我基本上要做一个定制的边框。如果您不喜欢paintBorder方法中“我的按钮”的样式,可以对其进行更多自定义,但您必须知道如何使用图形。以下是我得到的: import java

如何创建这样一个内部阴影处于Swing状态的
JButton

我想用不同的边框颜色创建
JButton
,比如顶部和左侧边框颜色应该是黑色,右侧和底部边框颜色应该是白色


但总的来说,我希望顶部和左侧的内部阴影为深灰色,如上图所示。

首先,我认为您可以通过简单的
斜面顺序来实现这一点,但不幸的是,您无法轻松设置边框的厚度。。。所以我基本上要做一个定制的
边框
。如果您不喜欢
paintBorder
方法中“我的按钮”的样式,可以对其进行更多自定义,但您必须知道如何使用
图形。以下是我得到的:

import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Graphics;
import java.awt.Insets;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.border.Border;

/**
 *
 */
public class MyBorder implements Border {

    private int thickness_ = 4;
    private Color white = Color.WHITE;
    private Color gray = Color.GRAY;
    private Color black = Color.BLACK;

    public static void main(String[] args) {

        JFrame frm = new JFrame("Border Test");
        frm.setLayout(new FlowLayout());
        JButton btn = new JButton("Button");

        MyBorder border = new MyBorder();

        btn.setBorder(border);
        btn.setFocusPainted(false);
        btn.setPreferredSize(new Dimension(60,30));
        btn.setBackground(Color.LIGHT_GRAY);

        frm.add(btn);
        frm.setSize(200,200);
        frm.setVisible(true);

    }

    public void paintBorder(Component c, Graphics g, int x, int y, int width,
            int height) {
        Color oldColor = g.getColor();
        int i;

        for (i = 0; i < thickness_; i++) {
            g.setColor(white);
            g.drawRect(x + i, y + i, width - i - i - 1, height - i - i - 1); //White Rectangle
        }
        for (i = 0; i < thickness_/2; i++) {
            g.setColor(black);
            g.drawLine(x + i, y + i, (width - x) - (i * 2), y + i); //Top Outer Edge
            g.drawLine(x + i, y + i, x + i, (height - y) - (i * 2));  //Left Outer Edge
        }
        for (i = thickness_/2; i < thickness_; i++) {
            g.setColor(gray);
            g.drawLine(x + i, y + i, (width - x) - (i * 2), y + i); //Top Inner Edge
            g.drawLine(x + i, y + i, x + i, (height - y) - (i * 2)); //Left Inner Edge

        }
        g.setColor(oldColor);
    }

    public int getThickness() {
        return thickness_;
    }

    public void setThickness(int i) {
        thickness_ = i;
    }

    public boolean isBorderOpaque() {
        return true;
    }

    public Insets getBorderInsets(Component c) {
        return new Insets(thickness_, thickness_, thickness_, thickness_);
    }

}
导入java.awt.Color;
导入java.awt.Component;
导入java.awt.Dimension;
导入java.awt.FlowLayout;
导入java.awt.Graphics;
导入java.awt.Insets;
导入javax.swing.JButton;
导入javax.swing.JFrame;
导入javax.swing.border.border;
/**
*
*/
公共类MyBorder实现了Border{
私有int厚度_u4;
私有颜色白色=Color.white;
私有颜色灰色=Color.gray;
私有颜色黑色=Color.black;
公共静态void main(字符串[]args){
JFrame frm=新JFrame(“边界测试”);
frm.setLayout(新的FlowLayout());
JButton btn=新JButton(“按钮”);
MyBorder border=新建MyBorder();
btn.订单(边界);
btn.SetFocuspaint(假);
btn.setPreferredSize(新尺寸(60,30));
背景(颜色:浅灰色);
frm.add(btn);
frm.setSize(200200);
frm.setVisible(真);
}
公共空白画框(组件c、图形g、整数x、整数y、整数宽度、,
整数高度){
Color oldColor=g.getColor();
int i;
对于(i=0;i
这是一个“笑话问题”还是什么?因为。我删除了我的答案,因为似乎你自己回答了这个问题…@LuxxMiner:请重新考虑;看看这个相关的。@trashgood我不太明白为什么。他的答案基本上比我的好,因为给出的例子正好产生了图片中的JButton showen。我的回答是为了给他一个“起点”——在这个起点上,他可以进一步定制按钮。但如果你认为我的答案对“一般利益”(当其他人点击这个问题并想知道答案时)有用,那当然。我将取消删除它。@LuxxMiner:在众多装饰Swing按钮的方法中,您的答案包括一个直接解决该问题的链接,而他的链接没有任何帮助。他的回答总体上有所改进,我希望鼓励你们两位。