gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:59:11 28 4
gpt4 key购买 nike

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

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

-谢谢

最佳答案

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

首先,您需要一个定义不可见按钮的类,扩展 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/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com