JButton Konflikt mit Graphics

NicoHatProbleme2

Bekanntes Mitglied
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?
 

KonradN

Super-Moderator
Mitarbeiter
Kannst Du bitte genau beschreiben, was Du machst und was das genaue Problem ist. Deine kurze Aussage ist auch etwas widersprüchlich: Visible ist sichtbar, also ein Button ist entweder sichtbar oder unsichtbar. Also visible und unsichtbar kann er nicht sein ...

Und wenn Positionen geändert werden: Evtl. einmal mit dem Volatile beschäftigen - dazu hatte ich im anderen Thread ja auch extra einen Link zu gebracht. Da ist das Verständnis wichtig.

Je nachdem, was Du da machst, kann es viele Möglichkeiten geben: Evtl. ein Container, der nur ein Element beachtet oder wenn Du selbst etwas malst und Controls verwendest, dann hast Du evtl. bei den paint* Methoden etwas nicht richtig gemacht (also z.B. die Methode, die Du überschrieben hast, nicht aufgerufen oder so). ... Aber da bringt eine Spekulation relativ wenig weshalb ich das an dieser Stelle einfach einstelle.
 

Neumi5694

Top Contributor
So viele Infos zum verwendeten Layout ...
Was du machen kannst, ist einen zweiten Layer zu verwenden. Füge dem Container zwei Panels hinzu:
Das erste mit Opaque = false und absoluteLayout, das zweite ist das, auf dem deine Felder gezeichnet werden.

Ansonsten gibt's da noch das GlassPane, das eigentlich dafür da wäre, aber dazu müsste man wissen, was du eigentlich machst.
 

NicoHatProbleme2

Bekanntes Mitglied
Java:
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
        }
    }
}

Hier erstmal der code... habe auch versucht, dem JButton einfach das hier zu geben:
Java:
button.setOpaque(false);
button.setContentAreaFilled(false);
button.setBorderPainted(false);
Hat aber auch nichts gebracht
 

NicoHatProbleme2

Bekanntes Mitglied
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
 

Neumi5694

Top Contributor
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
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.
 

NicoHatProbleme2

Bekanntes Mitglied
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.
Mouselistener? Wie das?
 

Neumi5694

Top Contributor
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]
 
Zuletzt bearbeitet:

NicoHatProbleme2

Bekanntes Mitglied
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]
benutzt du extend?
 

NicoHatProbleme2

Bekanntes Mitglied
hat jetzt geklappt...

Java:
        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();
                }
            }
        }
        );
 

Neumi5694

Top Contributor
Als erster Schritt nicht schlecht, ich würde den Listener aber nicht zusammen mit dem object erstellen, da kriegst du noch Probleme. Der Listener sollte einmalig definiert werden, außerhalb des Threads. Der Thread befüllt dann nur noch die Daten des Listeners.
Ich mein ... so lange du nur ein object hast, das sich nicht ändert, klappt es auch so, aber bei allem, was darüber hinausgeht, wirst du Probleme kriegen. Weiterer Denkanstoß: Was passiert, wenn du ein object löschen willst?
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
F JButton und ActionListener Allgemeine Java-Themen 3
H Schiffe versenken JButton Schiffe mit GUI verbinden Hilfe! Allgemeine Java-Themen 2
Aruetiise Interface Position durch JButton ermitteln Allgemeine Java-Themen 5
Aruetiise LayoutManager JButton in den Hintergrund Allgemeine Java-Themen 7
O Mein JButton Array funktioniert nicht Allgemeine Java-Themen 3
D AWT JButton und KeyAdapter Allgemeine Java-Themen 1
M JButton setEnabled(false) seltsames Ereignis Allgemeine Java-Themen 1
R via JButton in JTextArea printen Allgemeine Java-Themen 2
S Mit einem jButton eine andere Klasse öffnen Allgemeine Java-Themen 2
H JButton Ursprungsfarbe Allgemeine Java-Themen 2
Developer_X JButton Aktion Allgemeine Java-Themen 5
Developer_X JButton soll gar nichts machen Allgemeine Java-Themen 8
G Serialisieren eines JButton mit Icon Allgemeine Java-Themen 8
G JButton Allgemeine Java-Themen 7
S eigene Klasse die JButton extended - als Liste! Allgemeine Java-Themen 6
P JButton klonen Allgemeine Java-Themen 8
P JButton dnd Allgemeine Java-Themen 29
G Plug-in: Wie JButton einfügen? Allgemeine Java-Themen 12
M Swing JButton Farbe zurücksetzen Allgemeine Java-Themen 6
O JButton oder Checkboxes als Array ? Allgemeine Java-Themen 3
T Allgemeinklasse zu JPanel, JButton. Allgemeine Java-Themen 26
P eigener Thread für einen JButton Allgemeine Java-Themen 32
E JButton bleibt in der JTable Allgemeine Java-Themen 2
E JButton in einer Zelle von JTable Allgemeine Java-Themen 16
S JButton als Hyperlink ? Allgemeine Java-Themen 32
MQue JButton erkennen Allgemeine Java-Themen 2
MQue JButton an verschiedenen Variablen Allgemeine Java-Themen 2
MQue JButton zu JPanel hinzufügen Allgemeine Java-Themen 7
B Vermeiden das JButton schneller hintereinander drücken Allgemeine Java-Themen 3
G Hilfe - JButton in JTable (Spalte) einfügen! Allgemeine Java-Themen 6
M JButton verursacht einen HeapSpace Error? Allgemeine Java-Themen 6
N JList mit Mausklick auf einen JButton scrollen Allgemeine Java-Themen 28
thE_29 JButton einfärben Allgemeine Java-Themen 10
W Konflikt byte->int, in.read->arraycopy Allgemeine Java-Themen 7
M Hässliche Schrift auf Graphics durch deriveFont Allgemeine Java-Themen 0
M String automatisch in nächste Zeile umbrechen (Graphics) Allgemeine Java-Themen 6
T Methoden Swing/Graphics/draw Allgemeine Java-Themen 6
N Graphics in normaler Klasse Allgemeine Java-Themen 13
B itext Graphics Allgemeine Java-Themen 4
N Graphics in Java Allgemeine Java-Themen 15
P Class Casting: Graphics/Graphics2D Allgemeine Java-Themen 7
G Graphics 2D Allgemeine Java-Themen 6
E FontMetrics ohne Graphics-Objekt Allgemeine Java-Themen 5
S Graphics! drawstring Allgemeine Java-Themen 4
C Graphics verschwinden Allgemeine Java-Themen 8
T Graphics 2D + Pfeil Allgemeine Java-Themen 2

Ähnliche Java Themen

Neue Themen


Oben