Klassenübergreifend MouseListener verwenden

Status
Nicht offen für weitere Antworten.

Achtel

Mitglied
Hallo ihr Lieben,

ich habe folgendes Problem: Ich habe in einer Klasse (TickFrame) ein JPanel (main_panel), dass über einen MouseListener auf Maus-Click und Maus-Drag reagiert (zu Testzwecken erstmal nur durch Ausgabe der Koordinaten).

Dann gibt es ein weiteres Panel (button_panel) in der selben Klasse, in dem eine Reihe von Buttons stehen... beim Click auf einen der Button wird eine andere Klasse (ClassBox) aufgerufen, die dann eine Instanz dieser Klasse erzeugt und bestimmte Abfragen über Dialoge durchführt. Jetzt möchte ich, dass der User nach diesen Abfragen ins main_panel klickt und die Koordinaten des Klicks in der Instanz der ClassBox gespeichert werden... wie kann ich das erreichen?

Hier der Code:
(TickFrame)
Code:
// The TickFrame class defines the structure of the top-level frame
public class TickFrame extends JFrame
{
  public TickFrame()
  {
    super("TickFrame");
    Container cp = getContentPane();

    [...]

    // Create the main panel containing the user's design
    JPanel main_panel = new JPanel();

    main_panel.addMouseMotionListener(new MouseMotionAdapter()
    {
      public void mouseDragged(MouseEvent evt)
      {
        mainPanelMouseDragged(evt);
      }
    });
    
    main_panel.addMouseListener(new MouseAdapter()
    {
      public void mouseClicked(MouseEvent evt)
      {
        mainPanelMouseClicked(evt);
      }
    });
    
    cp.add(main_panel, BorderLayout.CENTER);
    
    // Create the button panel at the side of the main panel
    JPanel button_panel = new JPanel();
    JButton add_class_button = new JButton("Add Class");
 
   add_class_button.addActionListener(new ActionListener()
    {
      public void actionPerformed(ActionEvent evt)
      {
        addClassButtonActionPerformed(evt);
      }
    });
    button_panel.add(add_class_button);
    cp.add(button_panel, BorderLayout.WEST);
    
  // Methods called from Listeners
  private void addClassButtonActionPerformed(ActionEvent evt)
  {
    ClassBox cb = new ClassBox();
  }
  
  private void mainPanelMouseDragged(MouseEvent evt)
  {
    System.out.println("Mouse drag at " + evt.getX() + "" + evt.getY());
  }
  
  int clickX;
  int clickY;
  private void mainPanelMouseClicked(MouseEvent evt)
  {
    clickX = evt.getX();
    clickY = evt.getY();
    System.out.println("Mouse click at " + clickX + "" + clickY);
  }

  // Main program entry point
  public static void main(String args[])
  {
    TickFrame tf = new TickFrame();
    tf.show();
  }
}

(ClassBox)
Code:
public class ClassBox
{

   // coordinates of top right corner of box later appearing in panel
   private int c_x;
   private int c_y;

   public ClassBox()
   {
     JFrame frame = new JFrame();
     
     // dialogs

     [...]
     
     // info to tell user to click in panel & drag mouse to create rectangular
     // representing class
     JOptionPane.showMessageDialog(frame, "Click anywhere in the panel and drag the mouse 
to create a box representing your class.");

     // mouseListener to detect where mouse clicked - safe coordinates, call
     // class to draw rectangular
     c_x = TickFrame.clickX;
   }
}


Mit dem aktuellen Code bekomm ich den Fehler "non-static variable cannot be referenced from static context". Kann mir jemand von euch helfen?

Danke... :oops:
 

Sky

Top Contributor
Du brauchst in ClassBox eine Referenenz auf ein Objekt vom Typ TickFrame (und zwar die, die Du in TickFrame erstellst)

btw: warum hast Du in beiden Klassen jeweils eine main-Methode?
 

Achtel

Mitglied
Das mit den beiden main-Methoden ist ne gute Anmerkung... ;)

Ich kann mir jetzt zwar vorstellen, was du meinst - aber wie ich den Hinweis umsetze, weiß ich eher nicht... kannst du das irgendwie an nem Code-Beispiel mal bitte zeigen?
 

Sky

Top Contributor
Achtel hat gesagt.:
Das mit den beiden main-Methoden ist ne gute Anmerkung... ;)

