Mausklick an darunterliegende Komponente weiterleiten

MrPink

Mitglied
Hallo,

ich habe ein spezielles Problem und auch nach längerer Suche bei Google und auch hier im Forum keine Lösung finden können.

Deshalb nun meiner 1. Beitrag in diesem Forum.

Ich habe eine JTabbedPane. Dieser füge ich mit der Method addTab(String, Component) mehrere Tabs hinzu. Mit der Method setTabComponentAt(int, Component) setze ich für die Reiter ein eigenes Label.
Java:
    JTabbedPane lTabbedPane = new JTabbedPane(JTabbedPane.NORTH, JTabbedPane.WRAP_TAB_LAYOUT);
    getContentPane().add(lTabbedPane);
    
    lTabbedPane.addTab(null, createPanel("Panel one") );
    lTabbedPane.setTabComponentAt(0, createLabel("one") );
    
    lTabbedPane.addTab(null, createPanel("Panel two") );
    lTabbedPane.setTabComponentAt(1, createLabelWithListener("two") );

Das funktioniert auch soweit.
Wenn ich jetzt für meinen eigenen Label einen MouseListener registriere, kommt anscheinend der Mausklick nicht mehr in dem darunter liegenden Container, in diesem Fall die JTabbedPane an.

Hier einmal der komplette Code:
Java:
public class TabbedPaneTest extends JFrame {
  
  
  public static void main(String[] args) {
    new TabbedPaneTest();
  }
  
  
  public TabbedPaneTest() {
    super("TabbedPaneTest");
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setSize(400, 100);
    init();
    setVisible(true);
  }
  
  
  
  private void init() {
    JTabbedPane lTabbedPane = new JTabbedPane(JTabbedPane.NORTH, JTabbedPane.WRAP_TAB_LAYOUT);
    getContentPane().add(lTabbedPane);
    
    lTabbedPane.addTab(null, createPanel("Panel one") );
    lTabbedPane.setTabComponentAt(0, createLabel("one") );
    
    lTabbedPane.addTab(null, createPanel("Panel two") );
    lTabbedPane.setTabComponentAt(1, createLabelWithListener("two") );
  }
  
  private JPanel createPanel(final String pPanelText) {
    return new JPanel() {
      public void paint(Graphics pGrp) {
        pGrp.drawString(pPanelText, 50, 20);
      }
    };
  }
  
  private JLabel createLabel(String pText) {
    JLabel lLabel = new JLabel(pText);
    return lLabel;
  }
  
  private JLabel createLabelWithListener(String pText) {
    JLabel lLabel = new JLabel(pText);
    lLabel.addMouseListener( new MouseListener() {
      public void mouseReleased(MouseEvent e) {
        Component lContainer = ((Component)e.getSource()).getParent();
        lContainer.dispatchEvent( SwingUtilities.convertMouseEvent((Component)e.getSource(), e, lContainer) );
      }
      public void mousePressed(MouseEvent e) { }
      public void mouseExited(MouseEvent e) { }
      public void mouseEntered(MouseEvent e) { }
      public void mouseClicked(MouseEvent e) { }
    });
    return lLabel;
  }

}

Ich habe auch schon alles mögliche mit den SwingUtilities ausprobiert, bin dabei aber leider nicht auf die richtige Lösung gestoßen.
Ich möchte eine eigene Label-Klasse haben, die die Events einfach "durchlässt" bzw. "weiterleitet".
Wie kann ich soetwas realisieren? Kann mir dan jemand einen Tipp geben?

MFG Simon
 

JensArpe

Mitglied
ohne mich jetzt wirklich damit befasst zu haben (habs nur mal schnell compiliert).. das Label mit dem Text scheint da was zu verdecken. Versuch mal bei Tab 2 ganz weißt rechts oder links zu klicken. Bei mir wechelts da dann nämlich den Tab.
 

MrPink

Mitglied
Das stimmt. Dann wechselt der Tab. Allerdings auch nur, wenn man "neben" den Label klickt. genau das ist mein Problem.
Ich möchte, dass dieser Wechsel auch passiert, wenn man "auf" den Label klickt, wie bei dem ersten Tab ("one"), bei dem kein extra Listener registriert ist.
 

Morl99

