2014-05-21 17 views
1

我在幾小時前問了一個模糊問題,並希望這個描述能夠說清楚。點擊操作或拖動操作後如何知道釋放偵聽器是否被觸發?

import java.awt.BorderLayout; 
import java.awt.Dimension; 
import java.awt.Font; 
import java.awt.Graphics; 
import java.awt.event.InputEvent; 
import java.awt.event.MouseAdapter; 
import java.awt.event.MouseEvent; 
import java.awt.event.MouseListener; 

import javax.swing.JFrame; 
import javax.swing.JOptionPane; 
import javax.swing.JPanel; 




public class TestMouseEvent { 
    public void createUI(){ 
     JFrame frame = new JFrame("Test Mouse Event"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setResizable(false); 
     MainPanel mainPanel = new MainPanel(); 

     mainPanel.setPreferredSize(new Dimension(800, 600)); 
     mainPanel.addMouseListener(new ImageMouseListener()); 
     mainPanel.addMouseMotionListener(new ImageMouseAdapter()); 

     frame.add(mainPanel,BorderLayout.CENTER); 
     frame.pack(); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     TestMouseEvent testMouseEvent = new TestMouseEvent(); 
     testMouseEvent.createUI(); 
    } 

    @SuppressWarnings("serial") 
    class MainPanel extends JPanel{ 
     protected void paintComponent(Graphics g){ 
      super.paintComponent(g); 
      g.setFont(new Font("Arial", Font.PLAIN, 20)); 
      g.drawString("I'm a panel and I'm being listened now", 200, 300); 
     } 
    } 

    class ImageMouseListener implements MouseListener{ 

     @Override 
     public void mouseClicked(MouseEvent e) { 
      // TODO Auto-generated method stub 
      System.out.println("clicked"); 
     } 

     @Override 
     public void mousePressed(MouseEvent e) { 
      // TODO Auto-generated method stub 
      System.out.println("pressed"); 
     } 

     @Override 
     public void mouseReleased(MouseEvent e) { 
      // TODO Auto-generated method stub 
      System.out.println("released");  
      JOptionPane.showMessageDialog(null, "I only want to be showed when \"drag\" event over but not for click event!"); 
     } 

     @Override 
     public void mouseEntered(MouseEvent e) { 
      // TODO Auto-generated method stub 

     } 

     @Override 
     public void mouseExited(MouseEvent e) { 
      // TODO Auto-generated method stub 

     } 


    } 

    class ImageMouseAdapter extends MouseAdapter{  
     public void mouseDragged(MouseEvent e){ 
      if (e.getModifiers() == InputEvent.BUTTON1_MASK) { 
       System.out.println("dragged");    
      } 
     } 
    } 
} 

我只想在拖動操作後顯示JOptionPane,但不是點擊操作。所以我怎麼能知道區別?

+0

其實你可以嘗試使用的DnD API – MadProgrammer

回答

1

首先,統一的MouseListenerMouseMotionListener成一個類,你可以簡單地通過使用MouseAdapter做到這一點...

二,添加一個實例變量作爲一個標誌,指示,如果拖曳操作正在地方...

class ImageMouseListener extends MouseAdapter { 

    private boolean isDragging = false; 

    @Override 
    public void mouseClicked(MouseEvent e) { 
     // TODO Auto-generated method stub 
     System.out.println("clicked"); 
    } 

    @Override 
    public void mouseReleased(MouseEvent e) { 
     // TODO Auto-generated method stub 
     if (isDragging) { 
      System.out.println("released"); 
      JOptionPane.showMessageDialog(null, "I only want to be showed when \"drag\" event over but not for click event!"); 
     } 
     isDragging = false 
    } 

    public void mouseDragged(MouseEvent e) { 
     if (e.getModifiers() == InputEvent.BUTTON1_MASK) { 
      isDragging = true; 
      System.out.println("dragged"); 
     } 
    } 
} 

創建ImageMouseListener的單個實例,並將其添加爲mouseListenermouseMotionListener您的面板...

ImageMouseListener handler = new ImageMouseListener(); 
mainPanel.addMouseListener(handler); 
mainPanel.addMouseMotionListener(handler); 

你可以考慮使用Java中內的內置支持中拖放,取決於你想要達到的目標,例如,看看Java - How to drag and drop JPanel with its components

+0

感謝您的詳盡答案,它的工作原理。 – Gearon

+0

使一個很好的變化(它工作);) – MadProgrammer

3

在你的ImageMouseAdapter中設置一個標誌(讓我們命名,如果dragInProgressFlag)爲true。在釋放時檢查標誌。如果它是真的,則顯示JOptionPane並將其重置爲false。

+0

它的工作原理並感謝你。 – Gearon

相關問題