2012-01-27 14 views
12

के साथ जावा चाल घटकों ने माउस माउस श्रोताओं को जोड़कर और java.awt.Component के फ़ंक्शन का उपयोग करके किसी भी घटक को खींचने योग्य बनाने की कोशिश की। मैंने JButton के साथ परीक्षण किया, यह जांचने के लिए कि क्या मैंने सोचा था।माउस

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

public class DragButton extends JButton{ 

private volatile int draggedAtX, draggedAtY; 

public DragButton(String text){ 
    super(text); 
    setDoubleBuffered(false); 
    setMargin(new Insets(0, 0, 0, 0)); 
    setSize(25, 25); 
    setPreferredSize(new Dimension(25, 25)); 

    addMouseListener(new MouseAdapter(){ 
     public void mousePressed(MouseEvent e){ 
      draggedAtX = e.getX() - getLocation().x; 
      draggedAtY = e.getY() - getLocation().y; 
     } 
    }); 

    addMouseMotionListener(new MouseMotionAdapter(){ 
     public void mouseDragged(MouseEvent e){ 
      setLocation(e.getX() - draggedAtX, e.getY() - draggedAtY); 
     } 
    }); 
} 

public static void main(String[] args){ 
    JFrame frame = new JFrame("DragButton"); 
    frame.setLayout(null); 
    frame.getContentPane().add(new DragButton("1")); 
    frame.getContentPane().add(new DragButton("2")); 
    frame.getContentPane().add(new DragButton("3")); 
    frame.setSize(300, 300); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.setLocationRelativeTo(null); 
    frame.setVisible(true); 
    } 
} 

किसी तरह यह ठीक से काम करने में विफल रहता है और मैं क्यों नहीं मिलता है:

यहाँ मैं क्या करना है कोशिश कर रहा हूँ के लिए एक कोड उदाहरण है। खींचने वाली वास्तविक दूरी माउस आंदोलन की आधा दूरी है और यह उस दूरी के चारों ओर झिलमिलाहट करती है जबकि खींचती है कि दो माउस स्थिति MouseMotionListener पर प्रतिस्पर्धा कर रही हैं।

कोई भी स्विंग/अल्ट नोब की मदद कर सकता है? =) अग्रिम में बहुत धन्यवाद।

संपादित करें: (!)

ठीक है, तो समस्या मुझे नहीं पता था कि उस घटना की स्थिति में किया जा रहा रिश्तेदार फायरिंग JComponent करने के साथ प्रत्येक माउस स्थान पर Refire होता था। अपने प्रयासों और mKorbel लिंक के लिए के लिए

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

public class DragButton extends JButton{ 

    private volatile int draggedAtX, draggedAtY; 

    public DragButton(String text){ 
     super(text); 
     setDoubleBuffered(false); 
     setMargin(new Insets(0, 0, 0, 0)); 
     setSize(25, 25); 
     setPreferredSize(new Dimension(25, 25)); 

     addMouseListener(new MouseAdapter(){ 
      public void mousePressed(MouseEvent e){ 
       draggedAtX = e.getX(); 
       draggedAtY = e.getY(); 
      } 
     }); 

     addMouseMotionListener(new MouseMotionAdapter(){ 
      public void mouseDragged(MouseEvent e){ 
       setLocation(e.getX() - draggedAtX + getLocation().x, 
         e.getY() - draggedAtY + getLocation().y); 
      } 
     }); 
    } 

