java - 如何创建复杂的按钮形状?

标签 java image swing button paintcomponent

我有一个框架,上面覆盖着一个图像,我希望每次有人点击图像中的不同对象时,它都会充当一个按钮并执行某些操作。
问题是,那些对象不是简单的形状,所以我在考虑按照这些对象的形状绘制自己的隐形按钮。

这可能吗?或者什么是更好的方法来完成这样的事情?

-谢谢

最佳答案

概念:带有圆形和多边形调度区域的隐形按钮

首先,您需要一个定义不可见按钮的类,扩展 javax.swing.AbstractButton,这样它仍然是一个功能齐全的按钮,您可以向其添加监听器。

public abstract class InvisibleButton extends AbstractButton {

    public abstract boolean contains(Point point);

    @Override
    public boolean isVisible() {
        return false;
    }
}

然后,当然,您将需要该类的实现。这里有两个例子:一个使用多边形来表示复杂的形状,一个使用圆形。

public class PolygonalButton extends InvisibleButton {

    private Polygon area = null;

    public PolygonalButton(Polygon area) {
        this.area = area;
    }

    @Override
    public boolean contains(Point point) {
        return area.contains(point);
    }
}

public class CircularButton extends InvisibleButton {

    private int x;
    private int y;
    private double radius;

    public CircularButton(int x, int y, double radius) {
        this.x = x;
        this.y = y;
        this.radius = radius;
    }

    @Override
    public boolean contains(Point point) {
        double dx = x - point.x;
        double dy = y - point.y;
        return Math.sqrt(dx * dx + dy * dy) <= radius;
    }
}

最后,您需要实现一个容器来处理所有这些按钮,但您应该使用面板而不是框架。您可以简单地覆盖框架的事件处理器并将它们传递给必要的按钮,而不是 Hook 每个单独的监听器。

public class InvisibleButtonImagePanel extends JPanel {

    private BufferedImage image = null;
    private List<InvisibleButton> buttons = new ArrayList<>();

    public InvisibleButtonImagePanel(BufferedImage image) {
        this.image = image;
    }

    public void add(InvisibleButton button) {
        buttons.add(button);
    }

    public void remove(InvisibleButton button) {
        buttons.remove(button);
    }

    @Override
    public Dimension getPreferredSize() {
        return new Dimension(image.getWidth(), image.getHeight());
    }

    @Override
    public void processKeyEvent(KeyEvent event) {
        for (InvisibleButton button : buttons) {
            if (button.isFocusOwner()) {
                button.dispatchEvent(event);
            }
        }
        super.processKeyEvent(event);
    }

    @Override
    public void processMouseEvent(MouseEvent event) {
        for (InvisibleButton button : buttons) {
            if (button.contains(event.getPoint())) {
                button.dispatchEvent(event);
            }
        }
        super.processMouseEvent(event);
    }

    @Override
    protected void paintComponent(Graphics g) {
        g.drawImage(image, 0, 0, null);
        super.paintComponent(g);
    }
}

您可能希望将面板重命名为不那么笨重的名称,并可能实现您自己的高级图像代码,但这是其背后的基本思想。

关于java - 如何创建复杂的按钮形状?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18131795/

相关文章:

java - 在 JFrame 上正确绘制矩形

java - 为什么我的屏幕上什么也没有绘制?

java - JScrollPane 组件的列式布局

java - 更改旋转窗口的底层背景颜色

html - 我的代码有什么问题? (试图创建一个 slider )

Java接口(interface)实现问题

java - 从字节数组中读取图片

php - 创建图像的缩放缩略图并以有组织的方式回显结果 3 列,无限行,每行每列一个图 block

java - Spring - 在单元测试中跳过初始化方法

java - 如何根据 Elasticsearch 中文本字段的长度修改相关性分数?