Java 为未定义数量的JLabel添加鼠标侦听器
我对鼠标听筒有点问题。我正在尝试将多个jlabel添加到JFrame中,这非常好。问题是,我还想向每个jlabel添加鼠标侦听器。但它不想这样工作,因为它抱怨变量不是final。有人能帮我吗 它在mouseEntered和mouseExited函数内部抱怨。在eclipse中,variable按钮高亮显示,它表示变量需要是最终变量 守则:Java 为未定义数量的JLabel添加鼠标侦听器,java,loops,for-loop,mouselistener,Java,Loops,For Loop,Mouselistener,我对鼠标听筒有点问题。我正在尝试将多个jlabel添加到JFrame中,这非常好。问题是,我还想向每个jlabel添加鼠标侦听器。但它不想这样工作,因为它抱怨变量不是final。有人能帮我吗 它在mouseEntered和mouseExited函数内部抱怨。在eclipse中,variable按钮高亮显示,它表示变量需要是最终变量 守则: public class OperatingScreen { public String ride; public static JFrame frame
public class OperatingScreen {
public String ride;
public static JFrame frame = new JFrame();
private static JPanel panel = new JPanel();
private static JPanel button_panel = new JPanel();
private static JLabel bg = new JLabel();
public OperatingScreen(String ride){
this.ride = ride;
frame.setTitle("Operating: " + ride);
panel.setLayout(null);
frame.add(panel);
frame.pack();
frame.setResizable(false);
frame.setDefaultCloseOperation(WindowConstants.HIDE_ON_CLOSE);
frame.setVisible(true);
bg.setIcon(createImageIcon("/background_operating.png", "background"));
bg.setBounds(1280, 720, 0, 0);
frame.add(bg);
//buttons.setBounds(100, 500, 1080, 40);
frame.setSize(1280, 720);
SocketHandler.initializeride(ride);
}
public void Initialize(String init){
String buttons2 = init.split("\\*")[1];
String[] buttons = buttons2.split("\\|");
for(int i = 2; i < buttons.length; i++){
String text = buttons[i].split("\\>")[0];
String color = buttons[i].split("\\>")[1].substring(0, 1).toUpperCase() + buttons[i].split("\\>")[1].substring(1);;
JLabel button = new JLabel();
button.setIcon(createImageIcon("/Button" + color + ".png", "blue"));
button.setText(text);
button.setForeground(Color.BLACK);
button.setFont(button.getFont().deriveFont(17.0f));
button.setBorder(LineBorder.createBlackLineBorder());
button_panel.add(button);
button.addMouseListener(new MouseListener(){
public void mouseClicked(MouseEvent arg0) {}
public void mouseEntered(MouseEvent arg0) {
//button.setIcon(createImageIcon("/Button" + color + ".png", "choose"));
}
public void mouseExited(MouseEvent arg0) {
//button.setIcon(createImageIcon("/Button" + color + ".png", "choose"));
}
public void mousePressed(MouseEvent arg0) {}
public void mouseReleased(MouseEvent arg0) {}
});
JOptionPane.showMessageDialog(HomeScreen.frame, text + " " + color);
}
JScrollPane jop = new JScrollPane(button_panel, JScrollPane.VERTICAL_SCROLLBAR_NEVER, JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
jop.setBounds(100, 500, 1080, 60);
jop.setBorder(null);
panel.add(jop);
jop.setOpaque(false);
jop.getViewport().setOpaque(false);
panel.setSize(1280, 720);
panel.setOpaque(false);
button_panel.setOpaque(false);
}
protected ImageIcon createImageIcon(String path,
String description) {
URL imgURL = getClass().getResource(path);
if (imgURL != null) {
return new ImageIcon(imgURL, description);
} else {
System.err.println("Couldn't find file: " + path);
return null;
}
}
}
公共类操作屏幕{
公共绳索骑乘;
公共静态JFrame=新JFrame();
私有静态JPanel panel=newjpanel();
私有静态JPanel按钮_面板=新JPanel();
私有静态JLabel bg=新JLabel();
公共操作屏幕(串乘){
这个。骑=骑;
帧。设置标题(“运行:+行驶”);
panel.setLayout(空);
框架。添加(面板);
frame.pack();
frame.setresizeable(false);
frame.setDefaultCloseOperation(WindowConstants.HIDE_ON_CLOSE);
frame.setVisible(true);
setIcon(createImageIcon(“/background_operating.png”,“background”);
背景退步(1280720,0,0);
帧。添加(bg);
//按钮.立根(100500108040);
帧设置大小(1280720);
SocketHandler.初始化(骑乘);
}
公共void初始化(字符串初始化){
字符串按钮2=init.split(“\\*”)[1];
String[]buttons=buttons2.split(“\\\\”);
对于(int i=2;i”[0];
字符串颜色=按钮[i]。拆分(\\>”[1]。子字符串(0,1)。toUpperCase()+按钮[i]。拆分(\\>”[1]。子字符串(1);;
JLabel按钮=新的JLabel();
button.setIcon(createImageIcon(“/button”+color+”.png,“blue”);
按钮.setText(文本);
按钮。设置前景(颜色。黑色);
button.setFont(button.getFont().deriveFont(17.0f));
setboorder(LineBorder.createBlackLineBorder());
按钮面板。添加(按钮);
button.AddMouseStener(新的MouseStener(){
public void mouseClicked(MouseEvent arg0){}
公共无效鼠标事件(鼠标事件arg0){
//button.setIcon(createImageIcon(“/button”+color+”.png”,“choose”);
}
public void mouseexitted(MouseEvent arg0){
//button.setIcon(createImageIcon(“/button”+color+”.png”,“choose”);
}
public void mousePressed(MouseEvent arg0){}
public void MouseEvent arg0{}
});
JOptionPane.showMessageDialog(HomeScreen.frame,文本+“”+颜色);
}
JScrollPane jop=新的JScrollPane(按钮面板,JScrollPane.VERTICAL滚动条从不,JScrollPane.HORIZONTAL滚动条总是);
作业立根数(100500108060);
作业订单(空);
面板。添加(jop);
jop.setOpaque(假);
jop.getViewport().setOpaque(false);
面板设置尺寸(1280720);
面板。设置不透明(假);
按钮面板。设置不透明(假);
}
受保护的ImageIcon CreateMageIcon(字符串路径,
(字符串描述){
URL imgURL=getClass().getResource(路径);
如果(imgURL!=null){
返回新的图像图标(imgURL,description);
}否则{
System.err.println(“找不到文件:+path”);
返回null;
}
}
}
您在这里做什么
button.addMouseListener(new MouseListener(){
public void mouseClicked(MouseEvent arg0) {}
...
正在创建一个。它有相同的限制,因为这样做:他们不能访问局部变量,如果他们不是final
或有效final
。但是,它可以自由访问封闭的类变量
因此,要访问一个变量(正如我所看到的,它是color
),您需要使它成为类变量,而不是局部变量(局部变量是您在循环体中创建的变量,它是,用于代码中的,它只在这个循环中“可见”,离开时会被销毁)或者按照您的建议将其定为最终版本
这样更改应该可以使其正常工作:
final String color = buttons[i].split("\\>")[1].substring(0, 1).toUpperCase() + buttons[i].split("\\>")[1].substring(1);
final JLabel button = new JLabel();
p.S.String color=buttons[i]。拆分(\\>”[1]。子字符串(0,1)。toUpperCase()+按钮[i]。拆分(\\>”[1]。子字符串(1)代码>-我想,一个
应该足够了。看起来您正在尝试处理mouseEntered和mouseExited以更改标签上的图标
您可以使用JButton并利用默认的滚动功能,而不是使用JLabel。您可以使按钮看起来像标签:
JButton button = new JButton(...);
button.setRolloverEnabled(true);
button.setRolloverIcon(...);
button.setBorderPainted( false );
button.setContentAreaFilled(false);
button.setFocusPainted(false);
好的,谢谢大家的评论和回答。我发现了问题所在,现在我只需要尝试解决它。问题是添加了按钮,但它们不在屏幕顶部。由于某些原因,背景将JLabel隐藏在下面。那么,为什么不让它们成为最终版本呢?@Seelenvirtuose我确实尝试过这个,但后来JLabel从框架中消失了。他们刚刚走了。通过做一个可变的决赛?不,那不可能。@Seelenvirtuose我会再试一次,但上次它真的不起作用了…@CiaranLichtenberg你能在你的问题中包括你尝试过的代码吗?一定要阅读最近的答案,以防你仍然有问题,他们可能会解决。