Ausschluss bei Klick auf GUI Element

Schniegelmann

Neues Mitglied
Hallo zusammen,

ich bin neu hier und habe zur folgenden Frage leider noch nichts im Forum gesehen, daher einfach mal meine Frage:
Ich habe folgende Main-Klasse
Java:
public class Testframe extends JComponent implements Observer{

    private JFrame f;
    Element element1;
    Element element2;
    Element element3;
    GUICanvas canvas;
    ASTEvent event1;
    ASTEvent event2;
    ASTEvent event3;
    JButton send;
    Viewer viewer;
    
      public Testframe(){
        f = new JFrame("GUI");
        event1 = new ASTEvent("EventNAME1", "EventDATA1");
        event2 = new ASTEvent("EventNAME2", "EventDATA2");
        event3 = new ASTEvent("EventNAME3", "EventDATA3");
        element1 = new Element(event1);
        element2 = new Element(event2);
        element3 = new Element(event3);
        viewer = new Viewer();
        f.setSize(800,200);

        canvas = new GUICanvas();
        canvas.append(element1);
        canvas.append(element2);
        canvas.append(element3);
        
        Container content = f.getContentPane();
        content.setBackground(Color.gray);
        content.setLayout(new BorderLayout());
        content.add(viewer,BorderLayout.LINE_START);
        content.add(canvas,BorderLayout.CENTER);

        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setVisible(true);
    }

      public static void main(String[] args){
          Testframe tf = new Testframe();
      }
}

Darin wird eine GUI aufgebaut, die die Elemente(ASTEvent) enthält. Ein Element wird gezeichnet mit der Funktion:
Java:
 @Override
    protected void paintComponent(Graphics graphics) {
        Graphics2D graphics2D = (Graphics2D) graphics;
        graphics2D.setRenderingHint(
                RenderingHints.KEY_ANTIALIASING,
                RenderingHints.VALUE_ANTIALIAS_ON);
        //
        Border border = null;

        Color color = null;
        if (mFocused) {
            color = mColor.brighter();
            //
        } else {
            color = mColor;
        }
        // Draw a gradient color
        GradientPaint paint = new GradientPaint(0, 0, color.darker(), 0, getHeight() / 2, color.brighter(), true);
        graphics2D.setPaint(paint);
        graphics2D.fillRect(0, 0, getWidth(), getHeight());

        graphics2D.setColor(Color.WHITE);
        graphics2D.setFont(new Font(Font.MONOSPACED, Font.ITALIC, 11));
        graphics2D.drawString(mASTEvent.getName(),
                getWidth() / 2 - getFontMetrics(new Font(Font.MONOSPACED, Font.ITALIC, 11)).stringWidth(mASTEvent.getName()) / 2,
                getHeight() / 2 + getFontMetrics(new Font(Font.MONOSPACED, Font.ITALIC, 11)).getHeight() / 1);
       
        graphics2D.drawString(mASTEvent.getData(),
                getWidth() / 2 - getFontMetrics(new Font(Font.MONOSPACED, Font.ITALIC, 11)).stringWidth(mASTEvent.getData()) / 2,
                getHeight() / 2 + getFontMetrics(new Font(Font.MONOSPACED, Font.ITALIC, 11)).getHeight() / 60);

        super.paintComponent(graphics);
    }

Auf diese Elemente kann nun geklicket werden per:
Java:
  @Override
    public void mouseClicked(MouseEvent event) {
        if (event.getButton() == MouseEvent.BUTTON1
                && event.getClickCount() == 1) {
            mSelected = !mSelected;
            if(mSelected){
                 setBorder(BorderFactory.createLineBorder(Color.RED));
                 revalidate();
                 repaint();
            }
            else {
                setBorder(BorderFactory.createLineBorder(new Color(0,0,100)));
                revalidate();
                repaint();
            }
        } else if(event.getButton() == MouseEvent.BUTTON3
                && event.getClickCount() == 1) {
            mContextMenu.show(this, event.getX(), event.getY());
        }
        revalidate();
        repaint();
    }
