2

CheckBoxTree コンポーネントを使用して、チェックボックスを備えた特別な種類の JTree を取得しています。ただし、高レベルのノードにチェックボックスを付けないようにしたいのは、チェックする必要がないためです。それらは単なる「ブランチの名前」です。ツリーの簡単な例を次に示します。

メタデータ - 製品 - 製品 A - 製品 B - その他 - モデル - その他

したがって、ノード「メタデータ」はツリーモデルのルートです。このノードは、(JTree のように) 便利な setRootVisible メソッドが利用できるため、非表示になります。しかし、ルートを非表示にするだけでなく、第 2 レベルのチェックボックスも削除したいと考えています。したがって、基本的に、prod A、prod B などのレベルからのチェックボックスのみが存在する必要があります (数レベル下になる可能性があります)。しかし、それでもレベル 2 のラベルが必要です。

チェックボックスツリーコンポーネントを説明するこのサイトに従って、カスタム CheckboxTreecellRenderer を実装してみました:

http://www.javaworld.com/javaworld/jw-09-2007/jw-09-checkboxtree.html?page=3

残念ながら、これは機能しません。サイトの例と比較して、ラベルとボタンの追加を移動してみました (ラジオ ボタンは使用しません。単純にするためにラベルを削除するために使用しますが、それでもこれを何らかの形で機能させる場合は、チェックボックスを使用してください)。ノードが親としてメタデータ ノードを持っている場合にのみボタンを設定しようとするためにそれらを移動し、2 番目のレベルからボタンを削除しました。

しかし、これはうまくいきませんでした。驚いたことに、button.setEnabled(false); (以下にコメントアウト)は機能します。これにより、正しいレベルのボタンが無効になります。しかし、そこにボタンを追加しないようにすると、どこにもボタンが表示されません...

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package se.expertinfo.ditaplugin;

import it.cnr.imaa.essi.lablib.gui.checkboxtree.CheckboxTree;
import it.cnr.imaa.essi.lablib.gui.checkboxtree.CheckboxTreeCellRenderer;
import it.cnr.imaa.essi.lablib.gui.checkboxtree.TreeCheckingModel;
import java.awt.Color;
import java.awt.Component;
import java.awt.FlowLayout;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import javax.swing.JTree;
import javax.swing.UIManager;
import javax.swing.tree.TreePath;

/**
 *
 * @author Anders
 */
public class CustomTreeCellRenderer implements CheckboxTreeCellRenderer {

    JPanel panel = new JPanel();
    JLabel label = new JLabel();
    JRadioButton button = new JRadioButton();

    public CustomTreeCellRenderer() {
        label.setFocusable(true);
        label.setOpaque(true);
        panel.setLayout(new FlowLayout(FlowLayout.LEFT, 0, 0));
//        panel.add(button);
//        panel.add(label);
        button.setBackground(UIManager.getColor("Tree.textBackground"));
        panel.setBackground(UIManager.getColor("Tree.textBackground"));
    }

    @Override
    public Component getTreeCellRendererComponent(JTree tree, Object value, boolean selected, boolean expanded, boolean leaf, int row,
            boolean hasFocus) {
        label.setText(value.toString());
        if (selected) {
            label.setBackground(UIManager.getColor("Tree.selectionBackground"));
        } else {
            label.setBackground(UIManager.getColor("Tree.textBackground"));
        }
        TreeCheckingModel checkingModel = ((CheckboxTree) tree).getCheckingModel();

        TreePath path = tree.getPathForRow(row);


        boolean enabled = checkingModel.isPathEnabled(path);
        boolean checked = checkingModel.isPathChecked(path);
        boolean grayed = checkingModel.isPathGreyed(path);

        button.setEnabled(enabled);

        if (path != null) {
            TreePath parent = path.getParentPath();
            if (parent != null) {
                if (parent.getLastPathComponent().toString().equalsIgnoreCase("metadata")) {
//                    button.setEnabled(false);                    
                    panel.add(label);
                } else {                    
                    panel.add(button);
                    panel.add(label);
                    button.setSelected(checked);
                }
            }
        }


        if (grayed) {
            label.setForeground(Color.lightGray);
        } else {
            label.setForeground(Color.black);
        }
        button.setSelected(checked);
        return panel;
    }

    @Override
    public boolean isOnHotspot(int x, int y) {
        return (button.getBounds().contains(x, y));
    }
}
4

1 に答える 1

2

このisLeaf()では、 の実装でを使用して、isCellEditable()編集をリーフ ノードのみに限定しています。

補遺: 特定のレベルを超える編集を排除するには、次のような述語を使用してパス上の要素の数を確認できますpath.getPathCount() > 2

于 2012-12-27T15:39:34.017 に答える