2012-01-03 10 views
0

JTableのポップアップメニューに問題があり、このJTableで複数の間隔の選択が可能であるという問題があります。 私は自分の状況を可能な限り明確に説明し、うまく説明するつもりです。右クリック時の多重選択とJPopupMenu

私は基本的なデータクラスを持ち、文字列id(name)と2つのブール型フィールドonlineactive(相対ゲッターを持つ)を使ってItemを呼び出すことができます。
JTableの背後にあるアイデアは、データセット内の各項目について、最初の列に名前が表示され、2番目の列にステータスが表示されます。「ステータス」とは、「アクティブ/アイテムがオンラインの場合は「アクティブ」、それ以外の場合は「オフライン」と表示されます。 私はジョブを実行するTableModelを実装しています。

また、ユーザーが行を右クリックしたときに、その状況に応じてアイテムのアクティブ化/非アクティブ化を可能にするポップアップが表示されます(選択したアイテムがオンラインの場合)。 セレクションモデルがシングルセレクションだった限り、これは完全に機能しましたが、マルチインターバルセレクションに変更したとき、もう正常に動作しなくなりました。

右クリックでクリックが実行された場所に行が追加され、強調表示され、以前選択された行がすべて選択されたままになるという動作が必要です。これは私がすることができない!ここで

は私がのMouseListenerを持っているコードです:

tblModel.addMouseListener(new MouseAdapter() { 
    void showPopup(MouseEvent e){ 
      int r = tblModel.rowAtPoint(e.getPoint()); 
      if (r >= 0 && r < tblModel.getRowCount()) { 
        //tblModel.setRowSelectionInterval(r, r); 
       } else { 
        tblModel.clearSelection(); 
       } 
      int[] viewRowIndexes = tblModel.getSelectedRows();   
      int rowViewIndex = tblModel.getSelectedRow(); 

      if (rowViewIndex < 0) 
       return; 

      int rowModelIndex = tblModel.convertRowIndexToModel(rowViewIndex); 
      if (e.isPopupTrigger() && e.getComponent() instanceof JTable) { 
       Action changeActiveAction; 
       Action changeInactiveAction; 
       List<String> actives = new ArrayList<String>(); 
       List<String> inactives = new ArrayList<String>(); 
       DefaultListSelectionModel selectionModel = (DefaultListSelectionModel) tblModel.getSelectionModel(); 

       for (int viewRowIndex : viewRowIndexes) { 
        int modelRowIndex = tblModel.convertRowIndexToModel(viewRowIndex); 
        if (selectionModel.isSelectedIndex(viewRowIndex)) { 
         boolean online = ((MyTableModel) tblModel.getModel()).isItemOnline(modelRowIndex); 
         if (!online) 
          continue; 

         boolean active = ((MyTableModel) tblModel.getModel()).isItemActive(modelRowIndex); 
         String idItem = (String) ((MyTableModel) tblModel.getModel()).getValueAt(modelRowIndex,0); 
         if (active) { 
          actives.add(idItem); 
         } else { 
          inactives.add(idItem); 
         } 
        } 
       } 

       if (actives.size() > 0 || inactives.size() > 0) { 
        popup = new JPopupMenu(); 
        if (actives.size() > 0) { 
         changeActiveAction = new ChangeAction("Deactivate ACTIVE Items","This will deactivate all the selected ACTIVE items",actives, false); 
         popup.add(new JMenuItem(changeActiveAction)); 
        } 
        if (inactives.size() > 0) { 
         changeInactiveAction = new ChangeAction("Activate INACTIVE Items","This will activate all the selected INACTIVE items",inactives, true); 
         popup.add(new JMenuItem(changeInactiveAction)); 
        } 
        popup.show(e.getComponent(), e.getX(),e.getY()); 
       } 
      } 
    } 
    @Override 
    public void mousePressed(MouseEvent e) { 
     showPopup(e); 
    } 

    @Override 
    public void mouseReleased(MouseEvent e) { 
     showPopup(e); 
    } 
}; 

動作は機能的に正しいですが、行の選択が機能していません。私は、行を右クリックしたときに が

//tblModel.setRowSelectionInterval(r, r); 

行をコメントした、ポップアップが表示されますが、それは私がクリックした行を無視します。一方

、コメントのない場合は、その行が選択範囲のすべての残りの部分を失うだけクリックされた行を選択します....

私は長い記事のために申し訳ありませんが、私は知りませんでしたどのように私の状況をすべての詳細を与えることなく私の問題を説明する.... うまくいけば、これは些細なことです、あなたは私がそれを修正/変更する方法を教えてください。

ありがとうございます。答えの

+1

1)早いほど良いのヘルプについては、[SSCCE](http://sscce.org/)を投稿してください。 2)* "以前に選択されたすべての行" *私たちに迷惑をかけないでください。 3)*「長いポストのために申し訳ありません」* IMO特に長いわけではありません。 –

+0

1)私はすでにコードを簡略化し、それを "コンパイル可能"にするためにもっと3つのクラスを投稿していたはずです。 2)あなたは正しく編集されています。 3)知っておきたいこと: – mdm

答えて

3

一部は次のとおりです。

if (tblModel.isSelectedIndex(r)) { 
    tblModel.removeSelectionInterval(r, r); 
} else { 
    tblModel.addSelectionInterval(r, r); 
} 
+0

ListSelectionModelを使うための+1。 – camickr

関連する問題