自定义按钮形状

Java中设计GUI窗口界面时我们会设置Button来交互用户的动作,但有时会觉得默认的Button按钮有些丑,希望可以自定义按钮。
例如下面这个例子:(将按钮定义为圆角矩形)
在这里插入图片描述 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20191128220525615.jpg )
而自定义Button形状就需要了解JButton类中的
paintComponent(Graphics g) 函数 //控制button的填充内容
paintBorder(Graphics g) 函数 //控制button的边框

那么具体怎么实现,直接上文档!!!

由于paintComponent函数需要一个Graphics类型的值,所以我们来查询Graphics类

在这个类下提供了很多方法,例如我们需要将Button改为圆角矩形
fillRoundRect(int x, int y, int width, int height, int arcWidth, int arcHeight)

在这里插入图片描述
下面是最开始例子的代码

/*NewButton类,继承JButton类重写用于绘制按钮形状的函数*/
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class NewButton extends JButton
   private String s;
   private int sizeX;
   private int sizeY;
   public NewButton(String s ,int sizeX,int sizeY)    //传递图片引用
       super(s);
       this.sizeX = sizeX;
       this.sizeY = sizeY;
       setContentAreaFilled(false);
   protected void paintComponent(Graphics g)    //绘制按钮内容
       g.setColor(new Color(31,171,137));
       g.fillRoundRect(0,0,getSize().width-1,getSize().height-1,15,15);        //绘制一个圆角矩形getSize()为获取组件的大小
       //g.drawImage(img, 0,0,50, 40, null);      //除了形状外还可以为按钮绘制一个图片来美化按钮  
       super.paintComponent(g);	//使用父类函数绘制一个焦点框
   protected void paintBorder(Graphics g)   //绘制按钮边框
       g.drawRoundRect(0,0,getSize().width-1,getSize().height-1,15,15);