Mitglied
Vermutlich wäre es am besten wenn du uns kurz beschreibst, was du erreichen möchtest. Gibt es einen bestimmten Grund, warum du einen neuen Tab nicht einfach mit einem String beschreibst? Wenn ja, wäre es vielleicht eine Lösung dem Listener des Labels ein setSelectedComponent spendierst?

Noch etwas sonnige Literatur von Oracle: How to Use Tabbed Panes

Wenn dir das nicht weiterhilft, versuch mal zu beschreiben, was du mit deinen Tabs erreichen möchtest.
 

Volvagia

Top Contributor
Wenn du dem MouseListener wieder entfernst, bekommt das Untere wieder das Event. Ansonst wäre es unter Umständen eine einfach Möglichkeit, wenn du im Listener des Labels die Eventmethode des Panes aufrufst. Oder warscheinlich besser, das Pane bekommt den Listener und du rufst dementsprechend eine Methode des Labels auf.
 
Zuletzt bearbeitet:

MrPink

Mitglied
Danke für die bisherigen Antworten.
Leider ist mein Problem damit nicht gelöst.

Was will ich:
Ich habe eine eigene Label-Klasse, die Texte für mehrsprachigkeit von EINER Quelle bezieht (ini-Datei mit allen Texten, keine Java-Typischen Resource-Bundles!).
Das beziehen der Texte aus einer Datenbank ist in einem sogenannten Autorenmodus auch möglich.
Um genau diesen Autorenmodus geht es. Der Anwender soll im laufendem Programm die Möglichkeit haben, per Shift+Rechtsklick auf ein Label zu klicken. Dann soll sich ein Dialog öffnen, indem der Nutzer eine neue Beschriftung und einen Tooltip für dieses Label eingeben kann. Zusätzlich kann er über eine Combobox die entsprechende Sprache einstellen.
Die Informationen werden dann beim Schließen bzw. beim klick auf "Save" in die Datenbank geschrieben.
Das ganze funktioniert auch schon soweit, auch für Label auf den Tabs. Nur geht mein Mausklick nun leider nicht mehr auf den Tab durch.

Mein Wunsch ist es, ein Label zu haben, dass, egal wo es eingebettet ist (in ein JPanel, eine JTabbedPane, eine JTable, ...), MouseEvents an die darunterliegende Komponente weiterzuleiten.
Ich möchte nicht extra die entsprechende Komponente an das Label geben müssen und dieses dann direkt ansprechen. Ich dachte an eine Lösung, in der es möglich ist über die Methode getParent():Component den MouseEvent einfach weiter zu "dispatchen".

Dieser Versuch sollte aus meinem obigen Beispiel in der Implementierung der mouseReleased-Methode deutlich werden.
 

MrPink

Mitglied
Ich habe gerade nochmal etwas rumexperementiert.
Also zum einen ist es wohl ganz sinnvol, wenn ich alle MouseEvents weiterleite (JTabbedPane z.B. reagiert auf mousePressed und nicht auf mouseReleased) ;-).

Ich habe den Teil des "dispatchen" mal in eine seperate Metode ausgelagert. Diese Methode rufe ich jetzt jeweils in meinen mouse-Event-Methode auf:

Java:
  private JLabel createLabelWithListener(String pText) {
    JLabel lLabel = new JLabel(pText);
    lLabel.addMouseListener( new MouseListener() {
      public void mouseReleased(MouseEvent e) {
        dispatchMyEvent(e);
      }
      public void mousePressed(MouseEvent e) {
        dispatchMyEvent(e);
      }
      public void mouseExited(MouseEvent e) {
        dispatchMyEvent(e);
      }
      public void mouseEntered(MouseEvent e) {
        dispatchMyEvent(e);
      }
      public void mouseClicked(MouseEvent e) {
        dispatchMyEvent(e);
      }
    });
    return lLabel;
  }
  
  
  private void dispatchMyEvent(MouseEvent pMEvt) {
    Component lSource = null;
    Container lParent = null;
    if(pMEvt.getSource() instanceof Component) {
      lSource = (Component)pMEvt.getSource();
      lParent = lSource.getParent().getParent();
    }
    MouseEvent lRetargetedMouseEvent = SwingUtilities.convertMouseEvent(lSource, pMEvt, lParent);
    lParent.dispatchEvent(lRetargetedMouseEvent);
  }
Der restliche Code ist unverändert.

