Ich habe einen JButton erstellt, doch er zerstört irgendwie meine restlichen Felder, die mit Graphics erstellt worden sind... auch, wenn er zwar visible, aber unsichtbar ist.
Wie kann ich das ändern?
Wie kann ich das ändern?
package Tools.Pixel2D.POFLibary;
import java.awt.Graphics;
import java.awt.event.*;
import javax.swing.*;
import Tools.Pixel2D.*;
import Tools.Menu.*;
public class clickable extends PixelObjectFunction implements ActionListener {
JButton button;
PixelImportable imp;
PixelObject obj;
public clickable(PixelObject object, String name, PixelImportable imp) {
super(object, name, true);
this.imp = imp;
obj = object;
button = new InvisButton();
object.frame.add(button);
button.setBounds(object.x*object.frame.getMinimumPixelSize(), object.y*object.frame.getMinimumPixelSize(), object.pixels[0].length*object.frame.getMinimumPixelSize(), object.pixels.length*object.frame.getMinimumPixelSize());
button.addActionListener(this);
}
public void run() {
button.setBounds(object.x*object.frame.getMinimumPixelSize(), object.y*object.frame.getMinimumPixelSize(), object.pixels[0].length*object.frame.getMinimumPixelSize(), object.pixels.length*object.frame.getMinimumPixelSize());
//System.out.println(button.getBounds().toString());
}
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("Ja");
imp.action(this);
}
class InvisButton extends JButton {
@Override
public void paint(Graphics g){
// Do nothing here
}
}
}
button.setOpaque(false);
button.setContentAreaFilled(false);
button.setBorderPainted(false);
Die Reihenfolge der Panels ist wichtig. Das obere Panel muss zuerst hinzugefügt werden.Ok... jetzt habe ich einen 2. Panel hinzugefügt... gute Sache: er macht nichts kaputt... schlechte Sache: er ist nichtmehr clickable und ist nicht mehr sichtbar, auch wenn ich ihm nichts gebe, was ihn unsichtbar machen könnte
Mouselistener? Wie das?Die Reihenfolge der Panels ist wichtig. Das obere Panel muss zuerst hinzugefügt werden.
Falls es damit nicht klappt, lies dich mal in LayeredPanes ein.
ps: Wenn dein Button nicht sichtbar sein soll, ist es sehr sehr sinnlos, einen zu verwenden.
Besser wäre ein Mauslistener auf dem Panel, der anhand der Koordinaten auswertet, was passieren soll.
benutzt du extend?Das wäre ein Ansatz. Es existiert eine Liste mit anklickbaren Flächen. Für jede der Flächen ist eine Action hinterlegt, die ausgeführt wird, falls innerhalb des Shapes (z.B. ein Rechteck) geklickt wurde.
Du kannst natürlich auch andere Klassen verwenden, z.B. einen Container, der mehr Eigenschaften hat als nur ein Panel. Alternativ kannst du auch einfach dem record mehr Eigenschaften hinzufügen, der Phantasie sind wenig Grenzen gesetzt.
[CODE lang="java" title="Ansatz"] //Das Panel, in dem die Felder angezeigt werden
Component panel = ...;
//Hier werden die klickbaren Flächen hinterlegt und was gemacht werden soll, wenn eine angeklickt wurde
List<ShapeAndAction> areasAndActions = ...;
void init() {
panel.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
//Hier abfragen, ob shift oder alt gedrückt wurde oder um welche der Maustasten es sich handelt. Kann beliebig erweitert werden
//Falls die Abfrage komplex ist, in eine Methode auslagern.
//e.getModifiersEx() liefert alle Zustände, die mit dem Klick verbunden sind. Kann mit einer Maske verglichen werden, das geht schneller und ist übersichtlicher, als alles einzeln abzufragen.
if (!e.isMetaDown() && !e.isShiftDown()) {
var o = determineAction(e.getX(), e.getY());
if (o.isPresent()) {
o.get().accept(panel); //Annahme. Keine der Actions ist null
}
}
}
//Alernativ in in MouseReleased, Click ist etwas empfindlich, wenn man während des Klickens die Maus leicht bewegt.
@Override
public void mouseReleased(MouseEvent e) {
//...
}
});
}
/**
* Liefert die Action, die ausgeführt werden soll, falls an dieser Stelle geklickt wurde
* @return Optional.empty(), falls keine Fläche gefunden wurde.
*/
private Optional<Action> determineAction(int mousePosX, int mousePosY) {
for (var entry : areasAndActions) {
if (entry.shape().contains(mousePosX, mousePosY)) {
return Optional.of(entry.action());
}
}
return Optional.empty();
}
/**
* Klasse zum Speichern von Shape und Action Tupeln.
*/
record ShapeAndAction(Shape shape, Action action) {}
[/CODE]
Falls du damit das Schlüsselwort "extends" meinst ... sicherbenutzt du extend?
r = new Rectangle();
r.setBounds(object.x*object.frame.getMinimumPixelSize(), object.y*object.frame.getMinimumPixelSize(), object.pixels[0].length*object.frame.getMinimumPixelSize(), object.pixels.length*object.frame.getMinimumPixelSize());
obj.frame.panel.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
if(r.contains(e.getPoint())) {
if(object.visible | useIfInvis)
action();
}
}
}
);