Ich kann mir jetzt zwar vorstellen, was du meinst - aber wie ich den Hinweis umsetze, weiß ich eher nicht... kannst du das irgendwie an nem Code-Beispiel mal bitte zeigen?
ja klar, ist ganz trivial. Hier eine nicht getestete Version:

Code:
class Test {

  public static void main( String[] args ) throws Exception {
    OutputTest o = new OutputTest( ); // Instanz erzeugen
    Test test = new Test(o); // Referenz übergeben
  }

  public Test(OutputTest theOutputTest ) {
    theOutputTest.doOutput("my Output"); // Nutzen der Referenz.
    // Bei Dir wird die Referenz auch noch in anderen Methoden
    // gebraucht, daher solltest Du diese im Konstruktor einer
    // Instanzvariablen zuweisen.
  }
}

class OutputTest {
  public OutputTest() {

  }
  
  public void doOutput(String theOutput) {
    System.out.println( theOutput );
  }
}
 

Achtel

Mitglied
Sorry, aber jetzt bin ich verwirrt... wie hilft mir das jetzt die Koordinaten ausm main panel auszulesen? ???:L
 

Sky

Top Contributor
Achtel hat gesagt.:
Sorry, aber jetzt bin ich verwirrt... wie hilft mir das jetzt die Koordinaten ausm main panel auszulesen? ???:L
Ich habe Dir ein Beispiel gezeigt, wie man mit Referenzen arbeiten kann... sorry, dass ich Dir nicht direkt deinen Code verbessert habe.

Neben einigen unschönen Dingen, hier zwei Lösungsansätze:
- ClassBox braucht das Event.
- ClassBox braucht eine Referenz auf TickFrame. TickFrame muss um eine Methode (z.B. getClickX); diese muss aufgerufen werden.

Wie das mit den Referenzen geht, siehe mein Post oben.
 

Achtel

Mitglied
Du solltest ja auch gar nicht Code verbessern ... ;) Ich glaub die Lösungsansätze helfen schon mal weiter... Was meinst du mit "unschönen Dingen"?

Und nach Nachdenken noch folgende Frage - ein Event muss ich doch über eine Komponente steuern, oder? Also ich hab z.B. n Button, Panel oder Window (oder sonst was) und kann diesen entsprechende Listener zuweisen... Die Klasse ClassBox hingegen hat ja keine Komponenten, sondern fragt nur Infos ab, die gespeichert werden sollen... womit verknüpf ich dann also den Listener? ???:L

Ich habe jetzt mal ein paar Änderungen übernommen...

(class TickFrame - ausgewählte, geänderte Methoden)
Code:
private void addClassButtonActionPerformed(ActionEvent evt)
  {
    System.out.println("Add a Class");
    ClassBox cb = new ClassBox(this);
  }

// get coordinates from mouse click - kann man 2 returnwerte innerhalb
// einer Methode definieren und somit die beiden Methoden zusammenfassen?
  public int getClickX()
  {
    return clickX;
  }
  public int getClickY()
  {
    return clickY;
  }

(class ClassBox - Auszug aus Konstruktor)
Code:
public ClassBox(TickFrame tickfrm)
{
// mouseListener to detect where mouse clicked - safe coordinates, call
     // class to draw rectangular
     c_x = tickfrm.getClickX();
     c_y = tickfrm.getClickY();
     System.out.print("c_x = "+ c_x + "and c_y = "+ c_y);
}

Das Problem jetzt ist, dass ich schon vor dem Mausklick die Ausgabe bekomme "c_x = 0 and c_y = 0" - die Variablen werden also mit Instantierwert 0 ausgegeben und nicht upgedatet - das wird wohl daran liegen, dass ClassBox das Event nicht hat??? Wo wir wieder bei meiner obigen Frage wären... ;) Vielen Dank für deine Hilfe...
 

