2016-12-07 29 views
0

有在屏幕的頂部的透明JPanel和背景JPanel並添加到其上的JButton(全是可見的並且具有鼠標聽衆)調度鼠標事件到最深可見的JComponent

在處理鼠標事件後透明面板的聽衆,他們應該被分派到下一個更深的組件(即背景面板或其按鈕)

點擊背景面板是好的,但點擊按鈕導致不需要的ClassCastException

例如:

//making frame 
frame=new JFrame(); 
frame.setVisible(true); 

//making layered pane 
layeredPane = new JLayeredPane(); 
frame.add(layeredPane); 


//transparent panel on top 
frontPanel = new JPanel(); 
frontPanel.setOpaque(false); 
layeredPane.add(frontPanel,Integer.valueOf(1)); 

//background panel containing a button 
backPanel = new JPanel(); 
JButton button = new JButton(); 
backPanel.add(button); 
layeredPane.add(backPanel,Integer.valueOf(0)); 

//listeners 
button.addMouseListener(new MouseListener()...a blank listener...); 
backPanel.addMouseListener(new MouseListener()...a blank listener...); 
frontPanel.addMouseListener(new MouseListener() { 
    @Override 
    public void mouseClicked(MouseEvent e) { 
     SwingUtilities.getDeepestComponentAt(backPanel, e.getX(), e.getY()).dispatchEvent(e); 
    } 

    @Override 
    public void mousePressed(MouseEvent e) { 
     SwingUtilities.getDeepestComponentAt(backPanel, e.getX(), e.getY()).dispatchEvent(e); 
    } 

    @Override 
    public void mouseReleased(MouseEvent e) { 
     SwingUtilities.getDeepestComponentAt(backPanel, e.getX(), e.getY()).dispatchEvent(e); 
    } 

    @Override 
    public void mouseEntered(MouseEvent e) { 
    } 

    @Override 
    public void mouseExited(MouseEvent e) { 
    } 
}); 

//setting dimensions 
Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); 
frontPanel.setSize(screenSize); 
backPanel.setSize(screenSize); 
frame.setSize(screenSize); 
//now clicking on the button cause a ClassCastException: JPanel cannot be cast to javax.swing.AbstractButton. why? 

回答

1

你不能只是分派舊事件。舊的事件包含關於原始事件(即,該成分源)的信息。

你需要派遣之前創建一個新的MouseEvent

例如看到從Swing教程GlassPaneDemoHow to Use Root Panes