Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Get component under mouseReleased

Tags:

java

swing

I am trying to do something similar to this: Swing - Get new component under mouseReleased

In a window, I have some buttons with a number on each one. For example 2 8 5 6. This would show 4 JButtons. If I press the mouse on 2, drag and release on 8... I'd like firstcomponent to contain the JButton 2 and lastcomponent to contain the JButton with 8.

public class Bouton extends JButton implements MouseListener {

String name;
Component firstEntered; 
Component lastEntered;

public Bouton(String str) {
    super(str);
    this.name = str;
    this.addMouseListener(this);
}

@Override
public void mouseClicked(MouseEvent event) { }

 @Override
 public void mouseEntered(MouseEvent event) { 
     lastEntered = event.getComponent();
     String name2 = ((JButton) lastEntered).getName();
     System.out.println("entered : " + name2);
}

@Override
public void mouseExited(MouseEvent event) { 
    firstEntered = event.getComponent();
}

@Override
public void mousePressed(MouseEvent event) { 
    // I tried this didn't work...
    //firstEntered = event.getComponent();
}


@Override
public void mouseReleased(MouseEvent event) { 
    firstEntered.setBackground(Color.RED);
    lastEntered.setBackground(Color.BLUE);

    String name = ((JButton) firstEntered).getName();
    String name2 = ((JButton) lastEntered).getName();
    System.out.println("Release ... first: " + name);
    System.out.println("Release ... last entered: " + name2);
}    

@Override
public String getName() {
    return name;
}

}

The output is :

entered : 2
entered : 8
Release ... first: 2
Release ... last entered: 2

My problem is I don't understand why "Release ... last entered: 2" shows 2. Why it isn't 8 ?

Thanks

like image 755
Mymozaaa Avatar asked Mar 19 '26 12:03

Mymozaaa


1 Answers

Every Bouton you add has it's own firstEntered and lastEntered, therefore it can only correctly print out the current button (this). My suggestion would be to create only one new instance of a MouseListener, I don't think there's a need to make an own JButton: (The mousePressed() method also works properly now)

import java.awt.Color;
import java.awt.Component;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class Example {

    public static void main(String[] args) {

        JFrame frame = new JFrame();

        JPanel p = new JPanel();

        MyMouseListener ml = new MyMouseListener(); // Only one MouseListener
        for (int i = 0; i < 8; i++) {
            JButton b = new JButton(String.valueOf(i));
            b.addMouseListener(ml); // Add the same MouseListener to every
                                    // button
            p.add(b);
        }
        frame.setContentPane(p);

        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(500, 500);
        frame.setVisible(true);

    }

    public static class MyMouseListener implements MouseListener {

        Component firstEntered;
        Component lastEntered;

        @Override
        public void mouseClicked(MouseEvent event) {

        }

        @Override
        public void mouseEntered(MouseEvent event) {
            lastEntered = event.getComponent();
            System.out.println("entered : " + ((JButton) lastEntered).getText());
        }

        @Override
        public void mouseExited(MouseEvent event) {

        }

        @Override
        public void mousePressed(MouseEvent event) {
            firstEntered = event.getComponent();
            System.out.println("pressed : " + ((JButton) event.getComponent()).getText());
        }

        @Override
        public void mouseReleased(MouseEvent event) {
            firstEntered.setBackground(Color.RED);
            lastEntered.setBackground(Color.BLUE);

            System.out.println("Release ... first: " + ((JButton) firstEntered).getText());
            System.out.println("Release ... last entered: " + ((JButton) lastEntered).getText());
        }
    }

}
like image 108
Lukas Rotter Avatar answered Mar 22 '26 01:03

Lukas Rotter