/*上面例子的代码*/
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class SetWindons extends JFrame 
    private JTextField field_1, field_2;
    private JTextArea area;
    private NewButton button;
    private JLabel label_1, label_2;
    public SetWindons()
        setLayout(new FlowLayout());
        setTitle("面积计算");
        setBounds(200,200,156,200);
        init();
        setVisible(true);
        setDefaultCloseOperation(DISPOSE_ON_CLOSE);
    public void init()
        field_1 = new JTextField (10);
        field_2 = new JTextField(10);
        label_1 = new JLabel("长:");
        label_2 = new JLabel("宽:");
        area = new JTextArea(9,10);
        button = new NewButton("确认",50,30);
        add(label_1);
        add(field_1);
        add(label_2);        
        add(field_2);
        add(button);
        add(area);
        //添加监视器
        button.addActionListener(new ActionListener()	//匿名类实现监听,计算面积
                                        public void actionPerformed(ActionEvent e)
                                            try                     // 异常处理
                                                double a = Double.parseDouble(field_1.getText());
                                                double b = Double.parseDouble(field_2.getText());
                                                double sum = a * b;
                                                area.append("面积为" + sum);
                                            catch(Exception exp)
                                                area.append("输入错误!");

除了圆角矩形外,如果想要构造特殊形状,可以使用里面提供的fillPolygon函数
在这里插入图片描述
其中X坐标数组和Y坐标数组一一对应,这样通过自定义的一些列点来绘制按钮,从而实现特殊形状的绘制。

通过对button类的了解,编写了一个项目。编写时水平有限因此存在很多问题,若有兴趣请自行下载。
https://gitee.com/Aaranlei/keyboard-monitoring-system
在这里插入图片描述

自定义按钮形状在Java中设计GUI窗口界面是我们都会设置Button来处理用户的操作。例如下面这个例子:(将按钮定义为圆角矩形)但是有时候我们会觉得这样的默认按钮不是很美观想要自定义Button的形状,那么自定义Button形状就需要了解JButton类中的paintComponent(Graphics g) 函数 //控制button的填充内容paintBorder(Graphic... 因为JButen是属于小器件型的,所以一般的setSize不能对其惊醒大小的设置,所以一般我们用 button.setPreferredSize(new Dimension(30,30)); //(30,30) 是你要设置按钮的大小 2、对JButton透明的设置 按钮设置为透明,这样就不会挡着后面的背景 button.setContentAreaFi...
用于摆动的自定义按钮 在这个应用程序,我使用了一种非常简单的方法自定义 Java Swing 的按钮。 实际上,我使用了带有图片的 JLabel 并覆盖了 mousePressed()、mouseReleased() 和 mouseMoved() 事件,模拟了按钮行为。 图片可以是任何形状,一旦覆盖事件知道鼠标是悬停在透明像素还是不透明像素上。 例如,我制作了三个不同的图像来代表三个按钮状态: 悬停; 和 单击时,按钮会在控制台打印文本,确认按钮的行为。 当鼠标快速移出时或按下 ALT+TAB 并且鼠标悬停在 JLabel 上时,JLabel 按钮会出现限制,这两种操作都会使 JLabel 图像不会更新为常规图像(不悬停或单击)图像。 可能的解决方案 到目前为止,有一个验证检查鼠标是否不再悬停在一个不透明的像素上,如果是,则图像从悬停图片更新
JButton b1=new JButton("登录"); p1.setLayout(null);// 设置空布局,即绝对布局 l1.setBounds(50, 230, 50, 34);//绝对位置 p1.add(b1); //2.对JButton大小的设置 button.setPreferredSize(new Dimension(50,35)); //3.对JButton透明的设置
按钮继承子JButton,圆角,颜色渐变,有透明度,而且可以自己设置这些参数。 import java.awt.AlphaComposite; import java.awt.Color; import java.awt.Font; import java.awt.GradientPaint; import java.awt.Graphics; import java.awt.Graphics
设置按钮大小以及位置,将按钮加入到JFrame窗口 JButton JB=new JButton("按钮"); JB.setBounds(90,150,50,20);//设置按钮大小以及位置 JF.add(JB);//将按钮加入到JFrame窗口 1.设置按钮大小: JButton jb=new JButton(); jb.setPreferredSize(new Dimension(30,30));//区别于setSize() 2.设置按钮
public Test() { JPanel panel = new JPanel(); panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS)); JButton button = new JButton("Button"); button.setAlignmentY(.5f); panel.add(button); getContentPane().add(panel); setSize(200, 200); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setVisible(true); public static void main(String[] args) { new Test(); ### 回答2: 在Java,如果想要将JButton按钮垂直居,可以使用BoxLayout管理器。BoxLayout是一个在一个面板垂直或水平布置组件的布局管理器。可以用以下代码实现垂直居: ```java JButton button = new JButton("Button"); JPanel panel = new JPanel(); panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS)); panel.add(Box.createVerticalGlue()); panel.add(button); panel.add(Box.createVerticalGlue()); 在上面的代码,先创建一个JButton对象button,然后创建一个JPanel对象panel。将BoxLayout管理器应用于panel,并设置为垂直方向BoxLayouit.Y_AXIS。 接下来,创建两个垂直组件框来增加垂直空间。Box.createVerticalGlue()方法创建一个可伸缩的、不可见的框架,可以在组件之间增加垂直空间。 将第一个垂直组件框添加到面板的开头,第二个垂直组件框添加到面板的末尾,这会将按钮垂直居。 最后,将按钮添加到面板。完成后,将面板添加到你的容器即可。 使用BoxLayout是将JButton按钮垂直居的常用方法,如果你需要固定大小的按钮,并将其垂直居,你可以使用BoxLayout来设置JPanel的最小高度,以适应按钮的大小。 ### 回答3: 在Java编程JButton按钮的垂直居显示是一个相对比较简单的问题。以下是一些实现垂直居方法方法一:使用网格布局和 JPanel 使用网格布局和 JPanel 是实现 JButton 按钮垂直居的一种简单方法。您可以使用一个 JPanel 来容纳 JButton 和其他组件,并使用网格布局来协调它们,以使 JButton 垂直居。 示例代码如下: ```java JPanel panel = new JPanel(new GridLayout(1,1,0,20)); //GridLayout(1, 1, 0, 20)均分,0表示组件之间的间距 JButton button = new JButton("垂直居"); panel.add(button); panel.setPreferredSize(new Dimension(100,100)); 实现结果如下: ![垂直居按钮示例图](https://cdn.luogu.com.cn/upload/image_hosting/mc0yrnhk.png) 方法二:使用 BoxLayout BoxLayout 是一个方便的布局管理器,可以让您将组件相对于容器垂直或水平居。 BoxLayout 有很多选项可以使用,但是对于垂直居按钮,您可以使用以下选项: ```java Box box = Box.createVerticalBox(); box.add(Box.createVerticalGlue()); box.add(button); box.add(Box.createVerticalGlue()); createVerticalBox() 方法创建一个垂直 Box,其添加了两个 vertical glue 组件,这些组件保证了垂直居。 示例代码及效果如下: ```java JPanel panel = new JPanel(); BoxLayout boxLayout = new BoxLayout(panel, BoxLayout.Y_AXIS); panel.setLayout(boxLayout); JButton button = new JButton("垂直居"); panel.add(Box.createVerticalGlue()); panel.add(button); panel.add(Box.createVerticalGlue()); 实现结果如下: ![垂直居按钮示例图](https://cdn.luogu.com.cn/upload/image_hosting/fzz8c5ku.png) 方法三:使用 GridBagLayout GridBagLayout 是 Java 提供的一种高级布局管理器,它提供了对格子单元的更大控制力。可以通过GridBagConstraints 的 gridwidth、gridheight、weightx、weighty 和 anchor 等属性来控制组件如何在其格子单元放置和调整大小。 示例代码及效果如下: ```java JPanel panel = new JPanel(new GridBagLayout()); GridBagConstraints c = new GridBagConstraints(); JButton button = new JButton("垂直居"); c.gridx = 0; c.gridy = 0; c.weightx = 1; c.weighty = 1; c.fill = GridBagConstraints.VERTICAL; c.anchor = GridBagConstraints.CENTER; panel.add(button, c); 实现结果如下: ![垂直居按钮示例图](https://cdn.luogu.com.cn/upload/image_hosting/vyp4pon7.png) 综上,以上是三种实现 JButton 垂直居方法,您可以选择一种方法来实现您需要的功能。