Sky

Top Contributor
Zeile 6: ClassBox cb = new ClassBox(tickf); ändern in ClassBox cb = new ClassBox(this);

Zeile 5 kann dann gelöscht werden
 
G

Guest

Gast
Also es geht im Prinzip darum einen Editor zu erstellen, in dem man UML-Diagramme und deren Beziehungen abbilden kann... für jede neue Klasse, die dargestellt wird, soll eine entsprechende Box im mainPanel erscheinen - da brauch ich doch dann pro Box eine neue Instanz, oder?

Und kannst du mir gerade noch einen Hinweis geben was die Eventzuordnung zur ClassBox angeht?
 

Sky

Top Contributor
in addClassButtonActionPerformed hast Du ein ActionEvent. Dieses musst Du der ClassBox als Parameter im Konstruktor mitgeben.
 

Achtel

Mitglied
Ich bekomm die Fehlermeldung: "cannot find symbol" bei folgendem Code:

(Methode, die Event übergeben soll)
Code:
private void addClassButtonActionPerformed(ActionEvent evt)
  {
    System.out.println("Add a Class");
    ClassBox cb = new ClassBox(this,evt);
  }

(Konstruktor)
Code:
public ClassBox(TickFrame tickfrm,ActionEvent evt)

Ist die Übergabe im Prinzip falsch, oder woran hapert's?
 

Sky

Top Contributor
Da Du dich innerhalb des ActionListeners befindet, ist 'this' ein ActionListener und kein TickFrame. Hier die Lösung:
Code:
ClassBox cb = new ClassBox(TickFrame.this,evt);
 

Achtel

Mitglied
Den Fehler krieg ich aber immer noch...

public ClassBox(TickFrame tickfrm, ActionEvent evt)
cannot find symbol

Was ist falsch?

Edit: Ich hab in ClassBox vergessen die Awt.Event Library zu importieren... [schild=1 fontcolor=000000 shadowcolor=C0C0C0 shieldshadow=1]*dumm*[/schild]

