无法在MouseListener构造函数之外调用变量

时间:2012-11-18 08:48:40

标签: java variables constructor mouseevent mouselistener

我正在尝试使用Swing创建一个Java程序。我正在尝试完成的一件事是使用MouseListener获取JList中单击项的索引,并检索与数组索引关联的变量。我的问题是,当我尝试在MouseListener之外调用变量时,它不会被识别。我的代码是:

public class UserListPanel extends JPanel {

LibraryController ctrl = new LibraryController();
JScrollPane scrollpane;
public int userid;
public String userName;

public UserListPanel(final Borrower[] borrowersArray) {

    String userArray [] = new String [borrowersArray.length];
    for (int i = 0; i < userArray.length; i++) {
        userArray[i] = borrowersArray[i].getName();
    }

    JList userList = new JList(userArray);
    scrollpane = new JScrollPane(userList);
    this.add(scrollpane);

    // Adds a mouse click listener to assign values from the JList to a variable on click
    userList.addMouseListener(new MouseAdapter() {
        public void mouseClicked(MouseEvent evt) {
            JList userList = (JList)evt.getSource();
            if (evt.getClickCount() >= 0) {
                int index = userList.locationToIndex(evt.getPoint());
                ListModel dlm = userList.getModel();
                Object item = dlm.getElementAt(index);
                userList.ensureIndexIsVisible(index);
                userid = borrowersArray[index].getbID();
                userName = borrowersArray[index].getName();
                JOptionPane.showMessageDialog(null, userName);
            }
        }
    });
}

userid = borrowersArray[index].getbID();

}

在MouseListener构造函数中,我能够正确获取变量并将其存储在userid变量中,例如,我的JOptionPane通过返回一个数字来确认。 Hoewever,在构造函数之外,整数“索引”无法识别,因此如果我要调用userid,它将返回null。我如何获得MouseListener之外的索引副本?

2 个答案:

答案 0 :(得分:1)

如果您想要index mouseClicked方法(不是构造函数),那么您应该在mouseClicked方法之外对其进行初始化,并在mouseClicked方法中为其指定一个值,然后你就可以在构造函数之外得到index

您在index方法中声明并初始化mouseClicked,以便变量的范围达到mouseClicked方法,因此在其范围之外,即在{{1}之外,它不可用方法。

mouseClicked

答案 1 :(得分:0)

index变量在MouseListener实现中声明。因此,编译器不了解您尝试访问它的任何index变量。

要解决此问题,请尝试在Listener实现之外声明index

实施例

public class UserListPanel extends JPanel {

  LibraryController ctrl = new LibraryController();
  JScrollPane scrollpane;
  public int userid;
  public String userName;
  public int index ; //declare it as a global (member) variable
...
}