Swing - jbutton - zmiana mouseDragged

0

Witam,
Mam taki problem, że ma zrobioną obsługe tzw "drag and drop" jbuttona.
Główna część kodu wygląda:

	public void mouseDragged(MouseEvent e) {
			Component c = e.getComponent();
			setLocationSafe(c, e);
		}

Chciałbym jednak, żeby button był przesuwany nie przypadku, gdy go "trzymam" (tzn. mousePressed), lecz
po kliknieciu dwa razy na nim i nastepnym kliknieciu poza nim(wskazaniu nowej pozycji) ustawiał się on na nowej pozycji. Wszelka pomoc i wskazowki mile widziane. Hm.. moze da sie jakos ladnie nadpisac mouseDragged?

0

Spróbuj tak

//pola w klasie
    private boolean dragged=false;
    private JPanel panel;
    private JButton button;
//fragment konstruktora
        panel=new JPanel();
        panel.setLayout(null);
        panel.setPreferredSize(new Dimension(400,300));
        add(panel,BorderLayout.CENTER);
        panel.addMouseListener(this);

        button=new JButton("Test");
        button.setBounds(10,10,80,20);
        button.addMouseListener(this);
        panel.add(button);
//metoda MouseClicked
    public void mouseClicked(MouseEvent me)
    {
        Component src=(Component)(me.getSource());
        if(src instanceof JButton)
        {
            if(me.getClickCount()==2)
            {
                dragged=true;
            }
        }
        if(src instanceof JPanel && dragged)
        {
            panel.remove(button);
            button.setBounds(me.getX(),me.getY(),80,20);
            panel.add(button);
            dragged=false;
            validate();
            repaint();
        }
    }
0

Ok dokładnie o to chodziło. Teraz mam pytanie, jak rozpoznać, który button został kliknięty na panelu, bo chce ich kilka dodać.

0
//pola w klasie
    private JButton draggedButton;
    private JPanel panel;
    private HashMap<String,JButton> buttons;
///fragment konstruktora
        buttons=new HashMap<String,JButton>();
        for(int i=1;i<=5;i++)
        {
            JButton b=new JButton(i+".");
            b.setBounds(10,i*25,80,20);
            b.addMouseListener(this);
            buttons.put(b.getActionCommand(),b);
            panel.add(b);
        }
    public void mouseClicked(MouseEvent me)
    {
        Component src=(Component)(me.getSource());
        if(src instanceof JButton)
        {
            if(me.getClickCount()==2)
            {
                String cmd=((JButton)src).getActionCommand();
                draggedButton=buttons.get(cmd);
            }
        }
        if(src instanceof JPanel && draggedButton!=null)
        {
            panel.remove(draggedButton);
            draggedButton.setBounds(me.getX(),me.getY(),80,20);
            panel.add(draggedButton);
            draggedButton=null;
            validate();
            repaint();
        }
    }
0

ok, dzieki za fachowa pomoc. Mam jeszcze jedno pytanko, chyba nieco trudniejsze: jak zrobic tak, zeby ten button "przyklejal" sie do kursora na czas przesuwania?

0

czesc, mam pytanie, jak zrobic to bez tej hash mapy?

0

Mozna przerobic metode mouse clicked:

public void mouseClicked(MouseEvent me) {
		  Component  src=(Component)(me.getSource());
	        if(src instanceof JButton)
	        {
	            if(me.getClickCount()==2)
	            {
	                draggedButton=(JButton)src;
	            }
	        }
	        if(src instanceof JPanel && draggedButton!=null)
	        {
	            panel.remove(draggedButton);
	            draggedButton.setBounds(me.getX(),me.getY(),80,20);
	            panel.add(draggedButton);
	            draggedButton=null;
	            validate();
	            repaint();
	        }	
	}

Ponawiam pytanie, o to jak przyczepic button do kursora? Za wszelka pomoc bede bardzo wdzieczny.

0

jak kiedyś korzystałem z tego, do ruszania komponentów

private class ComponentMove extends MouseAdapter {

    private boolean dragged = false;
    private Point start;
    private Component draggedComponet;

    public ComponentMove(Component draggedComponet) {
        this.draggedComponet = draggedComponet;
    }

    @Override
    public void mouseClicked(MouseEvent e) {
        if (e.getComponent().equals(draggedComponet)) {
            if (dragged) {
                dragged = false;
            } else if (e.getClickCount() == 2) {
                dragged = true;
                start = e.getPoint();
            }
        }
    }

    @Override
    public void mouseMoved(MouseEvent e) {
        if (dragged) {
            Point p = null;
            if (e.getComponent().equals(draggedComponet)) {
                p = SwingUtilities.convertPoint(draggedComponet, e.getPoint(), draggedComponet.getParent());
            } else if (e.getComponent().equals(draggedComponet.getParent())) {
                p = e.getPoint();
            }
            if (p != null) {
                Point p1 = new Point(p.x - start.x, p.y - start.y);
                draggedComponet.setLocation(p1);
            }
        }
    }
}

wystarczy dodać do :

ComponentMove bm = new ComponentMove(button);

button.addMouseListener(bm);
button.addMouseMotionListener(bm);
panel.addMouseMotionListener(bm);

1 użytkowników online, w tym zalogowanych: 0, gości: 1