循环内的 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
都打印相同的最后一个标题。
我想首先为我糟糕的英语道歉。 我制作了一些 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
都打印相同的最后一个标题。