Wie man sehen kann, frage ich jetzt den "Source" (MouseEvent.getSource) ZWEIMAL nach seinem Parent. Dann bekomme ich die JTabbedPane zurück und das selektieren funktioniert.

Hat einer eine Idee, warum ich zweimal nach dem Parent fragen muss? Ist das bei den Swing-Komponenten so? Funktioniert das auch noch, wenn ich mein Label z.B. in eine Zelle einer JTable packe oder auf einen JButton oder auf sonst eine Komponente?
 

MrPink

Mitglied
Kann mir keiner darauf eine Antwort geben.
Ich erwarte jetzt nicht, dass sich extra jemand bis zur entsprechenden Tiefe in die Swing-Komponenten einarbeitet.
Das könnte ich auch selber machen.
Ich weiß z.B., dass die Swing-Komponente noch aus anderen Komponente, u.a. den sogenannten ui-Komponente bestehen,
die für das LAF zuständig sind.
In meinem Fall mit der JTabbedPane bekomme ich eben beim ersten getParent():Component einen solches Object zurück. Vielleicht hilft das ja anderen schon mal weiter.

Ich dachte, dass vielleicht schon mal jemand anderes ein ziemlich ähnliches Problem hatte und sich schon mal in die Thematik eingearbeitet hat.
Wenn dem nicht so ist, werde ich das Thema am 29.10. als "erledigt" markieren?
 

N4pst3r

Mitglied
ich übersetze deinen progrmmierstil besser nicht in meinen... da steig ich nicht durch ;)
drum:
nimm den MouseListener vom Label, verknüpf ihn mit der tebbedPane und sobald du drauf klickst (wie auch immer) reagiert das Label (mit bestimmten events) und nach der verknüpfung der tabbedPane (mit bestimmten events).
Un dwenn du dem Label einen Listener anhängst, wie soll dann auch der container wissen das du ihn ebenfalls ansprichst?
wenn du dem Label einen Mouse Listener zuweist werden ja beim klick schon alle möglichen MouseEvents abgerufen.
schreib in die "public void mouseClicked( MouseEvent e ){}" dass dein TabbedPane aktiviert werden soll.

