Java 为未定义数量的JLabel添加鼠标侦听器

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

我对鼠标听筒有点问题。我正在尝试将多个jlabel添加到JFrame中,这非常好。问题是,我还想向每个jlabel添加鼠标侦听器。但它不想这样工作,因为它抱怨变量不是final。有人能帮我吗

它在mouseEntered和mouseExited函数内部抱怨。在eclipse中,variable按钮高亮显示,它表示变量需要是最终变量

守则:

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你能在你的问题中包括你尝试过的代码吗?一定要阅读最近的答案,以防你仍然有问题,他们可能会解决。