我有一个框架,上面覆盖着一个图像,我希望每次有人点击图像中的不同对象时,它都会充当一个按钮并执行某些操作。
问题是,那些对象不是简单的形状,所以我在考虑按照这些对象的形状绘制自己的隐形按钮。
这可能吗?或者什么是更好的方法来完成这样的事情?
-谢谢
最佳答案
概念:带有圆形和多边形调度区域的隐形按钮
首先,您需要一个定义不可见按钮的类,扩展 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/