denn soweit ich dich verstanden hab, ist dein hauptproblem dass du die tabbedpane nicht mehr anklicken und aktivieren kannst or?
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
L JButton durch Mausklick auslösen und Enter-Taste AWT, Swing, JavaFX & SWT 2
R Scenenwechel per Mausklick AWT, Swing, JavaFX & SWT 1
A Swing Fenster ändert Position bei Mausklick nicht AWT, Swing, JavaFX & SWT 2
Q-bert JTextField per Mausklick einfügen AWT, Swing, JavaFX & SWT 3
K Swing GridLayout - x und y bei Mausklick ausgeben AWT, Swing, JavaFX & SWT 4
J 2D-Grafik Linie wird nach Mausklick nicht am richtigen Ort gezeichnet AWT, Swing, JavaFX & SWT 11
L Tabelle reagiert ungewollt auf Mausklick AWT, Swing, JavaFX & SWT 6
J Labelicon bei Mausklick an den Zeiger pinnen AWT, Swing, JavaFX & SWT 7
C Schleife auf Mausklick warten lassen AWT, Swing, JavaFX & SWT 6
Semox Swing Kreis löschen durch Mausklick in der Nähe AWT, Swing, JavaFX & SWT 2
N Defaulttext per Mausklick auswählen AWT, Swing, JavaFX & SWT 4
P JTextArea text verschwindet bei mausklick AWT, Swing, JavaFX & SWT 5
M File-Chooser Problem (2 X Mausklick öffnen) AWT, Swing, JavaFX & SWT 11
G JTree und Mausklick? AWT, Swing, JavaFX & SWT 2
R doppelte Ausführung bei einfachem Mausklick! AWT, Swing, JavaFX & SWT 12
G Mausklick event? BITTE HELFT MIR! :( AWT, Swing, JavaFX & SWT 8
B Thumbnail-Position per Mausklick ändern AWT, Swing, JavaFX & SWT 3
S Graph zeichnen bei Mausklick AWT, Swing, JavaFX & SWT 4
F Ignoriere Mausklick falls erster Klick von Doppelklick . AWT, Swing, JavaFX & SWT 4
G JTree soll nur auf Mausklick reagieren AWT, Swing, JavaFX & SWT 10
F Mausklick AWT, Swing, JavaFX & SWT 2
M Mausklick in nicht angezeigtes JTextField simulieren AWT, Swing, JavaFX & SWT 4
C [JTable] Mausklick. AWT, Swing, JavaFX & SWT 5
M JTree Elemete zeigen nach 2. Mausklick Object an. Warum? AWT, Swing, JavaFX & SWT 2
T JTextPane, Mausklick, aktives Wort AWT, Swing, JavaFX & SWT 2
S Mausklick reagiert nicht im JMenuBar AWT, Swing, JavaFX & SWT 4
S mausklick AWT, Swing, JavaFX & SWT 9
M Mausklick verzögern AWT, Swing, JavaFX & SWT 5
M mouseEvent an darunterliegende Komponenten weiterleiten AWT, Swing, JavaFX & SWT 2
Maxim6394 JavaFX Scene Builder - Crash bei eigener Komponente AWT, Swing, JavaFX & SWT 2
H JDialog in Größe ändern - Resize-Cursor bleibt betreten der Komponente AWT, Swing, JavaFX & SWT 1
temi JavaFX "Frames" in JavaFx - passende Komponente? AWT, Swing, JavaFX & SWT 13
J Swing Komponente wird unpassend angepasst in der Größe AWT, Swing, JavaFX & SWT 35
M4cM4rco0707 JavaFX Custom-Komponente mit Custom-Controller AWT, Swing, JavaFX & SWT 3
J Komponente wird manchmal falsch gezeichnet AWT, Swing, JavaFX & SWT 0
R Swing Komponente im JFrame überschreinen sich AWT, Swing, JavaFX & SWT 7
Q-bert Dynamische Komponente erzeugen AWT, Swing, JavaFX & SWT 6
G vorgefertigte Buttons oder neue Komponente mit MouseListener? AWT, Swing, JavaFX & SWT 0
B Swing Update Swing Komponente bevor Methode startet. AWT, Swing, JavaFX & SWT 4
Tom299 JavaFX Ähnliche Komponente wie der VB6 Frame? AWT, Swing, JavaFX & SWT 2
M JavaFX Progressbar bar und track Komponente zur Laufzeit ändern AWT, Swing, JavaFX & SWT 2
Tort-E JavaFX Daten an WebView Komponente AWT, Swing, JavaFX & SWT 1
G JPanel komponente Löschen AWT, Swing, JavaFX & SWT 7
T Swing Index für Komponente in JPanel? AWT, Swing, JavaFX & SWT 6
T Swing Größe einer Komponente in einem BoxLayout / FlowLayout festlegen AWT, Swing, JavaFX & SWT 7
G Border der Komponente bei Table CellRenderer überschreiben AWT, Swing, JavaFX & SWT 0
P Warten auf komponente AWT, Swing, JavaFX & SWT 2
U LookAndFeel für eine Komponente AWT, Swing, JavaFX & SWT 2
E Mit Netbeans von einer Form auf eine Komponente einer anderen Form zugreifen AWT, Swing, JavaFX & SWT 2
G Zeichnen auf eine schwergewichtige Komponente? AWT, Swing, JavaFX & SWT 0
T Komponente wird nicht neu gezeichnet AWT, Swing, JavaFX & SWT 3
S Swing Komponente wird überblendet AWT, Swing, JavaFX & SWT 27
A Swing Komponente mehrseitig ausdrucken AWT, Swing, JavaFX & SWT 2
V Fertige Komponente zum Anzeigen mehrerer Bilder AWT, Swing, JavaFX & SWT 5
B Swing Komponente an Position eines Objektes ausgeben lassen AWT, Swing, JavaFX & SWT 3
R Swing Komponente austauschen AWT, Swing, JavaFX & SWT 2
M JApplet mit Java 3D Komponente AWT, Swing, JavaFX & SWT 6
M Swing JMenu verdeckt durch Komponente (aber kein AWT und Swing mix!?) AWT, Swing, JavaFX & SWT 3
N Swing Java Komponente zur Darstellung von klickbaren Links, die Java Funktionen ausführen können AWT, Swing, JavaFX & SWT 2
S Swing Eigene Komponente (JPanel) soll ChangeEvents verteilen AWT, Swing, JavaFX & SWT 12
S Spezielle komponente aktualisieren AWT, Swing, JavaFX & SWT 9
GUI-Programmer LayoutManager Kurze Layout Frage - eine komponente mittig? AWT, Swing, JavaFX & SWT 5
1 Swing Spaltenbreite and CellEditor- Komponente anpassen AWT, Swing, JavaFX & SWT 4
R Komponente wieder entfernen AWT, Swing, JavaFX & SWT 13
B Komponente "sauber" entfernen(JToolBar) AWT, Swing, JavaFX & SWT 4
xehpuk Swing Komponente in Graustufen zeichnen AWT, Swing, JavaFX & SWT 2
A Swing GlassPane Cursor wird bei fremder Komponente nicht angezeigt AWT, Swing, JavaFX & SWT 3
darekkay Swing Komponente zur Laufzeit neuinitialisieren AWT, Swing, JavaFX & SWT 6
K Swing Komponente als Bild speichern AWT, Swing, JavaFX & SWT 11
F visuelle Komponente AWT, Swing, JavaFX & SWT 3
padde479 Komponente gesucht AWT, Swing, JavaFX & SWT 2
A Swing Komponente für Swing und JSF durch MVC AWT, Swing, JavaFX & SWT 5
P Swing Eigene Komponente Entwickeln - erben von JComponent oder JPanel? AWT, Swing, JavaFX & SWT 5
A Swing suche OpenSource Date(Time)Picker Komponente AWT, Swing, JavaFX & SWT 9
N Swing außerhalb des Hauptframe Komponente/Frame öffnen AWT, Swing, JavaFX & SWT 2
S Feste Position einer Komponente auf Glasspane AWT, Swing, JavaFX & SWT 6
B Erfragen der Komponente AWT, Swing, JavaFX & SWT 4
B (Swing) Welche Komponente für unterteilten Text? AWT, Swing, JavaFX & SWT 4
D Wie nennt sich beschriebene Komponente? (-> Autocomplete) AWT, Swing, JavaFX & SWT 5
D Komponente im FlowLayout nicht mittig sondern rechts. Wie? AWT, Swing, JavaFX & SWT 4
G Swing Komponente gesucht (Textfeld mit Liste) AWT, Swing, JavaFX & SWT 2
padde479 Suche eine Komponente (->ToolBar) AWT, Swing, JavaFX & SWT 7
algorismi Browser Komponente AWT, Swing, JavaFX & SWT 3
G Swing Auswahlrechteck über Komponente zeichnen AWT, Swing, JavaFX & SWT 3
0 Swing Drag n' Drop Bug wenn Source und Target gleiche Komponente? AWT, Swing, JavaFX & SWT 4
C Swing Komponente mit setLocation auf JPanel funktioniert nicht AWT, Swing, JavaFX & SWT 3
G Gibt es diese Komponente? AWT, Swing, JavaFX & SWT 11
slawaweis Suche TagCloud Komponente für Swing AWT, Swing, JavaFX & SWT 10
H Swing Eigene Komponente wird nur halb oder komisch angezeigt AWT, Swing, JavaFX & SWT 3
M Combobox soll Farbe einer Komponente setzen AWT, Swing, JavaFX & SWT 2
H Swing Eigene Komponente reagiert falsch auf mouseClicked() AWT, Swing, JavaFX & SWT 5
D swt komponente in swing-frame AWT, Swing, JavaFX & SWT 4
hdi SWT Operation auf GUI-Komponente kommt mal wieder nicht an... AWT, Swing, JavaFX & SWT 9
N Suche nach Komponente / LaF AWT, Swing, JavaFX & SWT 21
A Komponente zur Laufzeit hinzufügen und RICHTIG anzeigen AWT, Swing, JavaFX & SWT 3
T Swing Gibt es eine Komponente für eine farbliche Editorbox? AWT, Swing, JavaFX & SWT 6
S Swing Komponente mit jogl AWT, Swing, JavaFX & SWT 18
Airwolf89 Swing Von anderer Klasse auf Eigenschaften einer Komponente zugreifen AWT, Swing, JavaFX & SWT 5
SuperSeppel13 Komponente transparent übermalen AWT, Swing, JavaFX & SWT 2
I Swing Warten, bis eine GUI-Komponente aktualisiert ist? AWT, Swing, JavaFX & SWT 4

Ähnliche Java Themen

Neue Themen


Oben