在 Java 中创建自定义 JButton

2022-08-31 10:15:03

有没有办法创建一个你自己的按钮图形,而不仅仅是按钮内的图像?JButton

如果没有,有没有另一种方法可以在java中创建自定义?JButton


答案 1

当我第一次学习Java时,我们必须制作Yahtzee,我认为创建自定义的Swing组件和容器会很酷,而不仅仅是在一个组件和容器上绘制所有内容。当然,扩展组件的好处是能够添加对键盘快捷键和其他辅助功能的支持,而仅通过让一种方法打印漂亮的图片是无法做到的。然而,它可能不是最好的方法,但它可能是一个很好的起点。JPanelSwingpaint()

编辑8/6 - 如果从图像中看不出来,每个骰子都是一个按钮,你可以点击。这会将其移动到下面。查看源代码,您可以看到每个 Die 按钮都是根据其值动态绘制的。DiceContainer

alt text
alt text
alt text

以下是基本步骤:

  1. 创建扩展的类JComponent
  2. 在构造函数中调用父构造函数super()
  3. 确保类实现MouseListener
  4. 将它放在构造函数中:

    enableInputMethods(true);   
    addMouseListener(this);
    
  5. 重写以下方法:

    public Dimension getPreferredSize()  
    public Dimension getMinimumSize()  
    public Dimension getMaximumSize()
    
  6. 重写此方法:

    public void paintComponent(Graphics g)
    

绘制按钮时必须使用的空间量由 定义,假设并返回相同的值。我没有对此进行太多实验,但是,根据您用于GUI的布局,您的按钮可能看起来完全不同。getPreferredSize()getMinimumSize()getMaximumSize()

最后是源代码。万一我错过了什么。


答案 2

是的,这是可能的。使用 Swing 的主要优点之一是可以轻松创建和操作抽象控件。

下面是一种快速而肮脏的方法来扩展现有的 JButton 类,以在文本的右侧绘制一个圆圈。

package test;

import java.awt.Color;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Graphics;

import javax.swing.JButton;
import javax.swing.JFrame;

public class MyButton extends JButton {

    private static final long serialVersionUID = 1L;

    private Color circleColor = Color.BLACK;

    public MyButton(String label) {
        super(label);
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);

        Dimension originalSize = super.getPreferredSize();
        int gap = (int) (originalSize.height * 0.2);
        int x = originalSize.width + gap;
        int y = gap;
        int diameter = originalSize.height - (gap * 2);

        g.setColor(circleColor);
        g.fillOval(x, y, diameter, diameter);
    }

    @Override
    public Dimension getPreferredSize() {
        Dimension size = super.getPreferredSize();
        size.width += size.height;
        return size;
    }

    /*Test the button*/
    public static void main(String[] args) {
        MyButton button = new MyButton("Hello, World!");

        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(400, 400);

        Container contentPane = frame.getContentPane();
        contentPane.setLayout(new FlowLayout());
        contentPane.add(button);

        frame.setVisible(true);
    }

}

请注意,通过重写 paintComponent,可以更改按钮的内容,但边框由 paintBorder 方法绘制。getP referSize 方法还需要进行管理,以便动态支持对内容的更改。测量字体指标和图像尺寸时需要小心。

对于创建可以依赖的控件,上面的代码不是正确的方法。尺寸和颜色在 Swing 中是动态的,取决于所使用的外观和感觉。甚至默认的金属外观在JRE版本中也发生了变化。最好实现 AbstractButton 并遵守 Swing API 制定的准则。一个好的起点是看看javax.swing.LookAndFeeljavax.swing.UIManager类。

http://docs.oracle.com/javase/8/docs/api/javax/swing/LookAndFeel.html

http://docs.oracle.com/javase/8/docs/api/javax/swing/UIManager.html

了解 LookAndFeel 的解剖结构对于编写控件非常有用:创建自定义外观


推荐