2017-04-02 64 views
1

如果我的問題聽起來很愚蠢,我很抱歉,我還是Java新手。我要告訴你這段代碼:如何添加一個mouselistener在JFrame的其他事物之下?

public class Window extends JFrame{ 


    private static final long serialVersionUID = -2139430787087799923L; 

    private TransparentJPanel mousepanel; 

    public Window(int width, int height, String title, Game game) { 
     super(title); 
     HandlerClass handler = new HandlerClass(); 
     mousepanel = new TransparentJPanel(); 
     mousepanel.addMouseListener(handler); 

     setPreferredSize(new Dimension(width,height)); 
     setMaximumSize(new Dimension(width,height)); 
     setMinimumSize(new Dimension(width,height)); 
     setDefaultCloseOperation(EXIT_ON_CLOSE); 
     setResizable(false); 

     setVisible(true); 
     add(game);  <-- here I add the game 
     add(mousepanel); <-- here I add the panel with the mouselistener 
     game.start(); 
    } 
} 

的TransparentJPanel類:

private class TransparentJPanel extends JPanel { 
    private static final long serialVersionUID = 8855609189172945035L; 

    TransparentJPanel() { 
     super() ; 
     this.setOpaque(false) ; 
     this.setLayout(null) ; 
    } 
} 

當我第一次加入遊戲,遊戲顯示了和鼠標偵聽器不工作,但當我首先添加jpanel時,遊戲不會顯示,但是mouselistener起作用。 這裏是我的HandlerClass類:

private class HandlerClass implements MouseListener { 
    public void mouseClicked(MouseEvent event) { 
     System.out.println(String.format("Clicked at %d,%d", event.getX(), event.getY())); 
    } 

    public void mouseEntered(MouseEvent e) { 
     int x = e.getX(); 
     int y = e.getY(); 
     System.out.println("Mouse Entered frame at X: " + x + " - Y: " + y); 

    } 
    public void mouseExited(MouseEvent e) { 
     int x = e.getX(); 
     int y = e.getY(); 
     System.out.println("Mouse Exited frame at X: " + x + " - Y: " + y); 

    } 
    public void mousePressed(MouseEvent e) { 
     int x = e.getX(); 
     int y = e.getY(); 
     System.out.println("Mouse Pressed frame at X: " + x + " - Y: " + y); 

    } 

    public void mouseReleased(MouseEvent e) { 
     int x = e.getX(); 
     int y = e.getY(); 
     System.out.println("Mouse Released at X: " + x + " - Y: " + y); 

    } 

} 

所以,這是我的問題。 請幫忙。

+0

是'遊戲'一個JPanel類嗎? –

+0

號遊戲是遊戲循環等可運行的類下面是Game.java的全碼:https://pastebin.com/cpsMSMxY –

+0

'JFrame'使用'默認情況下,只允許單個組件BorderLayout'一次顯示在5個可用位置之一。你有什麼理由需要分開面板嗎?讓遊戲面板充當「MouseListener」是否更合乎邏輯? – MadProgrammer

回答

0

解決方案結果很簡單!的

,而不是創建的鼠標監聽器面板,可以將MouseListener的加入到遊戲中的對象,即如下

public Window(int width, int title, String title, Game game) { 
    super(title); 
    HandlerClass handler = new HandlerClass(); 

    setPreferredSize(new Dimension(width,height)); 
    setMaximumSize(new Dimension(width,height)); 
    setMinimumSize(new Dimension(width,height)); 
    setDefaultCloseOperation(EXIT_ON_CLOSE); 
    setResizable(false); 

    setVisible(true); 
    add(game, BorderLayout.CENTER); 
    game.addMouseListener(handler);  
    game.start(); 
} 

希望這有助於!

+0

感謝您的回答,但它仍然無法正常工作。當我啓動它時,只顯示一個灰色屏幕,但是mouselistener起作用。當我切換它們時,顯示遊戲,但是mouselistener一開始只工作了一秒,因爲我在控制檯看到鼠標進入了框架。 –

+0

在這種情況下,我建議將遊戲畫布包裝在JPanel中,並將兩個面板(遊戲面板和鼠標面板)添加到框架中。 –

+0

你是什麼意思?你可以解釋嗎? im kinnda new –

相關問題