Sign Up

Sign Up to our social questions and Answers Engine to ask questions, answer people’s questions, and connect with other people.

Have an account? Sign In

Have an account? Sign In Now

Sign In

Login to our social questions & Answers Engine to ask questions answer people’s questions & connect with other people.

Sign Up Here

Forgot Password?

Don't have account, Sign Up Here

Forgot Password

Lost your password? Please enter your email address. You will receive a link and will create a new password via email.

Have an account? Sign In Now

You must login to ask a question.

Forgot Password?

Need An Account, Sign Up Here

Please briefly explain why you feel this question should be reported.

Please briefly explain why you feel this answer should be reported.

Please briefly explain why you feel this user should be reported.

Sign InSign Up

The Archive Base

The Archive Base Logo The Archive Base Logo

The Archive Base Navigation

  • SEARCH
  • Home
  • About Us
  • Blog
  • Contact Us
Search
Ask A Question

Mobile menu

Close
Ask a Question
  • Home
  • Add group
  • Groups page
  • Feed
  • User Profile
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Buy Points
  • Users
  • Help
  • Buy Theme
  • SEARCH
Home/ Questions/Q 9124243
In Process

The Archive Base Latest Questions

Editorial Team
  • 0
Editorial Team
Asked: June 17, 20262026-06-17T06:31:44+00:00 2026-06-17T06:31:44+00:00

I have a panel with lists and buttons. The lists set MouseAdapter with mouseClick()

  • 0

I have a panel with lists and buttons. The lists set MouseAdapter with mouseClick(). I added to the panel MouseAdapter with mousePressed() and mouseReleased() and MouseMotionAdapter with mouseDragged.

Drag and drop only works if you click on the panel.

How to make the drag work even if I clicked on the list?

Simple examlpe:

public class DragTest extends JFrame{
private boolean drag;
private Point btnCoord;
private Point startPoint;

public DragTest(){
    setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    setSize(500,500);
    setLayout(null);
    final JPanel panel = new JPanel();
    final JButton button = new JButton();
    button.setText("Button");
    button.setSize(30,60);
    button.setLocation(50, 50);
    panel.setLayout(null);
    setContentPane(panel);
    panel.addMouseMotionListener(new MouseMotionAdapter() {
        @Override
        public void mouseDragged(MouseEvent e) {
            if (drag){
                panel.setLocation(btnCoord.x-(startPoint.x-e.getX()),btnCoord.y-(startPoint.y-e.getY()));
            }
        }
    });
    panel.addMouseListener(new MouseAdapter() {
        @Override
        public void mousePressed(MouseEvent e) {
            drag = true;
            startPoint = e.getPoint();
            btnCoord = panel.getLocation();
        }

        @Override
        public void mouseReleased(MouseEvent e) {
            drag = false;
        }
    });
    getContentPane().add(button);
}

public static void main(String[] args) {
    JFrame frame = new DragTest();
    frame.setVisible(true);
}
}

If you drag panel, all work fine, if start drag button, then button intercept event.

  • 1 1 Answer
  • 0 Views
  • 0 Followers
  • 0
Share
  • Facebook
  • Report

Leave an answer
Cancel reply

You must login to add an answer.

Forgot Password?

Need An Account, Sign Up Here

