user9091464
user9091464

Reputation:

Swing Library for Dragging Components in Java

I am trying to create a type of Graphics Editor that allows users to create graphic depictions of American Football plays. To do this, the User should be able to do the following:

1) Click and Move images with Left Mouse Click

2) Change images (circles, squares, and lines)

3) Reset size of all objects

Ideally, I would like to be able to add adjustable colors and line thickness, but that is far down the road.

Right now, all I can do is create JButtons that cycle through images when clicked. I think I would like to change this to JComboBox so users can go straight to the correct image. Here is my class called: FBButton

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

@SuppressWarnings("serial")
public class FBButton extends JButton implements ActionListener {
    ImageIcon SN, SL, SR, SC, CN, CL, CR, CC, IN;
    byte value = 0;
    FBMouseListener listener;

    public FBButton() {

        listener = new FBMouseListener();

        SN = new ImageIcon(this.getClass().getResource("square_null.png"));
        SL = new ImageIcon(this.getClass().getResource("square_left.png"));
        SR = new ImageIcon(this.getClass().getResource("square_right.png"));
        SC = new ImageIcon(this.getClass().getResource("square_line.png"));

        CN = new ImageIcon(this.getClass().getResource("circle_null.png"));
        CL = new ImageIcon(this.getClass().getResource("circle_left.png"));
        CR = new ImageIcon(this.getClass().getResource("circle_right.png"));
        CC = new ImageIcon(this.getClass().getResource("circle_line.png"));

        IN = new ImageIcon(this.getClass().getResource("invisible.png"));

        addActionListener(this);
    }

    public void actionPerformed(ActionEvent e) {
        value++;
        value %= 9;

        if (value == 1) {
            setIcon(SN);
        } else if (value == 2) {
            setIcon(SL);
        } else if (value == 3) {
            setIcon(SR);
        } else if (value == 4) {
            setIcon(SC);
        } else if (value == 5) {
            setIcon(CN);
        } else if (value == 6) {
            setIcon(CL);
        } else if (value == 7) {
            setIcon(CR);
        } else if (value == 8) {
            setIcon(CC);
        } else {
            setIcon(IN);
        }


    }

}

These buttons work and the images can be found. Here is my code for the class FBPlayerFrame

package swing;

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

public class FBPlayerFrame extends JFrame {

    JPanel p = new JPanel();
    FBButton buttons[] = new FBButton[22];
    String choices[] = { "Hallo", "Bonjour", "Conichuwa" };
    JComboBox boxes[];
    JComboBox here = new JComboBox(choices);
    FBComboBox vince;

    Dimension dim = new Dimension(52, 52);

    public static void main(String[] args) {
        new FBPlayerFrame();
    }

    public FBPlayerFrame() {
        super("Football Start");
        setSize(400, 400);
        setResizable(false);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        p.setLayout(null);


        for (int i = 0; i < 4; i++) {
            buttons[i] = new FBButton();
            buttons[i].setPreferredSize(dim);
            buttons[i].setLocation(20, 40 + 60 * i);
            p.add(buttons[i]);


        }


        add(p);

        setVisible(true);
    }

}

In the spirit of keeping specific, what I am looking for first is the ability to Left Click and Drag JButtons,or JComboBoxes, throughout the frame. It would also help later if the Coordinates of the Buttons could be saved at some point, but that is not necessary now.

I have searched StackOverflow and youtube for similar questions, but have had a challenging time finding something that answers my question specifically.

UPDATE: Here is my code for FBMouseListener

package swing;

import java.awt.Component;
import java.awt.Point;
import java.awt.event.*;
import javax.swing.event.MouseInputAdapter;

public class FBMouseListener extends MouseInputAdapter {
    Point location;
    MouseEvent pressed;

    public void mousePressed(MouseEvent me) {
        pressed = me;
        System.out.println("Found me");
    }

    public void mouseDragged(MouseEvent me) {
        Component component = me.getComponent();
        location = component.getLocation(location);
        int x = location.x - pressed.getX() + me.getX();
        int y = location.y - pressed.getY() + me.getY();
        System.out.println("(" + x + ", " + y + ")");
        component.setLocation(x, y);
    }
}

Upvotes: 2

Views: 943

Answers (1)

camickr
camickr

Reputation: 324098

The basic code for dragging a component is:

public class DragListener extends MouseInputAdapter
{
    Point location;
    MouseEvent pressed;

    public void mousePressed(MouseEvent me)
    {
        pressed = me;
    }

    public void mouseDragged(MouseEvent me)
    {
        Component component = me.getComponent();
        location = component.getLocation(location);
        int x = location.x - pressed.getX() + me.getX();
        int y = location.y - pressed.getY() + me.getY();
        component.setLocation(x, y);
     }
}

You create an single instance of the class and then add it to any component you wish to drag.

DragListener drag = new DragListener();
component.addMouseListener( drag );
component.addMouseMotionListener( drag );

You can also check out the Component Mover class. It allows you to drag windows on the desktop or components in panel. It provides a few more dragging features.

Edit:

It takes me a couple of lines of code to test this solution:

JButton button = new JButton("hello");
button.setSize( button.getPreferredSize() );

DragListener drag = new DragListener();
button.addMouseListener( drag );
button.addMouseMotionListener( drag );

JPanel panel = new JPanel( null );
panel.add( button );

JFrame frame = new JFrame();
frame.add( panel );
frame.setSize(400, 400);
frame.setVisible( true );

Put the above code in a main() method and you have simple code to test.

Upvotes: 4

Related Questions