gpt4 book ai didi

java - 将 JTable 放入 JTree 中

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:23:42 25 4
gpt4 key购买 nike

与线程相关Jtable as a Jtree Node我将 JTable 放入 JTree,但 JTree View 在启动时未正确呈现,我如何为 JTable setPreferredSize,因为 PreferredScrollableViewportSize 收缩 JTable 渲染 TableHeader + 一个 Row,一个 Row 保持隐藏,但在展开 Node 之后(s) TreeRenderer 更改并重新绘制 setPreferredSize 到预期的 Dimension

enter image description here enter image description here

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

public class TreeWithTableRenderer extends JFrame {

private static final long serialVersionUID = 1L;
private JTree tree;

public TreeWithTableRenderer() {
DefaultMutableTreeNode AA1 = new DefaultMutableTreeNode("AA1");
DefaultMutableTreeNode AA2 = new DefaultMutableTreeNode("AA2");
DefaultMutableTreeNode A = new DefaultMutableTreeNode("A");
A.add(AA1);
A.add(AA2);
DefaultMutableTreeNode BB1 = new DefaultMutableTreeNode("BB1");
DefaultMutableTreeNode BB2 = new DefaultMutableTreeNode("BB2");
DefaultMutableTreeNode B = new DefaultMutableTreeNode("B");
B.add(BB1);
B.add(BB2);
DefaultMutableTreeNode CC1 = new DefaultMutableTreeNode("CC1");
DefaultMutableTreeNode CC2 = new DefaultMutableTreeNode("CC2");
DefaultMutableTreeNode C = new DefaultMutableTreeNode("C");
C.add(CC1);
C.add(CC2);
DefaultMutableTreeNode root = new DefaultMutableTreeNode("root");
root.add(A);
root.add(B);
root.add(C);
tree = new JTree(root);
tree.setCellRenderer(new MyTableInTreeCellRenderer());
tree.setRowHeight(0);
JScrollPane jsp = new JScrollPane(tree);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
add(jsp, BorderLayout.CENTER);
pack();
setLocationRelativeTo(null);
}

class MyTableInTreeCellRenderer extends JPanel implements TreeCellRenderer {

private static final long serialVersionUID = 1L;
private JTable table;

public MyTableInTreeCellRenderer() {
super(new BorderLayout());
table = new JTable();
JScrollPane scrollPane = new JScrollPane(table);
add(scrollPane);
}

public Component getTreeCellRendererComponent(JTree tree, Object value,
boolean selected, boolean expanded, boolean leaf, int row, boolean hasFocus) {
final String v = (String) ((DefaultMutableTreeNode) value).getUserObject();
table.setModel(new DefaultTableModel() {

private static final long serialVersionUID = 1L;

@Override
public int getRowCount() {
return 2;
}

@Override
public int getColumnCount() {
return 2;
}

@Override
public Object getValueAt(int row, int column) {
return v + ":" + row + ":" + column;
}
});
table.setPreferredScrollableViewportSize(table.getPreferredSize());
return this;
}
}

public static void main(String[] args) throws Exception {
SwingUtilities.invokeLater(new Runnable() {

public void run() {
new TreeWithTableRenderer().setVisible(true);
}
});
}
}

最佳答案

摆脱 scrollPane,无论如何它都无法正常工作(到目前为止我同意 Russell :-) 并使用适当的 LayoutManager 将表格及其标题添加到面板:

public MyTableInTreeCellRenderer() {
super();
setLayout(new BoxLayout(this, BoxLayout.PAGE_AXIS));
table = new JTable();
add(table.getTableHeader());
add(table);
}

您可能需要稍微调整一下视觉效果,缺少左侧和顶部边框线 - 不完全确定哪个组件正常绘制它们,可能是 scrollPane

编辑

忘记了:在计算渲染组件所需的大小(在ui委托(delegate)中完成,即VariableHeightLayoutCache)时查询scrollPane的prefSize的原因是scrollPane还没有配置header。查询发生在面板被添加到 rendererPane 之前,完整的配置在表的 addNotify 中完成,它仅在面板添加到层次结构之后发生

关于java - 将 JTable 放入 JTree 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8843638/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com