1 Answer

  • Voted
  • Oldest
  • Recent
  • Random
  1. Editorial Team
    Editorial Team
    2026-06-17T06:31:45+00:00Added an answer on June 17, 2026 at 6:31 am

    The above code has many errors…

    • Dont use null/Absolute LayoutManager. Have a look at Laying Out Components Within a Container.
    • Dont call setSize on components and JFrame (if correct Layout Manager is implemented you can simply add components and call pack() on JFrame.
    • Create and manipulate Swing components on EDT. Read more on Concurrency in Swing.
    • You should call revalidate() and repaint() on container after adding/removing components from a visible container.

    I have been working on my own little ComponentDrag API which will allow us to drag Swing components across a JComponent or over multiple JComponents. It is by no means error free though (especially the multiple components part just finished it today so you never know)

    You would create JButton and add to JPanel:

        JButton button = new JButton("Text");
    
        JPanel panel1 = new JPanel() {
            @Override
            public Dimension getPreferredSize() {
                return new Dimension(300, 300);
            }
        };
        panel1.add(button);
    

    Than create an instance of ComponentDrag class by passing argument of you container i.e JFrame/JDialog or JWindow and register the draggable components and call setName("Droppable") on your JPanel to allow dragging and dropping to take place correctly especially across multiple JComponents etc, you would only do this for the JPanels etc that you want the ability to drop Swing components too:

        JFrame frame=..;//has access to setGlassPane same applies for JDialog and JWindow
        frame.add(panel1);
    
        ComponentDrag cd=new ComponentDrag(frame);
        cd.registerComponent(button);
        panel1.setName("Droppable");//needed for the dragging and dropping to work correctly especailly over multiple components
    

    and your good to go :).

    Here are 2 full examples for analysis purposes:

    1) Show the logic to move JButtons and re-position the accordingly using ComponentDrag and overriding its componentDropped method:

    Before drag:

    enter image description here

    After 4 dragged to 1 position:

    enter image description here

    import java.awt.Component;
    import java.awt.Container;
    import java.awt.Cursor;
    import java.awt.Graphics;
    import java.awt.GridLayout;
    import java.awt.Point;
    import java.awt.event.ActionEvent;
    import java.awt.event.MouseAdapter;
    import java.awt.event.MouseEvent;
    import java.awt.image.BufferedImage;
    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.HashSet;
    import java.util.Map;
    import javax.swing.AbstractAction;
    import javax.swing.JButton;
    import javax.swing.JComponent;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.SwingUtilities;
    import javax.swing.Timer;
    
    public class DragButtonsTest {
    
        ArrayList<JButton> buttons = new ArrayList<>();
    
        public DragButtonsTest() {
            JFrame frame = new JFrame();
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    
            final JPanel panel = new JPanel(new GridLayout(2, 2));
    
            ComponentDrag cd = new ComponentDrag(frame) {
                @Override
                protected void componentDropped(MouseEvent me) {
                    HashMap<Integer, JButton> collisions = new HashMap<>();
                    JButton draggedButton = (JButton) me.getSource();
    
                    for (JButton btn : buttons) {//iterate through all buttons and get the number of collsions of each
                        if (btn != draggedButton) {//dont chck button we were dragging
                            int col = checkPerPixelCollision(draggedButton, btn);
                            System.out.println("Button " + btn.getText());
                            System.out.println(col);
                            collisions.put(col, btn);
                        }
                    }
    
                    //lets get the button which had most collisions
                    int maxCollisions = 0;
                    JButton intersectingButton = null;
                    for (Map.Entry<Integer, JButton> entry : collisions.entrySet()) {
                        Integer collisionCount = entry.getKey();
                        JButton button = entry.getValue();
                        if (collisionCount > maxCollisions) {
                            maxCollisions = collisionCount;
                            intersectingButton = button;
                        }
                    }
    
                    boolean reLayout = false;
    
                    if (maxCollisions > 0) {//check if there was any
                        System.out.println("Button " + draggedButton.getText() + " is intersecting more of Button " + intersectingButton.getText());
                        System.out.println("Collisions: " + maxCollisions);
                        reLayout = true;
                    } else {
                        System.out.println("No change made");
                        reLayout = false;
                    }
    
                    ArrayList<JButton> tmpButtons = (ArrayList<JButton>) buttons.clone();//create clone of buttons
    
                    if (reLayout) {//a button as moved and panel needs to be layed out
                        buttons.clear();//clear old buttons
    
                        for (JButton b : tmpButtons) {//re-order jbuttons
                            if (b == intersectingButton) {
                                buttons.add(draggedButton);
                            } else if (b == draggedButton) {
                                buttons.add(intersectingButton);
                            } else {
                                buttons.add(b);
                            }
                        }
                        panel.removeAll();//remove all buttons
                        for (JButton btn : buttons) {//iterate through all buttons and get the number of collsions of each
                            panel.add(btn);//re-add buttons according to arraylist
                        }
                        panel.revalidate();
                        panel.repaint();
                    }
                    super.componentDropped(me);
    
                }
            };
    
            for (int i = 0; i < 4; i++) {
                JButton b = new JButton(String.valueOf(i + 1));
                panel.add(b);
                buttons.add(b);
                cd.registerComponent(b);
            }
    
            frame.add(panel);
    
            frame.pack();
            frame.setVisible(true);
        }
    
        public static void main(String[] args) {
            SwingUtilities.invokeLater(new Runnable() {
                @Override
                public void run() {
                    new DragButtonsTest();
                }
            });
        }
    
        public HashSet<String> getMask(JButton e) {
            HashSet<String> mask = new HashSet<>();
            int pixel, a;
            BufferedImage bi = componentToImage(e); //gets the current image being shown
    
            for (int i = 0; i < bi.getWidth(); i++) { // for every (x,y) component in the given box, 
                for (int j = 0; j < bi.getHeight(); j++) {
                    pixel = bi.getRGB(i, j); // get the RGB value of the pixel
                    a = (pixel >> 24) & 0xff;
                    if (a != 0) {  // if the alpha is not 0, it must be something other than transparent
                        mask.add((e.getX() + i) + "," + (e.getY() - j)); // add the absolute x and absolute y coordinates to our set
                    }
                }
            }
            return mask;  //return our set
        }
    
        public static BufferedImage componentToImage(Component component) {
            BufferedImage img = new BufferedImage(component.getWidth(), component.getHeight(), BufferedImage.TRANSLUCENT);
            Graphics g = img.getGraphics();
            component.paintAll(g);
            return img;
        }
    
        // Returns true if there is a collision between object a and object b   
        public int checkPerPixelCollision(JButton b, JButton b2) {
            // This method detects to see if the images overlap at all. If they do, collision is possible
            int ax1 = (int) b2.getX();
            int ay1 = (int) b2.getY();
    
            int ax2 = ax1 + (int) b2.getWidth();
            int ay2 = ay1 + (int) b2.getHeight();
    
            int bx1 = (int) b.getX();
            int by1 = (int) b.getY();
    
            int bx2 = bx1 + (int) b.getWidth();
    
            int by2 = by1 + (int) b.getHeight();
    
            if (by2 < ay1 || ay2 < by1 || bx2 < ax1 || ax2 < bx1) {
                return 0; // Collision is impossible.
            } else { // Collision is possible.
                // get the masks for both images
                HashSet<String> maskPlayer1 = getMask(b2);
                HashSet<String> maskPlayer2 = getMask(b);
                maskPlayer1.retainAll(maskPlayer2);  // Check to see if any pixels in maskPlayer2 are the same as those in maskPlayer1
                if (maskPlayer1.size() > 0) {  // if so, than there exists at least one pixel that is the same in both images, thus
                    return maskPlayer1.size();
                }
            }
            return 0;
        }
    }
    
    class ComponentDrag {
    
        private MouseAdapter ma;
        private ArrayList<JComponent> components = new ArrayList<>();
        private int startingX, startingY;
        private boolean autoLayout = true;
        private final JFrame container;
        private JPanel glassPane;
        boolean firstTime = true;
        private JComponent lastClickedContainer;
    
        public ComponentDrag(final JFrame container) {
            this.container = container;
            glassPane = new JPanel();
            glassPane.setOpaque(false);
            glassPane.setLayout(null);
            this.container.setGlassPane(glassPane);
    
            new Timer(10, new AbstractAction() {
                @Override
                public void actionPerformed(ActionEvent ae) {
                    if (container.isVisible()) {
                        glassPane.setVisible(true);
                        ((Timer) ae.getSource()).stop();
                    }
                }
            }).start();
    
            ma = new MouseAdapter() {
                @Override
                public void mousePressed(MouseEvent me) {
                    super.mousePressed(me);
                    componentPressed(me);
                }
    
                @Override
                public void mouseReleased(MouseEvent me) {
                    super.mouseReleased(me);
                    componentDropped(me);
                }
    
                @Override
                public void mouseDragged(MouseEvent me) {
                    super.mouseDragged(me);
                    componentDragged(me);
                }
            };
        }
    
        public JComponent findDroppableUnderGlassPane(Point p, Container container, Component source) {
            JComponent c = null;
            Component[] comps = container.getComponents();
            for (Component com : comps) {
                if (com.getName() != null) {
                    if (com.getName().equals("Droppable") && com instanceof JComponent) {
                        if (com.contains(SwingUtilities.convertPoint(source, p, com))) {
                            return (JComponent) com;
                        }
                    } else if (com instanceof Container) {
                        findDroppableUnderGlassPane(p, (Container) com, source);
                    }
                }
            }
            return c;
        }
    
        public boolean isAutoLayout() {
            return autoLayout;
        }
    
        public void setAutoLayout(boolean autoLayout) {
            this.autoLayout = autoLayout;
        }
    
        protected void componentDropped(MouseEvent me) {
            firstTime = true;
            Component droppedComponent = (Component) me.getSource();
            droppedComponent.setCursor(null);
    
            JComponent jc = findDroppableUnderGlassPane(me.getPoint(), container.getContentPane(), (Component) me.getSource());
    
            if (jc != null) {
                glassPane.removeAll();
                glassPane.revalidate();
                glassPane.repaint();
    
                jc.add(droppedComponent);
                System.out.println("Removed from glasspane and added to: " + jc);
    
                if (autoLayout) {
                    if (lastClickedContainer != null) {
                        lastClickedContainer.revalidate();
                        lastClickedContainer.repaint();
                    }
                    droppedComponent.revalidate();
                    droppedComponent.repaint();
                    jc.revalidate();
                    jc.repaint();
                }
    
            } else {
                glassPane.removeAll();
                glassPane.revalidate();
                glassPane.repaint();
                if (lastClickedContainer != null) {
                    lastClickedContainer.add(droppedComponent);
                    lastClickedContainer.revalidate();
                    lastClickedContainer.repaint();
                }
            }
        }
    
        protected void componentPressed(MouseEvent me) {
            JComponent jc = findDroppableUnderGlassPane(me.getPoint(), container.getContentPane(), (Component) me.getSource());
    
            if (jc != null && jc.getName().equals("Droppable")) {
                lastClickedContainer = jc;
                System.out.println("Pressed: " + lastClickedContainer);
            }
    
            boolean clickedRegisteredComponent = false;
    
            Component clickedComponent = (Component) me.getSource();
    
            for (Component component : ComponentDrag.this.components) {
                if (component.equals(clickedComponent)) {
                    clickedRegisteredComponent = true;
                    break;
                }
            }
    
            if (clickedRegisteredComponent) {
                startingX = me.getX();
                startingY = me.getY();
                clickedComponent.setCursor(new Cursor(Cursor.MOVE_CURSOR));
            }
        }
    
        protected void componentDragged(MouseEvent me) {
            Component draggedComponent = (Component) me.getSource();
    
            if (firstTime && lastClickedContainer != null) {
                firstTime = false;
                lastClickedContainer.remove(draggedComponent);
                lastClickedContainer.revalidate();
                lastClickedContainer.repaint();
                glassPane.add(draggedComponent);
                glassPane.revalidate();
                glassPane.repaint();
                System.out.println("Removed from: " + lastClickedContainer + " \nAnd added to glasspane for dragging");
            }
    
            //MouseEvent will refire on each drag with the position being relative to the firing Component
            draggedComponent.setLocation((me.getX() - startingX) + draggedComponent.getLocation().x, (me.getY() - startingY) + draggedComponent.getLocation().y);
        }
    
        void registerComponent(JComponent draggableComp) {
            draggableComp.addMouseListener(ma);
            draggableComp.addMouseMotionListener(ma);
            components.add(draggableComp);
        }
    
        void deregisterComponent(JComponent draggableComp) {
            draggableComp.removeMouseListener(ma);
            draggableComp.removeMouseMotionListener(ma);
            components.remove(draggableComp);
        }
    }
    

    2) Simply shows how to drag 2 JLabels across JPanels

    Before Drag me label dragged:

    enter image description here

    After label dragged:

    enter image description here

    import java.awt.BorderLayout;
    import java.awt.Component;
    import java.awt.Container;
    import java.awt.Cursor;
    import java.awt.Dimension;
    import java.awt.Point;
    import java.awt.event.ActionEvent;
    import java.awt.event.MouseAdapter;
    import java.awt.event.MouseEvent;
    import java.util.ArrayList;
    import javax.swing.AbstractAction;
    import javax.swing.JComponent;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JPanel;
    import javax.swing.JSeparator;
    import javax.swing.SwingUtilities;
    import javax.swing.Timer;
    
    /**
     *
     * @author David
     */
    public class DragOverMultipleComponentsTest {
    
        public DragOverMultipleComponentsTest() {
            createAndShowUI();
        }
    
        public static void main(String[] args) {
            SwingUtilities.invokeLater(new Runnable() {
                @Override
                public void run() {
                    new DragOverMultipleComponentsTest();
                }
            });
        }
    
        private void createAndShowUI() {
            final JFrame frame = new JFrame();
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    
    
            JLabel draggableLabel = new JLabel("<- Drag me");
            JLabel draggableLabel2 = new JLabel("<- Drag me too");
    
            JLabel labelPanel1 = new JLabel("Drag 'em here");
            JPanel panel1 = new JPanel() {
                @Override
                public Dimension getPreferredSize() {
                    return new Dimension(300, 300);
                }
            };
            panel1.add(labelPanel1);
            panel1.setName("Droppable");
    
            JLabel labelPanel2 = new JLabel("Drag 'em here");
            JPanel panel2 = new JPanel();
            panel2.add(labelPanel2);
            panel2.add(draggableLabel);
            panel2.add(draggableLabel2);
            panel2.setName("Droppable");
    
            JSeparator js = new JSeparator(JSeparator.VERTICAL);
    
            ComponentDrag cd = new ComponentDrag(frame);
    
            cd.registerComponent(draggableLabel);
            cd.registerComponent(draggableLabel2);
    
            frame.add(panel1, BorderLayout.WEST);
            frame.add(js);
            frame.add(panel2, BorderLayout.EAST);
    
            frame.pack();
            frame.setVisible(true);
        }
    }
    class ComponentDrag {
    
        private MouseAdapter ma;
        private ArrayList<JComponent> components = new ArrayList<>();
        private int startingX, startingY;
        private boolean autoLayout = true;
        private final JFrame container;
        private JPanel glassPane;
        boolean firstTime = true;
        private JComponent lastClickedContainer;
    
        public ComponentDrag(final JFrame container) {
            this.container = container;
            glassPane = new JPanel();
            glassPane.setOpaque(false);
            glassPane.setLayout(null);
            this.container.setGlassPane(glassPane);
    
            new Timer(10, new AbstractAction() {
                @Override
                public void actionPerformed(ActionEvent ae) {
                    if (container.isVisible()) {
                        glassPane.setVisible(true);
                        ((Timer) ae.getSource()).stop();
                    }
                }
            }).start();
    
            ma = new MouseAdapter() {
                @Override
                public void mousePressed(MouseEvent me) {
                    super.mousePressed(me);
                    componentPressed(me);
                }
    
                @Override
                public void mouseReleased(MouseEvent me) {
                    super.mouseReleased(me);
                    componentDropped(me);
                }
    
                @Override
                public void mouseDragged(MouseEvent me) {
                    super.mouseDragged(me);
                    componentDragged(me);
                }
            };
        }
    
        public JComponent findDroppableUnderGlassPane(Point p, Container container, Component source) {
            JComponent c = null;
            Component[] comps = container.getComponents();
            for (Component com : comps) {
                if (com.getName() != null) {
                    if (com.getName().equals("Droppable") && com instanceof JComponent) {
                        if (com.contains(SwingUtilities.convertPoint(source, p, com))) {
                            return (JComponent) com;
                        }
                    } else if (com instanceof Container) {
                        findDroppableUnderGlassPane(p, (Container) com, source);
                    }
                }
            }
            return c;
        }
    
        public boolean isAutoLayout() {
            return autoLayout;
        }
    
        public void setAutoLayout(boolean autoLayout) {
            this.autoLayout = autoLayout;
        }
    
        protected void componentDropped(MouseEvent me) {
            firstTime = true;
            Component droppedComponent = (Component) me.getSource();
            droppedComponent.setCursor(null);
    
            JComponent jc = findDroppableUnderGlassPane(me.getPoint(), container.getContentPane(), (Component) me.getSource());
    
            if (jc != null) {
                glassPane.removeAll();
                glassPane.revalidate();
                glassPane.repaint();
    
                jc.add(droppedComponent);
                System.out.println("Removed from glasspane and added to: " + jc);
    
                if (autoLayout) {
                    if (lastClickedContainer != null) {
                        lastClickedContainer.revalidate();
                        lastClickedContainer.repaint();
                    }
                    droppedComponent.revalidate();
                    droppedComponent.repaint();
                    jc.revalidate();
                    jc.repaint();
                }
    
            } else {
                glassPane.removeAll();
                glassPane.revalidate();
                glassPane.repaint();
                if (lastClickedContainer != null) {
                    lastClickedContainer.add(droppedComponent);
                    lastClickedContainer.revalidate();
                    lastClickedContainer.repaint();
                }
            }
        }
    
        protected void componentPressed(MouseEvent me) {
            JComponent jc = findDroppableUnderGlassPane(me.getPoint(), container.getContentPane(), (Component) me.getSource());
    
            if (jc != null && jc.getName().equals("Droppable")) {
                lastClickedContainer = jc;
                System.out.println("Pressed: " + lastClickedContainer);
            }
    
            boolean clickedRegisteredComponent = false;
    
            Component clickedComponent = (Component) me.getSource();
    
            for (Component component : ComponentDrag.this.components) {
                if (component.equals(clickedComponent)) {
                    clickedRegisteredComponent = true;
                    break;
                }
            }
    
            if (clickedRegisteredComponent) {
                startingX = me.getX();
                startingY = me.getY();
                clickedComponent.setCursor(new Cursor(Cursor.MOVE_CURSOR));
            }
        }
    
        protected void componentDragged(MouseEvent me) {
            Component draggedComponent = (Component) me.getSource();
    
            if (firstTime && lastClickedContainer != null) {
                firstTime = false;
                lastClickedContainer.remove(draggedComponent);
                lastClickedContainer.revalidate();
                lastClickedContainer.repaint();
                glassPane.add(draggedComponent);
                glassPane.revalidate();
                glassPane.repaint();
                System.out.println("Removed from: " + lastClickedContainer + " \nAnd added to glasspane for dragging");
            }
    
            //MouseEvent will refire on each drag with the position being relative to the firing Component
            draggedComponent.setLocation((me.getX() - startingX) + draggedComponent.getLocation().x, (me.getY() - startingY) + draggedComponent.getLocation().y);
        }
    
        void registerComponent(JComponent draggableComp) {
            draggableComp.addMouseListener(ma);
            draggableComp.addMouseMotionListener(ma);
            components.add(draggableComp);
        }
    
        void deregisterComponent(JComponent draggableComp) {
            draggableComp.removeMouseListener(ma);
            draggableComp.removeMouseMotionListener(ma);
            components.remove(draggableComp);
        }
    }
    
    • 0
    • Reply
    • Share
      Share
      • Share on Facebook
      • Share on Twitter
      • Share on LinkedIn
      • Share on WhatsApp
      • Report

Sidebar

Related Questions

I have a Content Page with drop down lists within an update panel: <asp:UpdatePanel
I've a huge panel with drop-down lists and checkboxes. To manage them I have
I have a panel with a JTabbedpane and in every tab you can set
I set up a enable/disable button in an admin panel http://brettadamsga.com/development/madisonweddings/admin/clients.php The buttons work
I have a panel with controls in them. Controls are buttons and progressbars .
I have a page that has two drop down lists on it and a
I have a panel with a form that has a drop down list with
I have a panel whose items are a list and a panel like below
I have panel that is using group layout to organize some label. I want
I have Panel with a BottomToolbar . I want to add and remove dynamically

Explore

  • Home
  • Add group
  • Groups page
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Users
  • Help
  • SEARCH

Footer

© 2021 The Archive Base. All Rights Reserved
With Love by The Archive Base

Insert/edit link

Enter the destination URL

Or link to existing content

    No search term specified. Showing recent items. Search or use up and down arrow keys to select an item.