将 JTable 放入 JTree [英] Put JTable in the JTree
问题描述
关于线程 Jtable 作为 Jtree 节点 我把 JTable 放到 JTree,但是 JTree
视图在启动时未正确呈现,我如何为 JTable
设置setPreferredSize
,因为 PreferredScrollableViewportSize
缩小了JTable
带有渲染 TableHeader
+ 一个 Row
,一个 Row
保持隐藏状态,但在展开 Node(s) TreeRenderer 后改变和将 setPreferredSize
重新绘制为预期的 Dimension
in connection with thread Jtable as a Jtree Node I put JTable to JTree, but JTree
View isn't rendered correctly on start_up, how can I setPreferredSize
for JTable
, because PreferredScrollableViewportSize
shrinked JTable
with rendering TableHeader
+ one Row
, one Row
remain hidden, but after expanding Node(s) TreeRenderer change and repaint the setPreferredSize
to the expected Dimension
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 :-)并将表格及其标题添加到面板中,使用适当的布局管理器:
Get rid of the scrollPane, it's dysfunctional anyway (so far I agree with Russell :-) and add the table and its header to the panel, using an appropriate LayoutManager:
public MyTableInTreeCellRenderer() {
super();
setLayout(new BoxLayout(this, BoxLayout.PAGE_AXIS));
table = new JTable();
add(table.getTableHeader());
add(table);
}
您可能需要稍微调整视觉效果,缺少左侧和顶部边框线 - 不完全确定哪个组件可以正常绘制它们,可能是 scrollPane
you'll probably need to tweak the visuals a bit, the left and top border lines are missing - not entirely sure which component paints them normally, could be the scrollPane
编辑
忘记了:在计算渲染组件所需的大小(在ui委托中完成,即VariableHeightLayoutCache)时查询scrollPane的prefSize的原因是scrollPane还没有配置header.查询发生在面板添加到 rendererPane 之前,完整的配置在表的 addNotify 中完成,只有在将面板添加到层次结构后才会发生
Forgot: the reason querying the scrollPane's prefSize in calculating the required size (done in the ui delegate, namely the VariableHeightLayoutCache) of the rendering component is that the scrollPane not yet configured with the header. The query happens before the panel is added to the rendererPane, the complete configuration is done in the table's addNotify which happens only after adding the panel to the hierarchy
这篇关于将 JTable 放入 JTree的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!