关于Java中JButton类——自定义按钮形状

自定义按钮形状

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
在这里插入图片描述

  • 12
    点赞
  • 73
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Java 的 CardLayout 布局按钮的位置取决于所使用的面板的布局方式。你可以使用不同的布局方式来自定义按钮的位置。下面是一些例子: 1. 使用 BorderLayout 布局 在 BorderLayout 布局,你可以将按钮放置在面板的 NORTH 或 SOUTH 区域,然后将卡片面板放置在 CENTER 区域。这样,按钮将会显示在卡片面板的上方或下方。 ```java JPanel buttonPanel = new JPanel(); buttonPanel.add(new JButton("切换到下一个卡片"), BorderLayout.NORTH); JPanel cardPanel = new JPanel(new CardLayout()); cardPanel.add(new JPanel(), "CARD1"); cardPanel.add(new JPanel(), "CARD2"); JFrame frame = new JFrame(); frame.add(buttonPanel, BorderLayout.NORTH); frame.add(cardPanel, BorderLayout.CENTER); ``` 2. 使用 GridBagLayout 布局 在 GridBagLayout 布局,你可以使用 `GridBagConstraints` 对象来指定按钮的位置和大小。例如,你可以将按钮放置在面板的左上方,然后将卡片面板放置在面板的右下方。 ```java JPanel panel = new JPanel(new GridBagLayout()); GridBagConstraints gbc = new GridBagConstraints(); // 添加按钮 gbc.gridx = 0; gbc.gridy = 0; gbc.anchor = GridBagConstraints.NORTHWEST; panel.add(new JButton("切换到下一个卡片"), gbc); // 添加卡片面板 gbc.gridx = 1; gbc.gridy = 1; gbc.weightx = 1.0; gbc.weighty = 1.0; gbc.fill = GridBagConstraints.BOTH; panel.add(new JPanel(new CardLayout()), gbc); JFrame frame = new JFrame(); frame.add(panel); ``` 3. 使用 GroupLayout 布局 在 GroupLayout 布局,你可以使用 `Group` 对象来指定按钮的位置和大小。例如,你可以将按钮放置在面板的左上方,然后将卡片面板放置在面板的右下方。 ```java JPanel panel = new JPanel(); GroupLayout layout = new GroupLayout(panel); panel.setLayout(layout); // 添加按钮 layout.setHorizontalGroup(layout.createSequentialGroup() .addComponent(new JButton("切换到下一个卡片")) .addGap(10) .addComponent(new JPanel()) ); layout.setVerticalGroup(layout.createParallelGroup() .addComponent(new JButton("切换到下一个卡片")) .addComponent(new JPanel()) ); // 添加卡片面板 layout.setHorizontalGroup(layout.createParallelGroup() .addComponent(new JPanel(new CardLayout())) ); layout.setVerticalGroup(layout.createSequentialGroup() .addComponent(new JPanel(new CardLayout())) ); JFrame frame = new JFrame(); frame.add(panel); ``` 希望这些例子能够帮助你自定义按钮的位置。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值