0

次の問題があります。フレームに 2 つの JList があります。

    listModel = new DefaultListModel();
    ownlistModel = new DefaultListModel();
    fillList();


    ownBookList = new JList(ownlistModel);
    ownBookList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
    ownBookList.setLayoutOrientation(JList.VERTICAL);
    ownBookList.setSelectedIndex(-1);



    userlist = new JList(listModel);
    userlist.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
    userlist.setLayoutOrientation(JList.VERTICAL);
    userlist.setSelectedIndex(0);

現在、これらは相互に排他的であるため、誰かが一方のリストのアイテムをクリックすると、もう一方のリストの以前の選択がクリアされます。

  ls2Handler = new ListSelectionListener(){
            @Override
                public void valueChanged(ListSelectionEvent e) {
              if (e.getValueIsAdjusting() == false) {


            //  System.out.println(ownBookList.getSelectedValue().toString().length());
                 Global.selectedUser =  ownBookList.getSelectedValue().toString();
                 Global.selectedIndex = ownBookList.getSelectedIndex();
             userlist.clearSelection();
                  updateFields(Global.selectedUser, 1);

              }


        }
    };

        lsHandler = new ListSelectionListener() {

            @Override
            public void valueChanged(ListSelectionEvent e) {
                  if (e.getValueIsAdjusting() == false) {

                //  System.out.println(userlist.getSelectedValue().toString().length());

                      Global.selectedUser =  userlist.getSelectedValue().toString();
                     Global.selectedIndex = userlist.getSelectedIndex();
                   ownBookList.clearSelection();
                      updateFields(Global.selectedUser, 0);
                  }


            }
            };


        userlist.addListSelectionListener(lsHandler);
        ownBookList.addListSelectionListener(ls2Handler);

値を調整する関数を呼び出すと、常に nullpointerException が発生します。

スレッド「AWT-EventQueue-0」での例外 java.lang.NullPointerException at Books$3.valueChanged(Books.java:199) at javax.swing.JList.fireSelectionValueChanged(Unknown Source)

何故ですか?ご覧のとおり、それらは宣言されており、アクセスできるはずです。

4

2 に答える 2

4

getSelectedValue()メソッドはを返すことができ、あなたはそのオブジェクトnullを呼び出していますtoString()null

userlist.getSelectedValue().toString();

そのメソッドのドキュメントを参照してください。

選択した最小のセルインデックスの値を返します。リストで1つのアイテムのみが選択されている場合に選択された値。複数の項目が選択されている場合、それは単に選択された最小のインデックスの値です。選択がない場合はnullを返します。

Bまた、リストで何かを選択するときにリストでの選択をクリアするため、Aすぐにこの例外が発生します。

于 2012-08-30T06:24:38.217 に答える
3

ロビンのおかげで、私はそれを理解しました。メソッド clearselection() がリスナーをトリガーすることを知りませんでした。それは速くて汚いですが、うまくいきます:

    ls2Handler = new ListSelectionListener(){
        @Override
            public void valueChanged(ListSelectionEvent e) {
          if (e.getValueIsAdjusting() == false) {

              if (ownBookList.getSelectedValue()!=null) {
                  userlist.clearSelection();
                  Global.selectedUser =  ownBookList.getSelectedValue().toString();
                  Global.selectedIndex = ownBookList.getSelectedIndex();
                  updateFields(Global.selectedUser);
              }

                else {

                    }

          }

    }
};

    lsHandler = new ListSelectionListener() {

        @Override
        public void valueChanged(ListSelectionEvent e) {
              if (e.getValueIsAdjusting() == false) {

                  if (userlist.getSelectedValue()!=null) {
                     ownBookList.clearSelection();
                      Global.selectedUser =  userlist.getSelectedValue().toString();
                      Global.selectedIndex = userlist.getSelectedIndex();
                      updateFields(Global.selectedUser);


                  }
                  else {

                  }
              }


        }
        };

再度、感謝します!

于 2012-08-30T07:37:48.663 に答える