1

Swing を利用した Java プログラムを作成しようとしています。私が達成しようとしていることの 1 つは、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 は数値を返すことでこれを確認します。ただし、コンストラクターの外では、整数の「インデックス」は認識されないため、userid を呼び出すと、null が返されます。インデックスのコピーを MouseListener の外に置くにはどうすればよいですか?

4

2 に答える 2

1

(コンストラクターではなく)index外部メソッドが必要な場合は、メソッドの外部で初期化し、メソッドの内部に値を割り当てる必要があります。そうすれば、コンストラクターの外部でそれを取得できるようになります。mouseClickedmouseClickedmouseClickedindex

indexメソッド内で宣言および初期化しmouseClickedて、変数のスコープがmouseClickedメソッドに依存するようにします。したがって、変数のスコープ外、つまりmouseClickedメソッド外では使用できません。

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

      ..... all other stuff
}
于 2012-11-18T08:55:10.617 に答える
0

index変数はMouseListener実装内で宣言されます。indexしたがって、コンパイラは、アクセスしようとしている変数を認識しません。

この問題を解決するindexには、Listener 実装の外側を宣言してみてください。

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
...
}
于 2012-11-18T09:02:06.813 に答える