Wie kann ich programmatisch Clicks auf Componenten ausfuehren?

Status
Nicht offen für weitere Antworten.

richardcurtle

Bekanntes Mitglied
Hi,

Ich habe eine ContentPane mit vielen JComponents drin die man anklicken kann: JButtons, JTabbedPanes, JCheckBoxes, JComboBoxes, usw.

Nun habe ich nur die Position im ContentPane auf die ich klicken will. Ich muss also fuer diese Position die Componente finden die geklickt werden soll und dann muss ich sie "programmatisch" (also nicht mit der Maus) klicken.

Geht sowas?
 

0x7F800000

Top Contributor
actionPerformed(ActionEvent e) ist eigentlich ja eine ganz gewöhnliche öffentliche methode, da kannst du prinzipiell auch direkt ActionEvents so senden, das wäre dasselbe wie ein mausklick...:bahnhof:
 

0x7F800000

Top Contributor
Achso, ne, sorry, denkfehler... Man muss da natürlich kein actionPerformed an alle möglichen und unmöglichen Listener verschicken, sondern ein einziges mouseClicked an die Schaltfläche, das könnte sogar klappen...
 

Marco13

Top Contributor
Alternativ könnte man auch einen selbstgebastelten Event in die Queue werfen... Könnte gehen, müßte man testen...
 

byte

Top Contributor
Die Komponente bekommst Du mit SwingUtilities#getDeepestComponentAt(parent, x, y)
 

0x7F800000

Top Contributor
Nun habe ich nur die Position im ContentPane auf die ich klicken will. Ich muss also fuer diese Position die Componente finden die geklickt werden soll und dann muss ich sie "programmatisch" (also nicht mit der Maus) klicken.
Wo ich mir das zum zweiten mal durchlese, fällt's mir auf: wieso sollte man denn auf eine Position klicken wollen?!? Hat die irgendeinen Sinn diese Position? Die ist doch einfach ein Punkt ohne irgendeinen Sinn und zweck, wieso sollte man darauf klicken wollen? ???:L
 

diggaa1984

Top Contributor
in einem andere thread gings mal darum die position von komponenten relativ zum ober-super-contentpane des frames zu bekommen. Nun will der mit der info klicks an der stelle simulieren

anderer Thread
 

0x7F800000

Top Contributor
Der OP verrichtet momentan einfach einen riesigen Haufen unnötiger Arbeit.
Statt:

Code:
* Start 
-> .mouseClicked(new MouseEvent(...));
* Ziel

macht er:
Code:
* Start 
-> SwingUtilities auspack'n
-> Koordinates des Mittelpunktes eines JComponents rekursiv rausfinden
-> Robot holen
-> "Ach fuck, Robot funzt in Applets nicht" -> Applet Signieren
-> Mit Robot Kontrolle über Maus übernehmen
-> Mit Robot den Punkt anklicken
-> Robot: .mouseClicked(new MouseEvent(...));
* Ziel
Das ist einerseits beängstigend, andererseits irgendwie lustig^^ :D
 

richardcurtle

Bekanntes Mitglied
Ich will nicht unbedingt die Maus wirklich bewegen...ich will nur, dass an Stelle xyz ein Click ausgefuehrt wird.

Wenn es z.B. ein Button ist, soll da nicht die Maus hinwandern und den Button langsam druecken.

Es geht mir lediglich darum die Aktion auszufuehren als ob der Button gedrueckt worden waere.
 

byte

Top Contributor
Wie gesagt:
1. Komponente an Punkt (x,y) holen: SwingUtilities#getDeepestComponentAt(parent, x, y)
2. MouseListener holen: Component#getMouseListeners()
3. Event triggern: MouseListener#mouseClicked()
 
G

Gast2

Gast
Aber dann brauch jede Componente einen MouseListener... oder?
Ich denk mal seine JButton haben einen ActionListener, also sollte er schon die Komponenten unterscheiden...
 

Marco13

