ツリーの外側の任意の場所をクリックしJTreeのからの選択を解除したノード

ダニエル・ロサノ:

私が使用していますJTree使用しています、DefaultTreeModelこのツリーモデルは、内部のいくつかのノードを持っている、と私はノードをクリックしたとき、私はノードの情報を取得し、私は、このノードが選択されていることを示すために、背景色を変更します。

私は木のうち任意の場所をクリックしたときに選択をクリアするには、ツリーを呼び出すことが可能ですか?選択をクリアすることによって、私は再び背景色を変更することができますが、私は使用する方法や場所を知らないclearSelection()私は、ツリーの外をクリックすると、ツリーの方法を。

ここで私が使用していたコードは次のようになります。

例:

import javax.swing.*;
import javax.swing.tree.*;
import java.awt.*;

public class JTreeSelectDeselect {

    public static void main(String[] args) {
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);

        JPanel panel = new JPanel(new BorderLayout());
        JTree tree = new JTree();
        tree.setCellRenderer(new DeselectTreeCellRenderer());

        panel.add(tree, BorderLayout.LINE_START);
        panel.add(new JScrollPane(new JTextArea(10, 30)));
        frame.add(panel);

        frame.pack();
        frame.setVisible(true);
    }
}

class DeselectTreeCellRenderer extends DefaultTreeCellRenderer {

    @Override
    public Color getBackgroundSelectionColor() {
        return new Color(86, 92, 160);
    }

    @Override
    public Color getBackground() {
        return (null);
    }

    @Override
    public Color getBackgroundNonSelectionColor() {
        return new Color(23, 27, 36);
    }

    @Override
    public Component getTreeCellRendererComponent(JTree tree, Object value,
            boolean sel, boolean exp, boolean leaf, int row, boolean hasFocus) {
        super.getTreeCellRendererComponent(tree, value, sel, exp, leaf, row, hasFocus);

        setForeground(new Color(225, 225, 221, 255));
        setOpaque(false);

        return this;
    }
}

私は、ノードを作成して、ツリーモデルを使用してツリーに追加する方法ここに示していると私は私のカスタムを設定する方法TreeCellRenderer

セルレンダラーでIは、特定の色で選択されたノードをペイントし、ノードの選択が解除された場合、私は別の色を使用して描きます。私は、ノードの選択を変更すると、その背景が正しく塗装されていますが、私は、ツリーの外側をクリックしたときにそれは、セルレンダラーに設立された特定の色で塗られていないので、選択されたノードは、選択解除されていません。

私は、ツリーの外側をクリックしたときにノードの選択を解除する方法はありますか?

誰かが知っているだけの場合と、からチェックボックスで葉の一部を変更する方法はありますかTreeCellRendererチェックボックスなどのラベルや他のいくつかのように、いくつかの子供を持っています。私は、チェックボックスを追加しようとするので、それは、チェックボックスがされていないこと(私は期待通りに)言うDefaultMutableTreeNodeオブジェクトと私はツリーモデルに追加することはできません。

ジョン・M:

まず第一に、あなたは、あなただけのいくつかの色を変更したい場合はDefaultTreeCellRendererのサブクラスを作成する必要はありません。あなたは、新しいものを作成するあなたが望むような色を設定し、ツリーにそれを設定することができます。以下のサンプルコードでは、私は)(getDefaultTreeCellRendererでこれをやりました。

あなたのパネルには、二つの要素ツリーとテキスト領域が含まれています。あなたは私が木にマウスリスナーとフォーカスリスナーを追加して必要なものを達成するには:

  • マウスリスナー-のmouseClickedには、()トリガされ、両方のツリーの内側または外側をクリックしたときに(ただし、TextArea内、我々がフォーカスリスナーを持っているため)。あなたは私たちがtree.getRowForLocation(e.getX()、e.getYを())を使用し、セルの境界でクリックしたかどうかをチェックし、それが返された場合、我々は選択を解除することができますので、-1、この手段は、私たちは外の任意のセルをクリックしたために、
  • フォーカスリスナー - あなたがJTreeのからフォーカスを失うと、テキスト領域をクリックしたときに、これがトリガされますと、私たちは選択を解除

我々は最初のものがトリガされますので、両方のリスナーを必要なだけあなたは木の上やその周りが、クリックしたときではない、それあなたがテキストエリアのツリーエリアとフォーカスのうち焦点を当てたときにテキスト領域と第2の1がトリガされます。

import javax.swing.*;
import javax.swing.tree.DefaultTreeCellRenderer;
import java.awt.*;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;

public class JTreeSelectDeselect {

    public static void main(String[] args) {
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);

        JPanel panel = new JPanel(new BorderLayout());
        JTree tree = new JTree();

        tree.setCellRenderer(getDefaultTreeCellRenderer());
        tree.addMouseListener(getMouseListener(tree));
        tree.addFocusListener(getFocusListener(tree));

        panel.add(tree, BorderLayout.LINE_START);
        panel.add(new JScrollPane(new JTextArea(10, 30)));
        frame.add(panel);

        frame.pack();
        frame.setVisible(true);
    }

    private static DefaultTreeCellRenderer getDefaultTreeCellRenderer() {
        DefaultTreeCellRenderer defaultTreeCellRenderer = new DefaultTreeCellRenderer();
        defaultTreeCellRenderer.setBackgroundSelectionColor(new Color(86, 92, 160));
        defaultTreeCellRenderer.setBackgroundNonSelectionColor(new Color(135, 151, 53));
        defaultTreeCellRenderer.setBackground(new Color(225, 225, 221, 255));
        defaultTreeCellRenderer.setForeground(new Color(225, 225, 221, 255));
        return defaultTreeCellRenderer;
    }

    private static FocusListener getFocusListener(final JTree tree) {
        return new FocusListener() {
            @Override
            public void focusGained(FocusEvent e) {

            }

            @Override
            public void focusLost(FocusEvent e) {
                System.out.println("focus lost");
                tree.clearSelection();
            }
        };
    }

    private static MouseListener getMouseListener(final JTree tree) {
        return new MouseListener() {
            @Override
            public void mouseClicked(MouseEvent e) {
                System.out.println("mouse clicked");
                if(tree.getRowForLocation(e.getX(),e.getY()) == -1) {
                    System.out.println("clicked outside a specific cell");
                    tree.clearSelection();
                }
            }

            @Override
            public void mousePressed(MouseEvent e) {

            }

            @Override
            public void mouseReleased(MouseEvent e) {

            }

            @Override
            public void mouseEntered(MouseEvent e) {

            }

            @Override
            public void mouseExited(MouseEvent e) {

            }
        };
    }
}

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=167897&siteId=1