3

JTree の行の高さを可変にしたいと考えています。私が読んだことから、私がしなければならないことはsetRowHeight(0)、カスタムを実装することだけですTreeCellRenderer。TreeRenderer 内では、アイテムに応じて異なる境界線が設定されます。ただし、境界線を追加すると、行の高さは変わりません。たとえば、EmptyBorder(0,0,8,0)を追加すると、ラベルが 8 ピクセル上に移動します。したがって、左側の予想される結果ではなく、ツリーは右側のようになります。

  EXPECTED:          RESULT:
     _                 _
  |-|_| Item 1      |-|_| Item 1
  |  _              | |_| Item 2  
  |-|_| Item 2      |-
  |                 |  _
  |  _              |-|_| Item 3
  |-|_| Item 3      

これは本質的に私のコードです:

JTree tree = new MyTree(root);

class MyTree extends JTree{
   public MyTree(DefaultMutableTreeNode root){
     super(root);
     setCellRenderer(new CustomCellRenderer());
     setRowHeight(0);
}

class CustomCellRenderer extends DefaultTreeCellRenderer {

@Override
public Component getTreeCellRendererComponent(JTree tree, Object value,
        boolean isSelected, boolean expanded, boolean leaf, int row,
        boolean hasFocus) {

        JComponent c = (JComponent) super.getTreeCellRendererComponent(tree, value, isSelected, expanded, leaf, row, hasFocus);
        Data d = (Data)((DefaultMutableTreeNode) value).getUserData();  
        int bttm = 0;
        if(d.isTrue()){
            bttm = 8;
        }
        c.setBorder(BorderFactory.createEmptyBorder(0, 0, bttm, 0));

        //setting size didn't show any effect either: 
        //c.setPreferredSize(new Dimension(150, 16+bttm));
        return c; 
    }

}
4

2 に答える 2

2

あなたの仮定は間違っています。行の高さは同じではありませんでした。行の高さは、行の上端と下端の間の距離、つまり、その上と下の行の間の占有スペースです。あなたのスケッチは明らかに距離が上がっていることを示しており、それが実際に起こっていることです.

期待の問題はまったく異なります。セルの左側にあるハンドルがテキストの中心に留まって上に移動することを期待していますが、追加した空の境界線を含むセル全体の中心にハンドルが残ります。

Java 7 および BasicLookAndFeel とその子孫 (Windows や Metal など) では、ハンドル ラインの垂直方向の中央揃えが実装でハードコーディングされています。

そのため、ハンドルをテキストの中央に配置したい場合、実行可能な唯一の解決策は、空のスペースを上下に均等に追加してテキストを中央に配置することです。

于 2013-11-21T11:21:47.917 に答える