Top Contributor
Die Components, die auf Mausklicks reagieren (wie JButton) haben auch einen MouseListener... oder mehrere ... der beschriebene Weg könnte aber auch ein bißchen hakelig werden ... naja... muss man testen...
 

0x7F800000

Top Contributor
Wie gesagt:
1. Komponente an Punkt (x,y) holen: SwingUtilities#getDeepestComponentAt(parent, x, y)
2. MouseListener holen: Component#getMouseListeners()
3. Event triggern: MouseListener#mouseClicked()
byto, ich bitte dich, wieso fängst du schon wieder mit diesem xy-salat an? ;(

Hat denn einer von euch (bzw von uns^^) überhaupt mal nen Blick in die Api geworfen, seit beginn dieser Diskussion?
http://java.sun.com/j2se/1.4.2/docs/api/javax/swing/AbstractButton.html#doClick()
Was is'n das, heh? :D

Hier ein fast unnötiges Beispiel:
[highlight=Java]
import java.awt.event.*;
import java.awt.*;
import javax.swing.*;

public class NoRobot extends JFrame implements ActionListener{

private JButton button;
private JLabel label;

public NoRobot(){
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setSize(500,200);
getContentPane().setLayout(new GridLayout(2,1));
button=new JButton("Mit Maus klicken oder warten...");
getContentPane().add(button);
label=new JLabel("Bisher nichts gehört...");
getContentPane().add(label);

button.addActionListener(this);

(new Thread(){
@Override public void run(){
while(!isInterrupted()){

try{
sleep(5000);
}catch(InterruptedException e){}

button.doClick();

}
}
}).start();
}

@Override
public void actionPerformed(ActionEvent e) {
label.setText((Math.random()>0.5 ?
"Yuhu, ich höre was " :
"Aah, da meldet sich der button wieder ")
+e.getWhen());
}


public static void main(String..._){
(new NoRobot()).setVisible(true);
}
}
[/highlight]

Allgemeiner funktioniert es mit diesem hier statt doClick():
[highlight=Java]
button.dispatchEvent(
new MouseEvent(button,
MouseEvent.MOUSE_PRESSED,
System.currentTimeMillis(),
MouseEvent.BUTTON1_MASK,
button.getX()+button.getWidth()/2,
button.getY()+button.getHeight()/2,
1,
false,
MouseEvent.BUTTON1));
button.dispatchEvent(
new MouseEvent(button,
MouseEvent.MOUSE_RELEASED,
System.currentTimeMillis(),
MouseEvent.BUTTON1_MASK,
button.getX()+button.getWidth()/2,
button.getY()+button.getHeight()/2,
1,
false,
MouseEvent.BUTTON1));
button.dispatchEvent(
new MouseEvent(button,
MouseEvent.MOUSE_CLICKED,
System.currentTimeMillis(),
MouseEvent.BUTTON1_MASK,
button.getX()+button.getWidth()/2,
button.getY()+button.getHeight()/2,
1,
false,
MouseEvent.BUTTON1));
[/highlight]
das könnte man dann auch auf components loslassen, die kein doClick zur verfügung stellen...

Kann mir jemand sagen, ob mein programm so eigentlich OK ist, oder ob da jetzt noch irgendwo irgendwelche invokeLater() hinsollten, bin mir bei sowas stets unsicher :(
 
Zuletzt bearbeitet:

byte

Top Contributor
byto, ich bitte dich, wieso fängst du schon wieder mit diesem xy-salat an? ;(

Hat denn einer von euch (bzw von uns^^) überhaupt mal nen Blick in die Api geworfen, seit beginn dieser Diskussion?
http://java.sun.com/j2se/1.4.2/docs/api/javax/swing/AbstractButton.html#doClick()

Entschuldigung, dass ich bloß die Frage des TE beantwortet habe anstatt ihm zu sagen, dass seine Anforderungen Bullshit sind und er es ganz anders machen soll. :rolleyes:

Du kennst doch gar nicht den Grund, warum der TE Clicks auf einer Koordinate auslösen will. Warum maßt Du Dir also an, ihn dahingehend zu belehren?
 

0x7F800000

Top Contributor
Du kennst doch gar nicht den Grund, warum der TE Clicks auf einer Koordinate auslösen will
Wieso nicht, den Grund hat er doch gleich hingeschrieben ;) :
TE hat gesagt.:
Wie kann ich programmatisch Clicks auf Componenten ausfuehren?
Und wenn einer schon fragt, wie er das am besten mit dem schießpulver und dem Fuß macht, dann sag ich dem doch lieber gleich, dass es keinen Guten Grund gibt, sich in den Fuß zu schießen, das kriegt er auch ohne unsre Unterstützung noch oft genug hin :)
 

byte

Top Contributor
Sorry, aber ich kann Dir nicht mehr folgen. :rolleyes:

Der TE schreibt, er möchte auf Punkt (x,y) einen Klick auslösen.

Wo genau hat er begründet, warum er das tun will? Und warum bist Du der Meinung, dass man das nicht tun sollte?

Mir fällt spontan ein Beispiel ein, wo genau sowas sinn machen könnte: automatisierte GUI Tests.
Da ich aber kA habe, was den TE zu dieser Anforderung bewegt hat, beantworte ich einfach seine Frage.
 
Zuletzt bearbeitet:

Ebenius

Top Contributor
Habt Ihr inzwischen herausgefunden, was der Themeneröffner eigentlich vor hat? Meiner Kenntnis entzieht sich das irgendwie noch immer.

Ebenius
 

0x7F800000

Top Contributor
automatisierte GUI Tests
Hab beim test einer Visualisierungskomponente, die mit AffinenTransformationen herumhantiert, habe ich auch direkt MouseEvents und MouseMotionEvents verschickt, um das korrekte verhalten beim Zoomen und Herumschieben mit der Maus zu kontrollieren. Ging ganz gut. Ging imho einfacher, als wenn man das in globale Koordinaten umrechnen würde, kann's also eigentlich nur weiterempfehlen ;)
Da ich aber kA habe, was den TE zu dieser Anforderung bewegt hat, beantworte ich einfach seine Frage.
Okay okay^^ Ich bin halt einer der gerne unbegründete Vermutungen aufstellt :) Mir kommt es halt nun mal so vor, dass diese methode zum rausfinden der Koordinaten eher selten nötig ist, und dass der OP sich nur einbildet dass er das brauchen würde.
Für Automatisierte Tests von Layout-Managern könnte man das vielleicht noch irgendwie gebrauchen, aber sonst fällt mir echt nicht ein wozu das gut sein soll
=> ich find's nun mal verdächtig:bahnhof:
 

