2016-07-04 11 views
1

In meiner Klasse möchte ich JPANel andere Mainstream JPanel obj dynamisch innerhalb einer Unterklasse erstellt und Trap-Maus Ereignisse genau wissen, ob sie es erzeugen. Ich versuche, dies zu tun, indem ich eine Unterklasse DoSquare (JPanel erweitern), Listener, erstellen Objs und zeichnen Grafiken dieser Unterklasse, aber wenn ich Programm und klicken Sie auf eine der DoSquare Obj erstellt, die e.getSource() immer zurück das SubObj-Objekt anstelle des angeklickten Elements. Wie kann ich die in Listener-Events ausgewählte Komponente genau unterscheiden?Java-Trap-Ereignisse aus Subklassen Obj

Hier mein Code:

import javax.swing.*; 
import java.awt.*; 
import java.awt.event.*; 

public class SubObj extends JPanel { 

Listener listener = new Listener(); 
DoSquare firstQ = new DoSquare(100, 50); 
DoSquare secondQ = new DoSquare(200, 70); 

public static void main(String[] args) { 

    JFrame panel = new JFrame(); 
    SubObj content = new SubObj(); 
    panel.setContentPane(content); 
    panel.setFocusable(true); 
    panel.setSize(400, 400); 
    panel.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    panel.setVisible(true); 

} 

SubObj() { 
    addMouseListener(listener); 
    addFocusListener(listener); 

} 

public void paintComponent(Graphics g) { 
    super.paintComponent(g); 


    firstQ.draw(g, Color.BLACK); 
    secondQ.draw(g, Color.CYAN); 
} 

private class DoSquare extends JPanel { 

    private int coordX; 
    private int coordY; 
    Listener squareLis = new Listener(); 

    DoSquare(int X, int Y) { 
     addMouseListener(squareLis); 
     addFocusListener(squareLis); 
     coordX = X; 
     coordY = Y; 
    } 

    void draw(Graphics g, Color c) { // Draw the square 

     g.setColor(c); 
     g.fillRect(coordX, coordY, 50, 50); 
    } 


} 

public class Listener implements MouseListener, FocusListener { 
    public void mouseClicked(MouseEvent e) {} 
    public void mouseEntered(MouseEvent e) {} 
    public void mouseExited(MouseEvent e) {} 
    public void mousePressed(MouseEvent e) { 
     System.out.println(e.getSource()); 

    } 
    public void mouseReleased(MouseEvent e) {} 

    public void focusGained(FocusEvent e) {} 
    public void focusLost(FocusEvent e) {} 
} 

} 

Vielen Dank im Voraus

AM

Antwort

2

In Ihrem SubObj Klasse Konstruktor, sollten Sie tun:

SubObj() { 
    firstQ.addMouseListener(listener); 
    secondQ.addFocusListener(listener); 
} 

und löschen Sie die squareLis Variable in Ihre DoSquare c Mädel.

UPDATE

public class SubObj extends JPanel { 

    public static void main(String[] args) { 

     SwingUtilities.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       JFrame frame = new JFrame(); 
       SubObj content = new SubObj(); 
       frame.setContentPane(content); 
       frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 
       frame.pack(); 
       frame.setVisible(true); 
      } 
     }); 
    } 

    SubObj() { 
     MouseAdapter mouseAdapter = new MouseAdapter() { 
      @Override 
      public void mouseClicked(MouseEvent e) { 
       System.out.println(e.getSource()); 
       System.out.println("click from " + ((TestPanel) e.getSource()).getId()); 
      } 
     }; 

     JPanel testPanel1 = new TestPanel("1"); 
     testPanel1.setPreferredSize(new Dimension(200, 200)); 
     testPanel1.setBackground(Color.BLACK); 
     testPanel1.addMouseListener(mouseAdapter); 
     add(testPanel1); 

     JPanel testPanel2 = new TestPanel("2"); 
     testPanel2.setPreferredSize(new Dimension(100, 100)); 
     testPanel2.setBackground(Color.RED); 
     testPanel2.addMouseListener(mouseAdapter); 
     add(testPanel2); 
    } 

    private class TestPanel extends JPanel { 
     private String id; 

     TestPanel(String id) { 
      this.id = id;  
     } 

     public String getId() { 
      return id; 
     } 
    } 
} 

Der Code, den ich oben ist äquivalent geschrieben, was Sie erreichen wollen, und es hat funktioniert, wie Sie wollen. Ich benutze deinen Code nicht, da ich nicht sicher bin, was genau du willst. Mein Code zeigt, wie zwei Sub-Panels auf Mausereignisse reagieren, wenn sie angeklickt werden. Das ist unser Fokus für dieses Problem.

+0

Hallo danke für deine Antwort, ich versuche, den Hörer zu ändern, wie Sie vorschlagen, aber das Ergebnis nicht ändern. – AleMal

+0

@almal Es funktioniert, versuche meinen aktualisierten Code. –

+0

Großartig, es funktioniert! Danke noch einmal – AleMal