के साथ जावा चाल घटकों ने माउस माउस श्रोताओं को जोड़कर और 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);
}
}
धन्यवाद आदेल: तो यह ठीक किया और काम कोड है।
भी देखें [ 'ChessBoard'] (http://stackoverflow.com/a/2562685/230513)। – trashgod
हाँ, ग्लास फलक निश्चित रूप से यहां जाने का तरीका है, लेकिन मैंने उदाहरण को यथासंभव सरल रखने की कोशिश की, लेकिन अभी भी संकलित। मुझे आशा है कि यह भविष्य के पाठकों को भ्रमित नहीं करेगा। ग्लास का उपयोग करें! (या एक [स्तरित फलक] (http://docs.oracle.com/javase/tutorial/uiswing/components/rootpane.html) इसके DRAG_LAYER के साथ) – Stephan