richardcurtle

Bekanntes Mitglied
Habt Ihr inzwischen herausgefunden, was der Themeneröffner eigentlich vor hat? Meiner Kenntnis entzieht sich das irgendwie noch immer.

Ebenius

Also - worum es geht, allerdings nicht im Detail, weil zu kompliziert zu erklaeren. Sagen wir einfach der User kann auf eine Flaeche klicken die die eigentliche Oberflaeche verdeckt. Wie ein Glasspane sozusagen. Ich will nur die Mausklicks an die tatsaechliche Oberflaeche und ihre JButtons, JCheckboxes usw. weiterleiten.
 

sirbender

Top Contributor
Hier hat doch jemand mal eine spezielle Klasse/GlassPane gepostet die Mausclicks an die darunterliegende Componente weiterleitet.

War glaub ich noch im alten Forum.

Die Glasspane kam aus seinem Docking-Framework projekt.
 

0x7F800000

Top Contributor
Also - worum es geht, allerdings nicht im Detail, weil zu kompliziert zu erklaeren. Sagen wir einfach der User kann auf eine Flaeche klicken die die eigentliche Oberflaeche verdeckt. Wie ein Glasspane sozusagen. Ich will nur die Mausklicks an die tatsaechliche Oberflaeche und ihre JButtons, JCheckboxes usw. weiterleiten.
Ja, gut, dann hängst du an dieses "Glasspane" einfach einen MouseListener an, der alle Events einfach direkt an die drunterliegende JPanel per dispatchEvent() weiterleitet.