    public static void main(String[] args){ 
     JFrame frame = new JFrame("DragButton"); 
     frame.setLayout(null); 
     frame.getContentPane().add(new DragButton("1")); 
     frame.getContentPane().add(new DragButton("2")); 
     frame.getContentPane().add(new DragButton("3")); 
     frame.setSize(300, 300); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 
} 

धन्यवाद आदेल: तो यह ठीक किया और काम कोड है।

+0

भी देखें [ 'ChessBoard'] (http://stackoverflow.com/a/2562685/230513)। – trashgod

+1

हाँ, ग्लास फलक निश्चित रूप से यहां जाने का तरीका है, लेकिन मैंने उदाहरण को यथासंभव सरल रखने की कोशिश की, लेकिन अभी भी संकलित। मुझे आशा है कि यह भविष्य के पाठकों को भ्रमित नहीं करेगा। ग्लास का उपयोग करें! (या एक [स्तरित फलक] (http://docs.oracle.com/javase/tutorial/uiswing/components/rootpane.html) इसके DRAG_LAYER के साथ) – Stephan

उत्तर

11

आप JComponent साथ आगे बढ़ना है,;:

यहाँ यह कैसे करना है पर एक ट्यूटोरियल है अन्य हाथों में, ComponentMover के लिए उत्कृष्ट कोड के आसपास कुछ भी बेहतर नहीं है।

+0

ओह मेरे भगवान, उस लिंक के लिए आपको बहुत बहुत धन्यवाद! पहले कुछ भावनाओं ने मुझे अपना सिर मारा। ^^ मैंने सही कोड दिखाने के लिए अपनी पोस्ट संपादित की। – Stephan

+0

@ स्टीफन: उपयोगी पाए गए उत्तर-वोट उत्तरों के लिए उपेक्षा न करें। – trashgod

+0

वैसे मैं हाल ही में नहीं कर सका। ;) – Stephan

2

आप जावा Transferable इंटरफ़ेस का उपयोग क्यों नहीं करते? मैं रिक्तियों mousePressed/mouseDragged में इस परिभाषा के याद आती है http://www.javaworld.com/javaworld/jw-03-1999/jw-03-dragndrop.html

+0

क्या java.awt.dnd घटकों की चलती एनीमेशन का समर्थन करता है? मुझे एनीमेशन के बजाए ड्रैग एंड ड्रॉप के डेटा ड्रॉपिंग हिस्से की आवश्यकता नहीं है (अच्छी तरह से मुझे इसकी आवश्यकता है लेकिन यह मामूली समस्या है)। मैंने पाया सबसे ट्यूटोरियल केवल डेटा हस्तांतरण भाग का वर्णन किया, जहां केवल कर्सर ड्रैग और ड्रॉप इंगित करता है। मैं चाहता हूं कि पूरा घटक आगे बढ़े। (मेरे अंग्रेजी ^^ के लिए सूखी) – Stephan

+0

@ स्टीफन ट्रांसफर योग्य पैकेज _java.awt.datatransfer_ से आता है, इसलिए यह _awt_ –

+0

सूखी में ड्रैग और ड्रॉप का समर्थन कर सकता है, लेकिन यह मेरे प्रश्न का उत्तर नहीं देता है, हालांकि मुझे ड्रैग का एक कामकाजी उदाहरण मिला और java.awt.dnd और java.awt.datatransfer का उपयोग करके एनीमेशन (!) ड्रॉप करें: [लिंक] (http://weblogs.java.net/blog/gfx/archive/2005/10/drag_and_drop_e.html)। इसके माध्यम से काम करना मजेदार नहीं है, क्योंकि वह केवल अपने स्रोत कोड से जुड़ा हुआ है। – Stephan

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

public class movingButton extends JFrame{ 

    private JButton button ; 

    public movingButton() 
    { 
    super("Position helper"); 
     super.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     super.setSize(500,520); 
     super.setVisible(true); 
     super.setLayout(null); 
     button = new JButton ("drag me "); 
     add(button); 
     button.setBounds(100, 100, 150, 40);   
     button.addMouseMotionListener(new MouseAdapter(){ 

      public void mouseDragged(MouseEvent E) 
      { 
       int X=E.getX()+button.getX(); 
       int Y=E.getY()+button.getY; 
       button.setBounds(X,Y,150,40); 
      } 
     }); 
    } 

    public static void main (String x[]) 
    {   
     new movingButton(); 
    } 
} 
+0

मुझे जो करने की ज़रूरत है उसके लिए काम करता है और पर्याप्त है लेकिन ड्रॉइंग करते समय माउस पॉइंटर वास्तविक घटक से ऑफसेट होता है? कोई विचार? – unekwu

0

यह बेहतर है अगर आप क्या करेंगे

int X=E.getX() + button.getX(); 
int Y=E.getY() + button.getY(); 
+0

मुझे नहीं लगता कि आपका उत्तर उचित है - सबसे पहले आप उस स्निपेट का उपयोग करने के बारे में कोई टिप्पणी नहीं देते हैं, और दूसरी बात आप विभिन्न अक्षर आकार का उपयोग कर रहे हैं। –

संबंधित मुद्दे