Concept: niewidzialne przyciski z okrągłych i wielokątnych obszarów wysyłkowych
Po pierwsze, będziemy chcieli klasa definiując niewidzialny przycisk, rozszerzając javax.swing.AbstractButton
tak, to jeszcze w pełni funkcjonalny przycisk, który można dodać słuchaczy do.
public abstract class InvisibleButton extends AbstractButton {
public abstract boolean contains(Point point);
@Override
public boolean isVisible() {
return false;
}
}
Następnie, oczywiście, będziesz potrzebować implementacji tej klasy.Oto dwa przykłady: jeden używający wielokąta dla złożonych kształtów, jeden używający koła.
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;
}
}
Wreszcie, trzeba zaimplementować kontener, który obsługuje wszystkie z tych przycisków, ale należy użyć panelu zamiast ramce. Zamiast podpinania każdego pojedynczego detektora, można po prostu przesłonić procesory zdarzeń ramy i przekazać je do wymaganych przycisków.
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);
}
}
prawdopodobnie będziesz chciał zmienić nazwę panelu do czegoś mniej nieporęczne, a może zaimplementować własną zaawansowaną kod obrazka, ale to podstawowa idea za nim.
Będzie śledzić to. Próbowałem czegoś bardzo podobnego na Androidzie, a skończyło się na tym, że zadowalałem się niewidzialnymi przyciskami nad dziwnymi kształtami :) – sealz
to będzie działać jak przycisk i coś zrobić. to na przykład coś takiego jak wirtualny pilot do telewizora – mKorbel
Zobacz także przedstawione podejście [tutaj] (http://stackoverflow.com/q/10861852/230513). – trashgod