0

JTableのポップアップメニューに問題があり、このJTableで複数の間隔を選択できるという事実があります。私の状況を詳しく説明し、できればできるだけ明確にします。

私は基本的なデータクラスを持っています。それをItemと呼び、文字列ID(名前)と2つのブールフィールド、onlineおよびactive(相対ゲッター)を使用します。
JTableの背後にある考え方は、データセット内の各アイテムについて、最初の列に名前を表示し、2番目の列にステータスを表示するというものです。「status」とは、「ACTIVE/NOTACTIVE」を意味します。アイテムがオンラインの場合は「オフライン」と表示されます。私はその仕事をするTableModelを実装しました、そしてそれは働きます。

また、ユーザーが行を右クリックすると、ポップアップが表示され(選択したアイテムがオンラインの場合)、ステータスに応じてアイテムをアクティブ化/非アクティブ化できるようにします。これは、選択モデルがSINGLE SELECTIONである限り完全に機能しましたが、MULTIPLE INTERVALS SELECTIONに変更すると、正しく機能しなくなりました。

私が望む動作は、右クリックすると、クリックが実行された場所にポップアップが表示され、行が選択範囲に追加されて強調表示され、以前に選択されたすべての行が選択されたままになることです。これはなんとかできません!

これが私が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);

行を右クリックするとポップアップが表示されますが、クリックした行は無視されます。

一方、コメントがない場合、その行はクリックされた行のみを選択し、残りの選択はすべて失われます。

長い投稿で申し訳ありませんが、私の状況の詳細をすべて説明せずに問題を説明する方法がわかりませんでした....これは些細なことであり、修正/変更する方法を教えていただければ幸いです。

前もって感謝します。

4

1 に答える 1

3

答えの一部は次のとおりです。

if (tblModel.isSelectedIndex(r)) {
   tblModel.removeSelectionInterval(r, r);
} else {
   tblModel.addSelectionInterval(r, r);
}
于 2012-01-03T16:18:29.873 に答える