2016-07-04 46 views
1

在我的课中,我想添加到主要JPanel其他JPanel对象在子类中创建,并捕获鼠标事件,知道obj如何生成它。 我尝试通过创建一个子类DoSquare(JPanel扩展),添加监听器,创建objs并绘制该子类的图形,但是当我运行程序并单击其中一个DoSquare obj创建时,e.getSource()总是返回SubObj对象代替点击的元素。 我如何区分听众事件中选定的组件?来自子类的Java陷阱事件obj

这里我的代码:

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) {} 
} 

} 

在此先感谢

AM

回答

2

在你SubObj类的构造函数,你应该做的:

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

并删除squareLis变量你的DoSquare c姑娘。

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; 
     } 
    } 
} 

我上面写的代码就相当于你想达到什么,和它的工作您想要的方式。我不使用你的代码,因为我不确定你到底想要什么。我的代码用于演示两个子面板如何在点击时响应鼠标事件,这是我们关注此问题的焦点。

+0

嗨,谢谢你的回复,我尽量改变听众的建议,但结果不会改变。 – AleMal

+0

@almal它的工作原理,尝试我更新的代码。 –

+0

太棒了,它的工作!再次感谢 – AleMal