2010-06-27 49 views
1

我試圖做一個JFrame上出現的mousePressed 位置,但我一直沒有和它得到的煩人:(任何想法是不工作?的JFrame沒有出現在鼠標點擊的位置(包括SSCCE)

import java.awt.BorderLayout; 
import java.awt.Dimension; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.awt.event.MouseAdapter; 
import java.awt.event.MouseEvent; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 

public class SSCCE 
{ 

    @SuppressWarnings("static-access") 
    public static void getInputData() 
    { 
     final JFrame frame = new JFrame(); 
     frame.setDefaultCloseOperation(frame.DISPOSE_ON_CLOSE); 
     JLabel emptyLabel = new JLabel("Test"); 
     frame.getContentPane().add(emptyLabel, BorderLayout.CENTER); 
     frame.setSize(new Dimension(375, 100)); 

     MouseAdapter ml = new MouseAdapter() 
     { 

      @Override 
      public void mousePressed(MouseEvent me) 
      { 

       frame.setLocation(me.getX(), me.getY()); 
      } 

      @Override 
      public void mouseDragged(MouseEvent me) 
      { 
       frame.setLocation(me.getX(), me.getY()); 
      } 
     }; 
     frame.getContentPane().addMouseListener(ml); 
     frame.getContentPane().addMouseMotionListener(ml); 

     frame.setVisible(true); 

    } 

    public static void main(String args[]) 
    { 
     JFrame test = new JFrame(); 
     JButton but = new JButton("Click me"); 
     but.addActionListener(
       new ActionListener() 
       { 

        public void actionPerformed(ActionEvent e) 
        { 
         getInputData(); 
        } 
       }); 
     test.getContentPane().add(but, BorderLayout.CENTER); 
     test.setSize(500, 500); 
     test.setVisible(true); 


    } 
} 
+1

我很困惑。鼠標監聽器位於第二幀。似乎爲我工作(雖然PL&F將有權停止從標籤冒泡的鼠標事件)。 – 2010-06-27 12:51:45

+0

是啊,我的壞,我沒有說清楚我的意思。當我在帖子中編輯時,我希望新框架的位置位於mousePressed位置。 – kxk 2010-06-27 13:03:39

回答

2

使用SwingUtilities方法convertPointToScreen()convertPointFromScreen()改造MouseEvent座標

附錄:另外,計算出抵消getLocationOnScreen(),這是「在屏幕座標空間中組件左上角。「

附錄:要將新框架相對於原始鼠標單擊進行定位,請將鼠標偵聽器添加到父框架而不是按鈕;使用座標來定位新框架,如下所示。

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

public class SSCCE { 

    public static void getInputData(MouseEvent e) { 
     final JFrame frame = new JFrame(); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     JLabel emptyLabel = new JLabel("Test", JLabel.CENTER); 
     frame.getContentPane().add(emptyLabel, BorderLayout.CENTER); 
     frame.setPreferredSize(new Dimension(375, 100)); 

     MouseAdapter ma = new MouseAdapter() { 

      Point local, global; 
      Point delta = new Point(); 

      @Override 
      public void mousePressed(MouseEvent me) { 
       local = me.getPoint(); 
      } 

      @Override 
      public void mouseDragged(MouseEvent me) { 
       delta.setLocation(
        me.getX() - local.x, me.getY() - local.y); 
       global = frame.getLocationOnScreen(); 
       global.setLocation(
        global.x + delta.x, global.y + delta.y); 
       frame.setLocation(global.x, global.y); 
      } 
     }; 
     frame.getContentPane().addMouseListener(ma); 
     frame.getContentPane().addMouseMotionListener(ma); 
     frame.pack(); 
     frame.setLocation(e.getLocationOnScreen()); 
     frame.setVisible(true); 
    } 

    public static void main(String args[]) { 
     JFrame frame = new JFrame(); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setPreferredSize(new Dimension(640, 480)); 
     frame.add(new JLabel("Click me", JLabel.CENTER)); 
     frame.addMouseListener(new MouseAdapter() { 

      @Override 
      public void mousePressed(MouseEvent e) { 
       getInputData(e); 
      } 
     }); 
     frame.pack(); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 
} 

此前,

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

public class SSCCE { 

    public static void getInputData() { 
     final JFrame frame = new JFrame(); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     JLabel emptyLabel = new JLabel("Test", JLabel.CENTER); 
     frame.getContentPane().add(emptyLabel, BorderLayout.CENTER); 
     frame.setPreferredSize(new Dimension(375, 100)); 

     MouseAdapter ma = new MouseAdapter() { 

      Point local = new Point(); 
      Point delta = new Point(); 
      Point global = new Point(); 

      @Override 
      public void mousePressed(MouseEvent me) { 
       local = me.getPoint(); 
      } 

      @Override 
      public void mouseDragged(MouseEvent me) { 
       delta.setLocation(
        me.getX() - local.x, 
        me.getY() - local.y); 
       global = frame.getLocationOnScreen(); 
       global.setLocation(global.x + delta.x, global.y + delta.y); 
       frame.setLocation(global.x, global.y); 
      } 
     }; 
     frame.getContentPane().addMouseListener(ma); 
     frame.getContentPane().addMouseMotionListener(ma); 
     frame.pack(); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 

    } 

    public static void main(String args[]) { 
     JFrame frame = new JFrame(); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     JButton but = new JButton("Click me"); 
     but.addActionListener(
      new ActionListener() { 

       public void actionPerformed(ActionEvent e) { 
        getInputData(); 
       } 
      }); 
     frame.getContentPane().add(but, BorderLayout.CENTER); 
     frame.pack(); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 
} 
+0

嗯,重點是實際上在點擊點顯示新框架,它會如何顯示沒有適配器? – kxk 2010-06-27 13:01:41

+0

嗯,它實際上還沒有工作......出於某種原因,即使在您的解決方案中,它也不會查看MouseAdapter。它只是在屏幕中間顯示新的JFrame與鼠標點擊無關。用按鈕移動第一幀,然後點擊它,你會明白我的意思。 – kxk 2010-06-27 16:13:57

+0

@devilwontcry:是的,在每個新幀上調用setLocationRelativeTo(null)。評論一下看看效果。如果您希望新框架相對於原始點擊定位,則需要將鼠標監聽器添加到父框架而不是按鈕。 – trashgod 2010-06-27 17:37:06