2016-12-28 38 views
1

我寫了這個實施mouseinputlistener方法怎麼去上的MouseEvent一個JFrame

public void mouseDragged(MouseEvent e){ 
    Pion c = (Pion)e.getSource(); 
    c.setBounds(e.getX() + c.getX(), e.getY() + c.getY(), 30, 30); 

} 

,我在課堂上這是JFrame的擴展實現內部發生的元素的引用,它包含一個網格佈局不同的組件:JPanel和一些面板包含Jbutton將

我需要的是,讓我對發生事件是否是一個JPanelJButton組件的引用的方法。

我嘗試用e.getSource,但顯然這是行不通的,代碼編譯,但我得到一個異常說「高原(即當前延伸JFrame類)不能被澆鑄成介子(即一個類擴展爲JButton)「每當我在組件上拖動鼠標

我試圖實現MouseInputListener擴展組件(Pion和其他)的每個類,但我需要在JFrame比例上執行操作,不允許這樣做。

這裏的例外,我得到:

java.lang.ClassCastException: PlateauColorLine cannot be cast to javax.swing.JPanel 
at PlateauColorLine.mouseDragged(PlateauColorLine.java:299) 
at java.awt.Component.processMouseMotionEvent(Component.java:6564) 
at java.awt.Component.processEvent(Component.java:6285) 
at java.awt.Container.processEvent(Container.java:2229) 
at java.awt.Window.processEvent(Window.java:2022) 
at java.awt.Component.dispatchEventImpl(Component.java:4872) 
at java.awt.Container.dispatchEventImpl(Container.java:2287) 
at java.awt.Window.dispatchEventImpl(Window.java:2719) 
at java.awt.Component.dispatchEvent(Component.java:4698) 
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:747) 
at java.awt.EventQueue.access$300(EventQueue.java:103) 
at java.awt.EventQueue$3.run(EventQueue.java:706) 
at java.awt.EventQueue$3.run(EventQueue.java:704) 
at java.security.AccessController.doPrivileged(Native Method) 
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:77) 
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:87) 
at java.awt.EventQueue$4.run(EventQueue.java:720) 
at java.awt.EventQueue$4.run(EventQueue.java:718) 
at java.security.AccessController.doPrivileged(Native Method) 
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:77) 
at java.awt.EventQueue.dispatchEvent(EventQueue.java:717) 
at org.GNOME.Accessibility.AtkWrapper$5.dispatchEvent(AtkWrapper.java:697) 
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:242) 
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:161) 
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:150) 
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:146) 
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:138) 
at java.awt.EventDispatchThread.run(EventDispatchThread.java:91) 

`

+0

你是否已經嘗試將對象轉換爲一個JPanel? – ZeusNet

+0

是的,同樣的事情。 –

+0

你可以請把異常堆棧跟蹤到這個問題 – ZeusNet

回答

0

希望,這將有助於

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

class Pion extends JButton 
{ 
    public Pion (String title) 
    { 
     super(title); 
     addMouseListener(new MouseListnerAdapter()); 
    } 
} 

class MouseListnerAdapter extends MouseAdapter 
{ 
    @Override 
    public void mousePressed(MouseEvent e) { 
     Object o = e.getSource(); 

     if(o instanceof JButton) 
     { 
      JButton b = (JButton) o; 
      b.setBounds(e.getX() + b.getX(), e.getY() + b.getY(), 30, 30); 
     } 
    } 
}; 


public class Test extends JFrame { 
    public Test() 
    { 
     super("Test");   
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setLayout(new GridLayout(2,1)); 


     JPanel p1 = new JPanel(); 
     Pion pb1 = new Pion("button1"); 
     p1.add(pb1); 
     add(p1); 

     JPanel p2 = new JPanel(); 
     Pion pb2 = new Pion("button2"); 
     p2.add(pb2); 
     add(p2);   

     pack(); 
     setSize(240, 240); 
     setLocationByPlatform(true); 
     setVisible(true); 
     addMouseListener(new MouseListnerAdapter()); 

    } 

    public static void main(String[] args)throws Exception 
    { 
     new Test(); 
    } 
} 
+0

試過了,如果條件似乎永遠不會得到滿足。 –

+0

試過了,如果條件似乎永遠不會得到滿足,我添加了另一個if block來嘗試:if(o instanceofCurrentClass){System.out.println(...);}這是唯一的代碼塊執行。所以作爲一個結論e.getSource()總是會返回一個當前類的對象的引用,我猜,addmouselistener()方法已被調用。所以我仍然不知道如何獲得對特定組件的引用。非常感謝tho :) –

0
java.lang.ClassCastException: PlateauColorLine cannot be cast to javax.swing.JPanel 

事件的來源是JPanel的,因爲你添加的MouseListener到面板。

如果你想在面板的該位置的按鈕,然後你需要搜索面板在面板上的位置找到該組件。

喜歡的東西:

JPanel panel = (JPanel)e.getSource(); 
Component c = panel.getComponentAt(e.getPoint()); 

if (c != null) 
    Pion p = (Pion)c; 
+0

getComponentAt(....)方法採用哪個座標作爲參數,是getXOnScreen(),getYOnScreen()座標還是相對於事件發生的地方? –