Concetto: pulsanti invisibili con aree di spedizione circolari e poligonali
In primo luogo, si vorrà una classe che definisce un pulsante invisibile, estendendo javax.swing.AbstractButton
in modo che sia ancora un pulsante completamente funzionale che è possibile aggiungere ascoltatori.
public abstract class InvisibleButton extends AbstractButton {
public abstract boolean contains(Point point);
@Override
public boolean isVisible() {
return false;
}
}
Quindi, ovviamente, vorrai implementazioni di quella classe.Ecco due esempi: uno che usa un poligono per forme complesse, uno che usa un cerchio.
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;
}
}
Infine, è necessario implementare un contenitore che gestisce tutti questi pulsanti, ma è necessario utilizzare un pannello al posto di una cornice. Piuttosto che agganciare ogni singolo listener, puoi semplicemente sovrascrivere i processori degli eventi del frame e passarli ai pulsanti necessari.
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);
}
}
probabilmente si vorrà per rinominare il pannello a qualcosa di meno ingombrante, e magari implementare il proprio codice avanzata delle immagini, ma questa è l'idea di base dietro di esso.
Seguirà questo. Ho provato qualcosa di molto simile su Android un po 'indietro e ho finito per accontentarsi di soli pulsanti invisibili sopra le forme dispari :) – sealz
funzionerà come un pulsante e fare qualcosa. è ad esempio qualcosa come telecomando virtuale per la TV – mKorbel
Vedi anche l'approccio mostrato [qui] (http://stackoverflow.com/q/10861852/230513). – trashgod