Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 动态设置不同的jtree行高度_Java_Swing_Jtree_Jtreetable_Treecellrenderer - Fatal编程技术网

Java 动态设置不同的jtree行高度

Java 动态设置不同的jtree行高度,java,swing,jtree,jtreetable,treecellrenderer,Java,Swing,Jtree,Jtreetable,Treecellrenderer,全部, 在过去的两天里,我一直在尝试为JTree动态设置不同的行高,但没有成功。下面是我试图实现的一个图像。。。以下是我尝试过的: (1) 使用setRowHeight(0),以便节点查询其当前单元格渲染器 (2) 设置从jtree的单元渲染器返回的组件的PreferredSize(维度d) (3) 更改渲染器本身的行高,我现在理解这是不应该做的 我不知道如何在同一列上设置不同的单元格渲染器,例如下面的a列,在那里我可以硬编码不同的行高度 任何人有任何提示或窍门,或者更好的例子,我的头被炸了,

全部,

在过去的两天里,我一直在尝试为JTree动态设置不同的行高,但没有成功。下面是我试图实现的一个图像。。。以下是我尝试过的:

(1) 使用setRowHeight(0),以便节点查询其当前单元格渲染器

(2) 设置从jtree的单元渲染器返回的组件的PreferredSize(维度d)

(3) 更改渲染器本身的行高,我现在理解这是不应该做的

我不知道如何在同一列上设置不同的单元格渲染器,例如下面的a列,在那里我可以硬编码不同的行高度

任何人有任何提示或窍门,或者更好的例子,我的头被炸了,我似乎已经用尽了所有其他资源。。这应该是可能的,对吧?

(1)
(2)
windows10上使用
JDK1.8.0\u 51

import java.awt.*;
导入javax.swing.*;
导入javax.swing.tree.*;
公共类行高动态ALLYTEST{
公共JComponent makeUI(){
JTree树=新的JTree(){
@重写公共void updateUI(){
setCellRenderer(空);
super.updateUI();
setCellRenderer(新的RowHeightsDynamicallyRenderer());
设置行高(0);
setRootVisible(假);
设置showsroothandles(假);
}
};
返回新的JScrollPane(树);
}
公共静态void main(字符串[]args){
invokeLater(新的Runnable(){
@重写公共无效运行(){
createAndShowGUI();
}
});
}
公共静态void createAndShowGUI(){
试一试{
对于(UIManager.LookAndFeelInfo-laf:UIManager.getInstalledLookAndFeels()){
if(“Nimbus”.equals(laf.getName())){
UIManager.setLookAndFeel(laf.getClassName());
}
}
}catch(ClassNotFoundException |实例化异常
|IllegalAccessException |不受支持的LookandFeelException ex){
例如printStackTrace();
}
JFrame f=新的JFrame();
f、 setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
f、 getContentPane().add(新的行高DynamicAllyTest().makeUI());
f、 设置大小(320240);
f、 setLocationRelativeTo(空);
f、 setVisible(真);
}
}
类RowHeightsDynamicallyRenderer扩展了DefaultTreeCellRenderer{
私人内部高度;
@重写公共组件GetTreeCellRenderComponent(
JTree树,对象值,选择布尔值,
布尔展开、布尔叶、整型行、布尔焦点){
JLabel=(JLabel)super.gettreecellrenderComponent(
树、值、选定、展开、叶、行、焦点);
l、 setFont(tree.getFont().deriveFont(leaf?16f:48f));
高度=叶片?20:60;
//使用虚拟高度图标:l.setIcon(新的DummyHeightIcon(高度));
//使用高度:l.setText(String.format(“%s”,高度,值));
返回l;
}
@重写公共维度getPreferredSize(){
维度d=super.getPreferredSize();
d、 高度=高度;
返回d;
}
}
//类DummyHeightIcon实现Icon{
//私人最终整数高度;
//公共DummyHeightIcon(内部高度){
//高度=高度;
//   }
//@Override public void paintIcon(组件c、图形g、int x、int y){
//@Override public int getIconWidth(){
//返回0;
//   }
//@Override public int getIconHeight(){
//返回高度;
//   }
// }

我遗漏了一个次要但重要的细节。。我正在使用JTreeTable。。使用类似于您的代码,JTree的行高似乎可以。无法保持桌子部件与JTree对齐
import java.awt.*;
import javax.swing.*;
import javax.swing.tree.*;

public class RowHeightsDynamicallyTest {
  public JComponent makeUI() {
    JTree tree = new JTree() {
      @Override public void updateUI() {
        setCellRenderer(null);
        super.updateUI();
        setCellRenderer(new RowHeightsDynamicallyRenderer());
        setRowHeight(0);
        setRootVisible(false);
        setShowsRootHandles(false);
      }
    };
    return new JScrollPane(tree);
  }
  public static void main(String[] args) {
    EventQueue.invokeLater(new Runnable() {
      @Override public void run() {
        createAndShowGUI();
      }
    });
  }
  public static void createAndShowGUI() {
    try {
      for (UIManager.LookAndFeelInfo laf: UIManager.getInstalledLookAndFeels()) {
        if ("Nimbus".equals(laf.getName())) {
          UIManager.setLookAndFeel(laf.getClassName());
        }
      }
    } catch (ClassNotFoundException | InstantiationException
               | IllegalAccessException | UnsupportedLookAndFeelException ex) {
      ex.printStackTrace();
    }
    JFrame f = new JFrame();
    f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    f.getContentPane().add(new RowHeightsDynamicallyTest().makeUI());
    f.setSize(320, 240);
    f.setLocationRelativeTo(null);
    f.setVisible(true);
  }
}

class RowHeightsDynamicallyRenderer extends DefaultTreeCellRenderer {
  private int height;
  @Override public Component getTreeCellRendererComponent(
      JTree tree, Object value, boolean selected,
      boolean expanded, boolean leaf, int row, boolean hasFocus) {
    JLabel l = (JLabel) super.getTreeCellRendererComponent(
        tree, value, selected, expanded, leaf, row, hasFocus);
    l.setFont(tree.getFont().deriveFont(leaf ? 16f : 48f));

    height = leaf ? 20 : 60;
    //use dummy height Icon: l.setIcon(new DummyHeightIcon(height));
    //use <td> height: l.setText(String.format("<html><table><tr><td height='%d'>%s", height, value));
    return l;
  }
  @Override public Dimension getPreferredSize() {
    Dimension d = super.getPreferredSize();
    d.height = height;
    return d;
  }
}

// class DummyHeightIcon implements Icon {
//   private final int height;
//   public DummyHeightIcon(int height) {
//     this.height = height;
//   }
//   @Override public void paintIcon(Component c, Graphics g, int x, int y) {}
//   @Override public int getIconWidth() {
//     return 0;
//   }
//   @Override public int getIconHeight() {
//     return height;
//   }
// }