循环内的 MouseListener 不使用更新的变量值

MouseListener inside loop isnt using updated variable values

我想首先为我糟糕的英语道歉。 我制作了一些 JPanel,我将其放入一个 JPanel 中,最后一个 JPanel 将其放入一个 JScrollPane 中,每个 JPanel 都有一些 JLabel,其中包含 em 中的文本,我已经做到了,直到现在一切正常,然后我添加了一个 mouseListener System.out.print JLabel 中的文本。 文本不同,但在控制台上我得到相同的文本,这是我的代码:

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package testa;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.GridLayout; 
import java.io.IOException;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import java.awt.event.*;

public class Test extends JFrame{ //see https://www.javatpoint.com/java-naming-conventions

    private JLabel[] titles;
    private JLabel[] descriptions;
    private JPanel [] panels;
    private JScrollPane jScrollPane1;
    private JPanel bigPanel;
    private final static int NUM_OF_RESULTS =10;
String identifier ;
String title;
String authors;
String resume;
String references;
    public Test() throws IOException {

        setLocationRelativeTo(null);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setSize(1000,500);            
        //jScrollPane1.setSize(1000, 500);    and layouts. see following comments

        bigPanel = new JPanel();
        bigPanel.setBounds(30, 90, 950, 400);
        //set layout to
        GridLayout layout = new GridLayout(NUM_OF_RESULTS, 0);
        bigPanel.setLayout(layout);
        jScrollPane1 = new JScrollPane(bigPanel);
        jScrollPane1.setBounds(30, 90, 950, 400);
        getContentPane().add(jScrollPane1);

        requetezQuery();
        //pack(); //see 
        setVisible(true); //set visible typically comes last
    }
    public void requetezQuery() {

int actual=0;






        titles = new JLabel[NUM_OF_RESULTS];
        descriptions = new JLabel[NUM_OF_RESULTS];
        panels = new JPanel[NUM_OF_RESULTS];

        for(int i = 0; i<NUM_OF_RESULTS; i++){



                         title = "Title "+i;
                      resume = "Description "+i ;


            titles[i]= new JLabel();
            descriptions[i]= new JLabel();
            panels[i]= new JPanel();
            panels[i].setPreferredSize(new Dimension(250, 50));
            panels[i].setLayout(new FlowLayout()); //FlowLayout is default for JPanel
            titles[i].setText(title);

            descriptions[i].setText(resume.substring(0, Math.min(resume.length(), 100))+"...");
            titles[i].setForeground(Color.blue);
            descriptions[i].setForeground(Color.black);
            titles[i].addMouseListener(new MouseAdapter() { 
          public void mouseClicked(MouseEvent me) { 
            System.out.println(title);
          } 
        });
            panels[i].add(titles[i]);
            panels[i].add(descriptions[i]);
            bigPanel.add(panels[i],i, 0);

        }

    }


    public static void main(String args[]) throws IOException{
        new Test();
    }
}

我相信您对标题的引用是指运行时最后创建的标题。要解决此问题,您可以做的不是打印标题,而是打印标签文本。尝试将其放入您的 mouseClicked 方法中。

JLabel obj = (JLabel) me.getSource();
System.out.println(obj.getText());

你的鼠标点击事件引用变量来自外部class:

    addMouseListener(new MouseAdapter() { 
      public void mouseClicked(MouseEvent me) { 
        System.out.println(title); // This `title` is a reference of Test.title variable
      } 
    });

所以你的所有 MouseAdapter 引用相同的 title(其值被每个循环替换)-> System.out.println 都打印相同的最后一个标题。