Trotzdem ändert das nichts daran, dass ich immer noch automatisch c_x = 0 und c_y = 0 bekomm - noch bevor ich geklickt habe... :bahnhof:
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
RedEagle Swing Messwerte mit GUI verarbeiten, Klassenübergreifend AWT, Swing, JavaFX & SWT 4
M Swing Panel klassenübergreifend ändern AWT, Swing, JavaFX & SWT 6
H JDialog, Modal - Klassenübergreifend => Problem AWT, Swing, JavaFX & SWT 5
D Methode Graphics g klassenübergreifend nutzen. AWT, Swing, JavaFX & SWT 3
H Viele ActionListener (MouseListener) - Performance AWT, Swing, JavaFX & SWT 24
ExceptionOfExpectation MouseListener-Objekte zu den Graphics-Objekten einfügen AWT, Swing, JavaFX & SWT 3
R Punkt von MouseListener hat falsche Koordinate AWT, Swing, JavaFX & SWT 2
J MouseListener wird nicht ausgeführt. AWT, Swing, JavaFX & SWT 4
S Swing Rechteck über JTable zeichnen (per MouseListener) AWT, Swing, JavaFX & SWT 1
G vorgefertigte Buttons oder neue Komponente mit MouseListener? AWT, Swing, JavaFX & SWT 0
F ListCellRenderer mit JLabel und MouseListener AWT, Swing, JavaFX & SWT 4
D Event Handling MouseListener funktioniert seit Java 8 nicht mehr AWT, Swing, JavaFX & SWT 13
M MouseListener auf table oder scrollPane AWT, Swing, JavaFX & SWT 11
B Event Handling MouseListener Behält seine Variablen, auch wenn ich ein neus Objekt erstelle AWT, Swing, JavaFX & SWT 2
D Swing &MouseListener in einem JFrame, sinnig? AWT, Swing, JavaFX & SWT 11
U MouselIstener zu JFrame AWT, Swing, JavaFX & SWT 6
F Swing MouseListener im JPanel AWT, Swing, JavaFX & SWT 3
J Swing Button mit JTable und MouseListener AWT, Swing, JavaFX & SWT 8
F JPanel + MouseListener AWT, Swing, JavaFX & SWT 5
JavaInBrain Swing Rückgabe aus MouseListener-Klasse AWT, Swing, JavaFX & SWT 3
A SWT SWT Scale und MouseListener AWT, Swing, JavaFX & SWT 7
J MouseListener und rechte Maustaste AWT, Swing, JavaFX & SWT 3
R MouseListener auf JPanel AWT, Swing, JavaFX & SWT 3
Q Swing MouseListener auf JTable geht nicht AWT, Swing, JavaFX & SWT 2
J Swing Einbau MouseListener in JPanel AWT, Swing, JavaFX & SWT 3
N Mit MouseListener X-Y Angaben vom Bild erfahren AWT, Swing, JavaFX & SWT 3
T MouseListener an Ecken von Polygonen hinzufügen AWT, Swing, JavaFX & SWT 5
H Swing JPanel in JTable mit MouseListener AWT, Swing, JavaFX & SWT 3
A Individueller MouseListener ? AWT, Swing, JavaFX & SWT 7
B MouseListener im Renderer einer JComboBox AWT, Swing, JavaFX & SWT 3
P AWT MouseListener unklare abhandlung von Events AWT, Swing, JavaFX & SWT 3
M MouseListener/MouseMotionListener AWT, Swing, JavaFX & SWT 2
njans SWT MouseListener exited AWT, Swing, JavaFX & SWT 4
danx066 MouseListener macht was er will AWT, Swing, JavaFX & SWT 14
K MouseListener für Objekte auf einem Frame AWT, Swing, JavaFX & SWT 4
P JLabel Farbe/Bild ändern aus MouseListener heraus AWT, Swing, JavaFX & SWT 3
U Swing Generierung mehrerer Kreise per MouseListener AWT, Swing, JavaFX & SWT 16
Semox Swing JApplet: Problem MouseListener Anmeldung AWT, Swing, JavaFX & SWT 3
C JTappedPane Mouselistener auf Überschrift Registerkarte AWT, Swing, JavaFX & SWT 2
M MouseListener AWT, Swing, JavaFX & SWT 3
K AWT MouseListener linke und rechte Maustaste AWT, Swing, JavaFX & SWT 5
C Swing MouseListener Doppelklick-Geschwindigkeit AWT, Swing, JavaFX & SWT 4
N Swing MouseListener in JTable AWT, Swing, JavaFX & SWT 4
1 Eigene JComponent mit MouseListener versehen AWT, Swing, JavaFX & SWT 10
Developer_X AWT Component added keinen MouseListener AWT, Swing, JavaFX & SWT 7
R MouseListener wird nicht aufgerufen AWT, Swing, JavaFX & SWT 3
P JComboBox und MouseListener AWT, Swing, JavaFX & SWT 2
W MouseListener im editable ComboBox AWT, Swing, JavaFX & SWT 14
raptorrs Swing MouseListener reagiert nicht auf Instanz einer JTable AWT, Swing, JavaFX & SWT 6
multiholle Swing Mouselistener auf Parentpanel immer aktiv AWT, Swing, JavaFX & SWT 7
C MouseListener und ActionListener kombinieren AWT, Swing, JavaFX & SWT 17
M Komponenten einer unbestimmten Anzahl und MouseListener AWT, Swing, JavaFX & SWT 4
A MouseListener funktionert nie AWT, Swing, JavaFX & SWT 12
C Probleme mit Größe und mit MouseListener AWT, Swing, JavaFX & SWT 2
W MouseListener für jede Zelle einer JTable AWT, Swing, JavaFX & SWT 4
E MouseListener Problem AWT, Swing, JavaFX & SWT 4
D jButton mit ImageIcon & MouseListener AWT, Swing, JavaFX & SWT 5
S MouseListener zurückverfolgung auf element. AWT, Swing, JavaFX & SWT 7
B MouseListener / doppelklick geht net AWT, Swing, JavaFX & SWT 16
M JCheckBox Standard MouseListener entfernen AWT, Swing, JavaFX & SWT 13
hdi Wie mach ich diesen MouseListener AWT, Swing, JavaFX & SWT 4
G MouseListener & KeyListener AWT, Swing, JavaFX & SWT 4
H JComboBox reagiert nicht auf MouseListener AWT, Swing, JavaFX & SWT 5
2 Mouselistener AWT, Swing, JavaFX & SWT 2
W MouseListener, getClickCount und Doppelklick AWT, Swing, JavaFX & SWT 6
S swing komponenten mit mouselistener rotieren AWT, Swing, JavaFX & SWT 15
G JFrame,JLabel,MouseListener AWT, Swing, JavaFX & SWT 6
F Wie MouseListener bei TableModel anmelden? AWT, Swing, JavaFX & SWT 3
V Frage zu MouseListener --> mousePressed() AWT, Swing, JavaFX & SWT 5
C MouseListener für Spalte eines JTables AWT, Swing, JavaFX & SWT 4
K Problem mit 2 MouseListener. AWT, Swing, JavaFX & SWT 3
M MouseMotionListener oder mouseListener AWT, Swing, JavaFX & SWT 6
T JComboBox und MouseListener AWT, Swing, JavaFX & SWT 11
F MouseListener - Unhandled IOException AWT, Swing, JavaFX & SWT 5
padde479 Statusleiste mit MouseListener aktualisieren AWT, Swing, JavaFX & SWT 3
L Problem mit MouseListener, AdjustmentListener AWT, Swing, JavaFX & SWT 6
T MouseListener Problem AWT, Swing, JavaFX & SWT 3
F Mouselistener wird wiederholt aufgerufen AWT, Swing, JavaFX & SWT 3
G Frage zu MouseListener und speichern des Wertes (reflektion? AWT, Swing, JavaFX & SWT 6
B frage zu MouseListener AWT, Swing, JavaFX & SWT 5
O MouseListener - Wert-Übergabe AWT, Swing, JavaFX & SWT 3
W JPanel, JLabel und MouseListener -> auf clicks reagieren AWT, Swing, JavaFX & SWT 5
S MouseListener auf einem einzelnen Tab setzen AWT, Swing, JavaFX & SWT 3
B MouseListener & Fenster schliessen AWT, Swing, JavaFX & SWT 3
G MouseListener AWT, Swing, JavaFX & SWT 4
G Tooltip sperrt MouseListener? AWT, Swing, JavaFX & SWT 6
S JComboBox und MouseListener AWT, Swing, JavaFX & SWT 5
D Koordinaten der Bildschirmposition auslesen (MouseListener?) AWT, Swing, JavaFX & SWT 7
N "globaler" MouseListener (+MouseMotionListener) AWT, Swing, JavaFX & SWT 4
M ToolTipText für JTable mit MouseListener ohne anklicken? AWT, Swing, JavaFX & SWT 7
A MouseListener auf Bild legen ? AWT, Swing, JavaFX & SWT 16
S Mouselistener erzeugt kein Event in einem Menuitem AWT, Swing, JavaFX & SWT 2
J MouseListener AWT, Swing, JavaFX & SWT 3
A JPanels in JPanel und MouseListener AWT, Swing, JavaFX & SWT 3
C Mehrere MouseListener? AWT, Swing, JavaFX & SWT 7
U Keylistener und Mouselistener AWT, Swing, JavaFX & SWT 2
L Event-handling, MouseListener AWT, Swing, JavaFX & SWT 5
T Problem mit MouseListener bei JButton AWT, Swing, JavaFX & SWT 5
K mein keyListener scheint Konflict haben mit mouseListener AWT, Swing, JavaFX & SWT 6
G Problem mit MouseListener AWT, Swing, JavaFX & SWT 9

Ähnliche Java Themen

Neue Themen


Oben