1

行の任意の場所をクリックしてJTree行を選択できるようにするコードをここから取得しました。単一行選択モードで正常に機能します。ただし、複数の行の選択を処理するためにそれを変更する方法がわかりません。ユーザーが複数選択を行っている場合をどのように区別しますか(たとえば、Shiftボタンまたはコントロールボタンを押しながら行をマウスで左クリックするなど)?

インポートjava.awt.Rectangle;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;

インポートjavax.swing.JFrame;
インポートjavax.swing.JTree;
インポートjavax.swing.SwingUtilities;
インポートjavax.swing.tree.DefaultMutableTreeNode;
インポートjavax.swing.tree.TreeNode;


@SuppressWarnings( "シリアル")
パブリッククラスNavTreeはJTreeを拡張します{

    プライベートブール値fWholeRowSelectionEnabled;
    プライベートMouseListenerfRowSelectionListener;
    最終的なNavTreefThis;

    public NavTree(TreeNode rootNode){
        super(rootNode);
        fThis = this;
        初期化();
    }
    public NavTree(){
        fThis = this;
        初期化();
    }

    private void init(){
        // setCellRenderer(new NavTreeCellRenderer());
        fRowSelectionListener = new MouseAdapter(){

            public void mousePressed(MouseEvent e){
                if(SwingUtilities.isLeftMouseButton(e)){
                    int closeRow = fThis.getClosestRowForLocation(
                            e.getX()、e.getY());
                    長方形closestRowBounds=fThis.getRowBounds(closestRow);
                    if(e.getY()> = closeRowBounds.getY()&&
                            e.getY()<closestRowBounds.getY()+
                            closeRowBounds.getHeight()){
                        if(e.getX()> closeRowBounds.getX()&&
                                closeRow <fThis.getRowCount()){

                                                    fThis.setSelectionRow(closestRow);
                                                }

                    } そうしないと
                        fThis.setSelectionRow(-1);
                }
            }

        };
        setWholeRowSelectionEnabled(true);
    }

    public void setWholeRowSelectionEnabled(boolean WholesaleRowSelectionEnabled){
        fWholeRowSelectionEnabled = WholesaleRowSelectionEnabled;
        if(fWholeRowSelectionEnabled)
            addMouseListener(fRowSelectionListener);
        そうしないと
            removeMouseListener(fRowSelectionListener);
    }

    public boolean isWholeRowSelectionEnabled(){
        fWholeRowSelectionEnabledを返します。
    }

    public static void main(String [] args){
        JFrameフレーム=新しいJFrame();
        DefaultMutableTreeNode root = new DefaultMutableTreeNode( "Root");
        root.add(new DefaultMutableTreeNode( "Child 1"));
        root.add(new DefaultMutableTreeNode( "Child 2"));
        root.add(new DefaultMutableTreeNode( "Child 3"));
        NavTreeツリー=新しいNavTree(ルート);
        frame.add(tree);
        frame.setSize(200、300);
        frame.setVisible(true);
    }
}
4

2 に答える 2

3

の修飾キー情報を使用しますMouseEvent。詳細については、を参照MouseEvent#getModifiersExしてください

于 2012-06-06T06:00:56.090 に答える
1

PS:リスナー登録にバグが含まれています

public void setWholeRowSelectionEnabled(boolean wholeRowSelectionEnabled) {
    fWholeRowSelectionEnabled = wholeRowSelectionEnabled;
    if (fWholeRowSelectionEnabled)
        addMouseListener(fRowSelectionListener);
    else
        removeMouseListener(fRowSelectionListener);
}

プロパティwholeRowSelectionEnabledを設定するとtrue、リスナーは1回だけ登録されます。プロパティがtrue複数回設定されている場合、コードはリスナーを何度も追加します。私が言いたいのは、プロパティセッターはべき等でなければならないということです

クイックフィックスは、最初にそれを削除し、有効になっている場合は追加することです。

public void setWholeRowSelectionEnabled(boolean wholeRowSelectionEnabled) {
    removeMouseListener(fRowSelectionListener);
    fWholeRowSelectionEnabled = wholeRowSelectionEnabled;
    if (fWholeRowSelectionEnabled)
        addMouseListener(fRowSelectionListener);
}
于 2017-04-19T11:59:50.640 に答える