user3820292
user3820292

Reputation: 310

Detect which JLabel is clicked

I have a JLabel[10] and I want to detect which label has been clicked and print which label of the label that has been clicked.

  1. I created a JLabel array of 10.
  2. Wrote a for loop to place an Image to every position of the label.
  3. Added a MouseListener to check which label has been clicked.

The problem is I can't do this to get the source of my jLabelArr. The program will ask me to change my it to final.

   if(e.getSource() == jLabelArr[i]) 

Full code

import java.awt.FlowLayout;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class JavaLabels extends JFrame {

private JLabel[] jLabelArr;
private JPanel jLabelPanel = new JPanel();

    public JavaLabels() {
        setLayout(new FlowLayout());
        jLabelArr = new JLabel[10];
        for(int i =0; i < 10; i++) {

            jLabelArr[i] = new JLabel(new ImageIcon("resources/image"));
            jLabelPanel.add(jLabelArr[i]); 

            jLabelArr[i].addMouseListener(new MouseAdapter() {
                @Override
                public void mouseClicked(MouseEvent e) {
                    if(e.getSource() == jLabelArr[i]) {
                        System.out.println("Label" + i + "was clicked");
                    }
                }
            });
        }
        add(jLabelPanel);
        setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        pack();
        setSize(400,600);
        setLocationRelativeTo(null);
        setVisible(true);
    }
    public static void main(String[] args) {
        new JavaLabels();
    }
}

Upvotes: 2

Views: 4916

Answers (2)

A Stranger
A Stranger

Reputation: 551

1

public class JavaLabels extends JFrame {

    private JLabel[] jLabelArr;
    private JPanel jLabelPanel = new JPanel();

    public JavaLabels() {
        setLayout(new FlowLayout());
        jLabelArr = new JLabel[10];
        for (int i = 0; i < 10; i++) {

            jLabelArr[i] = new JLabel(new ImageIcon("resources/image"));
            jLabelPanel.add(jLabelArr[i]);

            jLabelArr[i].addMouseListener(new MouseAdapter() {
                @Override
                public void mouseClicked(MouseEvent e) {
                    onMouseClicked(e);
                }
            });
        }
        add(jLabelPanel);
        setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        pack();
        setSize(400, 600);
        setLocationRelativeTo(null);
        setVisible(true);
    }

    private void onMouseClicked(MouseEvent e) {
        for (int i = 0; i < 10; i++)
            if (e.getSource() == jLabelArr[i]) {
                System.out.println("Label" + i + "was clicked");
            }
    }

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

2

Implement MouseListener to JavaLabels class and jLabelArr[i].addMouseListener(this);

Upvotes: 2

Jonathan Solorzano
Jonathan Solorzano

Reputation: 7022

For what you wanted there's nothing more than create a final int variable that will equal to the position of the for cycle

import java.awt.FlowLayout;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class JavaLabels extends JFrame {

private JLabel[] jLabelArr;
private JPanel jLabelPanel = new JPanel();

    public JavaLabels() {
        setLayout(new FlowLayout());
        jLabelArr = new JLabel[10];
        for(int i =0; i < 10; i++) {

            jLabelArr[i] = new JLabel(new ImageIcon("resources/image"));
            jLabelPanel.add(jLabelArr[i]); 
            final int p = i;
            jLabelArr[i].addMouseListener(new MouseAdapter() {
                @Override
                public void mouseClicked(MouseEvent e) {
                    System.out.println("Label" + p + "was clicked");
                }
            });
        }
        add(jLabelPanel);
        setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        pack();
        setSize(400,600);
        setLocationRelativeTo(null);
        setVisible(true);
    }
    public static void main(String[] args) {
        new JavaLabels().setVisible(true);
    }
}

-> if(e.getSource() == jLabelArr[i]) is not needed in this case

Upvotes: 4

Related Questions