Hierbei ist mSelected ein bool Wert der zurückgibt, ob das Element ausgewählt ist. Das ausgewählte Element wurd nun rot umrandet. Allderdings ist nun das Problem, dass alle Elemente in der GUI an und abgewählt werden können (sie werden alle einzeln rot, wenn ich sie anklick). Ich möchte allerdings, dass wenn ein Element ausgewählt ist und dann ein anderes angeklickt wird, das alte abgewählt und das neu geklickte angewählt wird. (gekennzeichnet eben durch den roten Rahmen)

Ich versteh leider nicht, wie ich diesen Ausschluss bei der mouseClicked-Funktion erstellen kann.

Ich hoffe, ich konnte mein Problem klar darstellen. Wenn noch Fragen zum Verständnis sind, bitte posten.

Danke schonmal für Feedback
Schniegelmann
 

JanHH

Top Contributor
Naja im Prinzip willst Du ja die Radiobutton-Funktionalität nachbauen. Hab aber keine Lust mir all Deinen Code anzugucken ;). Alle Elemente müssen Teil einer (nachgebauten) RadioButtonGroup sein und wenn ein Button geklickt wird, sagt er seiner Group "ich wurde geklickt", die den Zustand aller anderen Elemente auf ungeklickt/nichtRotUmrandet zurücksetzt. Und dann den ganzen Kram neu zeichnen.
 

Schniegelmann

Neues Mitglied
Hi JanHH,

erstmal danke für deine Antwort.
ja genau diese Funktionalität, die du beschreibst, möcht ich umsetzen. Hättest du (oder auch jemand anderes:)) einen Vorschlag, evtl auch CodeSnippets, wie ich das machen kann.

Kann ich die Funktionalität einer ButtonGroup (ähnlich Mutex) hierauf übertragen ?

Oder brauch ich da einen WorkAround, wenn ja, was gäbs da für Möglichkeiten ?
 

JanHH

Top Contributor
Hm das solltest Du doch auch alleine hinkriegen. Was ist denn dabei das Problem? Du brauchst eine Klasse für die Gruppe und jedes Element muss die Gruppe benachrichtigen, wenn es angeklkickt wurde. Die Gruppe kümmert sich dann darum, alle Element ausser dem angeklickten wieder auf den Normalzustand zurückzusetzen.
 

KrokoDiehl

Top Contributor
Mal eine andere Überlegung - ich hoffe ich verstehe das alles richtig - aber wäre es nicht möglich direkt JRadioButtons (mit ButtonGroup) zu nehmen und "einfach" deren paintComponent() auf deine Art zu überschreiben?
 

Todo

Aktives Mitglied
Naja glaube ich würde mir ne Klasse schreiben die von RadioButton abgeleitet ist, PaintComponent überschreiben, die kannst du dann zu einer ButtonGroup hinzufügen. Dann sollte es eigentlich klappen.

[Edit]
Ein kleines Beispiel, nix dolles sollte aber die vielleicht klar machen wie ich es meine:
Java:
public class Radio extends JRadioButton {
    private boolean mFocused;
    
    public Radio() {
        this.setBounds(0, 0, 20, 20);
        this.setSize(100, 100);
    }
    
    
    @Override
    protected void paintComponent(Graphics graphics) {
        Graphics2D graphics2D = (Graphics2D) graphics;
        graphics2D.setRenderingHint(
                RenderingHints.KEY_ANTIALIASING,
                RenderingHints.VALUE_ANTIALIAS_ON);
        //
        Border border = null;
 
        Color color = null;
        // Draw a gradient color
        GradientPaint paint = new GradientPaint(0, 0, color.black, 0, getHeight() / 2, color.red, true);
        graphics2D.setPaint(paint);
        graphics2D.fillRect(0, 0, getWidth(), getHeight());
 
        graphics2D.setColor(Color.BLACK);
        graphics2D.setFont(new Font(Font.MONOSPACED, Font.ITALIC, 11));
        super.paintComponent(graphics);
    }
}