@byto: Iss gut, okay, du hast gewonnen, der OP wollte tatsächlich was anderes :smoke:
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
W JPanel, JLabel und MouseListener -> auf clicks reagieren AWT, Swing, JavaFX & SWT 5
E Swing Componenten werden nach Änderung des display modes verzerrt dargestellt AWT, Swing, JavaFX & SWT 8
kaoZ Frage zum einfügen von Componenten AWT, Swing, JavaFX & SWT 14
L Componenten im JFrame an genaue stelle verschieben. AWT, Swing, JavaFX & SWT 2
V Swing Componenten Array AWT, Swing, JavaFX & SWT 3
B Swing JMenu zwischen anderen Componenten AWT, Swing, JavaFX & SWT 4
J Swing Componenten übereinander platzieren. AWT, Swing, JavaFX & SWT 17
M SWT SWT Componenten auf GLCanvas zeichnen AWT, Swing, JavaFX & SWT 3
earlgrey_tea GridBagLayout Componenten proportional vergößern AWT, Swing, JavaFX & SWT 12
L LayoutManager Componenten über verfügbaren Platz strecken AWT, Swing, JavaFX & SWT 7
L Swing Serverbrowser, aber welche componenten? AWT, Swing, JavaFX & SWT 2
H Mit for-schleife die Componenten eines Frames verändern AWT, Swing, JavaFX & SWT 5
H SWT Breite von componenten zu bestimmen AWT, Swing, JavaFX & SWT 2
T JFrame Componenten Problem AWT, Swing, JavaFX & SWT 17
T Swing JSplitPane Componenten ausrichten AWT, Swing, JavaFX & SWT 4
lumo Swing Componenten ersetzen AWT, Swing, JavaFX & SWT 2
L Swing Kommunikation zwischen JMenuBar und anderen Componenten AWT, Swing, JavaFX & SWT 2
E Im Frame alle Componenten abrufen AWT, Swing, JavaFX & SWT 2
S Standpunkt von Componenten frei bestimmen AWT, Swing, JavaFX & SWT 10
R Thumbpanel bzw. Layout das Componenten in einem Grid anordnet ..? AWT, Swing, JavaFX & SWT 13
D verschieden große Componenten in einem JPanel? AWT, Swing, JavaFX & SWT 2
A Swing: Componenten in einem deaktivierten JPanel AWT, Swing, JavaFX & SWT 2
R HTML Hintergrund für Swing - Componenten AWT, Swing, JavaFX & SWT 2
G Suche 2 Componenten: Splitpane ausblenden / Stecknadel AWT, Swing, JavaFX & SWT 2
G SystemTray BubbleInfo an anderen Componenten anzeigen AWT, Swing, JavaFX & SWT 6
J durchsichtige componenten AWT, Swing, JavaFX & SWT 3
S Componenten werden nicht angezeigt AWT, Swing, JavaFX & SWT 3
R Componenten eines JFrames updaten AWT, Swing, JavaFX & SWT 11
thE_29 TableRenderer und JPanel => Abfrage auf Componenten Posit AWT, Swing, JavaFX & SWT 2
S Mehere Componenten setEnabled(false) in JToolBar AWT, Swing, JavaFX & SWT 4
M componenten im jframe erst nach fensterveränderung sichtbar AWT, Swing, JavaFX & SWT 2
S verhindern von drag-n-drop von swing componenten AWT, Swing, JavaFX & SWT 2
T Objektorientierung bei Componenten häh? AWT, Swing, JavaFX & SWT 5
D Componenten Problem - aktualisieren nach hinzufügen AWT, Swing, JavaFX & SWT 2
V JTable mit mehreren Componenten in einer Spalte ? AWT, Swing, JavaFX & SWT 6

Ähnliche Java Themen


Oben