Die kannst du dann so zu einer Group hinzufügen, die für dich dann regelt das nur einer angeklickt werden kann:
Java:
        ButtonGroup gruppe = new ButtonGroup();
        gruppe.add(radio1);
        gruppe.add(radio3);
 
Zuletzt bearbeitet:

renwal

Aktives Mitglied
Lege dir doch einfach eine Variable an, die bei den mouseClicked-Events über
Java:
event.getSource()
mit dem Objekt des auslösenden Buttons belegt wird und versetze dann einfach über dieses Objekt den auslösenden Button wieder in den nicht-ausgewählten Modus. Das geht aber nur, wenn du den MouseListener nicht in der Klasse des Buttons definierst, sondern in deiner GUI-Klasse beim Hinzufügen der Komponenten "anhängst". Sonst wird der Zugriff auf die Variable (die ja in der GUI-Klasse liegen muss, damit sie global verwendet werden kann) schwierig.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
H Swing Buttons erst nach Klick sichtbar AWT, Swing, JavaFX & SWT 13
S JavaFx Zufallsfarbe beim Button-Klick AWT, Swing, JavaFX & SWT 22
H Swing Auf Klick auf Menü-Eintrag reagieren AWT, Swing, JavaFX & SWT 0
Zrebna Problem bei Eventhandling (Value soll nach jedem erneutem Klick gelöscht werden) AWT, Swing, JavaFX & SWT 4
L Komponenten eines Panels werden erst nach Klick darauf angezeigt AWT, Swing, JavaFX & SWT 13
A Inhalt wechseln bei Klick auf Label AWT, Swing, JavaFX & SWT 8
S Ausgabe aktualisiert sich nur nach 2. Klick AWT, Swing, JavaFX & SWT 17
T Swing Änderung des ActionListener Events nach Klick auf JButton AWT, Swing, JavaFX & SWT 2
Neumi5694 Swing JList - Klick abfangen AWT, Swing, JavaFX & SWT 3
it_is_all JPanel verschwindet nach Button-Klick AWT, Swing, JavaFX & SWT 2
A Nach klick auf Button neuen Inhalt im gleichen Fenster AWT, Swing, JavaFX & SWT 3
A JavaFX Nur ein Klick Button AWT, Swing, JavaFX & SWT 3
J Fensterinhalt bei Klick auf Menüitem wechseln AWT, Swing, JavaFX & SWT 1
stylegangsta JLabel durch Klick auf JButton einblenden AWT, Swing, JavaFX & SWT 16
D Mit Klick auf Button ein neues Fenster erzeugen AWT, Swing, JavaFX & SWT 11
A Zufallsgenerator starten bei Klick auf Radiobutton AWT, Swing, JavaFX & SWT 3
R AWT AWT Textfeld durch Klick auf Button erstellen? AWT, Swing, JavaFX & SWT 3
1 JButton nach Klick ausblenden AWT, Swing, JavaFX & SWT 6
W Bei Button-klick neuen button in array hinzufügen AWT, Swing, JavaFX & SWT 7
P Swing Klick in Tabelle nicht möglich AWT, Swing, JavaFX & SWT 0
P Swing JTable keine Markierung nach Button klick AWT, Swing, JavaFX & SWT 0
C Bei Btn Klick zwei JPanels switchen AWT, Swing, JavaFX & SWT 14
A Swing bei Auswahl und klick eines JComboBox buttons die Klasse eines anderen Projekts aufrufen AWT, Swing, JavaFX & SWT 3
N Swing JTable mit Sorter: Keine Sortierung bei Klick in Header AWT, Swing, JavaFX & SWT 3
F Swing JTextfield Beispieltext soll nach Klick verschwinden AWT, Swing, JavaFX & SWT 3
T JXTreeTable mit Klick auf TreeNode erweitern AWT, Swing, JavaFX & SWT 12
J Zwei GUIs - Nach button-Klick soll ein Wert an die andere GUI übergeben werden AWT, Swing, JavaFX & SWT 15
J Button soll nach Klick Text ändern und Programm in 3 Sekunden beenden AWT, Swing, JavaFX & SWT 6
H Swing Button Klick soll "Untermenü-Buttons" erzeugen AWT, Swing, JavaFX & SWT 2
T Bei Klick Code ausführen AWT, Swing, JavaFX & SWT 17
S Gif beim Klick nicht unterbrechen AWT, Swing, JavaFX & SWT 3
M JPopupMenu per Klick schließen und gleichzeitig ActionEvent auf JButton? AWT, Swing, JavaFX & SWT 15
Z Bei Klick auf JButton soll ein anderer JButton erscheinen AWT, Swing, JavaFX & SWT 4
D JTree node reagiert bei Klick nicht immer AWT, Swing, JavaFX & SWT 2
D Bei Klick zeichnen AWT, Swing, JavaFX & SWT 13
L Swing Flackern in Frame bei erstem Klick AWT, Swing, JavaFX & SWT 19
Madlip SWT Tree mit einen Klick alles ausklappen AWT, Swing, JavaFX & SWT 3
D JTree nach Klick auf einen Hyperlink aktualisieren AWT, Swing, JavaFX & SWT 3
H Bilder auf Buttons per Klick tauschen ( Puzzle ) AWT, Swing, JavaFX & SWT 8
T Puzzle Klick tausch AWT, Swing, JavaFX & SWT 3
A Swing Herausfinden ob bei JTree Klick auf "+"/"-" anahnd x,y AWT, Swing, JavaFX & SWT 2
C jComboBox in jTable ohne Klick öffnen AWT, Swing, JavaFX & SWT 4
S JMenuBar nach 1. Klick deselectieren AWT, Swing, JavaFX & SWT 6
T Demo klick gui erstellen und fenster verlinken AWT, Swing, JavaFX & SWT 5
S JDesktopPane bei Button-Klick anzeigen geht nicht AWT, Swing, JavaFX & SWT 5
multiholle Button bei Klick entfernen AWT, Swing, JavaFX & SWT 3
W Klick in JTextfield AWT, Swing, JavaFX & SWT 6
M animiertes Bild nach Klick auf Button AWT, Swing, JavaFX & SWT 3
H Swing Tabelle nach Klick auf Button mit Daten füllen? AWT, Swing, JavaFX & SWT 2
M JList von Beginn an sortiert nach Spalte ohne Klick? AWT, Swing, JavaFX & SWT 2
L Klick auf JTable -> EditorPane manipulieren, Fragen zu TableModel AWT, Swing, JavaFX & SWT 9
T Ordner öffnen nach Klick auf einen Button AWT, Swing, JavaFX & SWT 3
D 1 klick auf button1 und 1 klick auf button2 und passiert was AWT, Swing, JavaFX & SWT 7
X SWT Oberflächenwechsel bei Button-Klick AWT, Swing, JavaFX & SWT 2
S Zeichnen nach button-klick. AWT, Swing, JavaFX & SWT 4
E Zelle in JTable nach klick markieren AWT, Swing, JavaFX & SWT 2
N Herkunft des Fokus erkennbar (via Klick oder Tab-Steuerung)? AWT, Swing, JavaFX & SWT 4
C Aktion durchführen bei Klick auf ein Element im JTree (Untersch. Klick und Doppklick) AWT, Swing, JavaFX & SWT 5
S Swing Bei Klick auf OK Daten übergeben AWT, Swing, JavaFX & SWT 6
F JButton reagiert erst beim 2 klick AWT, Swing, JavaFX & SWT 8
A Swing JTextField - vorausgefüllt bei klick leer AWT, Swing, JavaFX & SWT 54
B Inhalt von JTextField durch Klick auf JButton in JLabel anzeigen lassen AWT, Swing, JavaFX & SWT 8
Daniel_L JTable - Links-rechts-Klick ist gleich Doppelklick? AWT, Swing, JavaFX & SWT 2
S JComboBox in JTable wird erst nach klick angezeigt AWT, Swing, JavaFX & SWT 2
L JFrame-Verhalten bei Klick auf Schließen-Kreuz ändern AWT, Swing, JavaFX & SWT 3
GilbertGrape JTable mit Combobox-Editierung schon nach einem Klick AWT, Swing, JavaFX & SWT 7
M Ausgabe nach Klick auf JButton funktioniert nicht. AWT, Swing, JavaFX & SWT 6
R Text löchen bei Klick auf editierbare Combobox AWT, Swing, JavaFX & SWT 4
S Jtree-Icon per Klick auf JBUTTON ändern AWT, Swing, JavaFX & SWT 3
G JList, Deselect per Klick AWT, Swing, JavaFX & SWT 5
A Bei Klick auf disabled JMenuItem JMenu nicht schließen AWT, Swing, JavaFX & SWT 2
A JTree wird erst nach Klick aktualisiert AWT, Swing, JavaFX & SWT 2
G Swing ->mainpanel wechseln bei Klick auf MenuItem (NetB.6 AWT, Swing, JavaFX & SWT 3
X JTable "geht" erst beim 2.Klick AWT, Swing, JavaFX & SWT 2
G Farbe ändern bei Klick auf einen Kreis AWT, Swing, JavaFX & SWT 5
F Ignoriere Mausklick falls erster Klick von Doppelklick . AWT, Swing, JavaFX & SWT 4
S 1 Klick für JButton und Layout ändert sich AWT, Swing, JavaFX & SWT 14
G Icon auf Button per Klick darauf ändern? AWT, Swing, JavaFX & SWT 9
S jTable beim Klick auf Button aktualisieren AWT, Swing, JavaFX & SWT 7
H JWindow schließen bei einem Klick außerhalb der Anwendung? AWT, Swing, JavaFX & SWT 19
S Neues Panel in JFrame anzeigen durch Button klick AWT, Swing, JavaFX & SWT 2
A Zellen in JTable auf Klick kurz markieren auf Klick AWT, Swing, JavaFX & SWT 2
N Bei Klick auf einen Menüeintrag, soll Tabelle ausgegeben wer AWT, Swing, JavaFX & SWT 4
B JPanel erst durch Button-Klick sichtbar machen AWT, Swing, JavaFX & SWT 8
Z JMenue und bei Klick neuer Inhalt, Problem AWT, Swing, JavaFX & SWT 3
B Anfänger: Panel bei Button Klick anzeigen? AWT, Swing, JavaFX & SWT 4
M Java mit Swing - Elemente erst nach klick sichtbar AWT, Swing, JavaFX & SWT 13
C Komponente mit Focus bevor JButton-Klick merken. AWT, Swing, JavaFX & SWT 6
M neues Frame per klick anzeigen AWT, Swing, JavaFX & SWT 9
I JSlider - klick ignorieren AWT, Swing, JavaFX & SWT 4
S Einfacher Klick aber mouseClicked() zweimal aufgerufen AWT, Swing, JavaFX & SWT 3
R Klick in einem Tree erkennen und auswerten AWT, Swing, JavaFX & SWT 6
G Ein klick auf JPanel abfangen und verarbeiten? AWT, Swing, JavaFX & SWT 3
S Schließen eines Fensters bei Klick auf Button? AWT, Swing, JavaFX & SWT 2
hamburger_jung Mit Button Klick neues Fenster öffnen. AWT, Swing, JavaFX & SWT 1
N Jtable und ein Klick darauf! AWT, Swing, JavaFX & SWT 4
V JTable: Bei Klick in Zelle -> Ganze Zeile markeiren AWT, Swing, JavaFX & SWT 7
H Neue Instanz einer Klasse bei JButton-Klick AWT, Swing, JavaFX & SWT 5
M Zusätzlichen Maus-Klick erzeugen AWT, Swing, JavaFX & SWT 4
T Anderes Panel nach Button-Klick laden AWT, Swing, JavaFX & SWT 9

Ähnliche Java Themen

Neue Themen


Oben