Поместите JTable в JTree

в связи с нитью Jtable как узлом Jtree я поместил JTable в JTree, но JTree View не отображается правильно в start_up, как я могу setPreferredSize для JTable , потому что PreferredScrollableViewportSize JTable с рендерингом TableHeader + one Row , один Row остается скрытым, но после расширения узла (ов) TreeRenderer измените и setPreferredSize до ожидаемого 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 🙂 и добавляю таблицу и ее заголовок к панели с помощью соответствующего LayoutManager:

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

вам, вероятно, придется немного подкорректировать визуальные эффекты, левая и верхняя граничные линии отсутствуют – не совсем уверен, какой компонент красит их нормально, может быть scrollPane

редактировать

Забыл: причина запроса prefSize scrollPane при вычислении требуемого размера (сделанного в делете ui, а именно VariableHeightLayoutCache) компонента рендеринга, заключается в том, что scrollPane еще не настроен с заголовком. Запрос выполняется до того, как панель добавляется в rendererPane, полная конфигурация выполняется в addNotify таблицы, которая происходит только после добавления панели в иерархию

Вы можете просто избавиться от ScrollPane и напрямую разместить заголовок и таблицу в панели (с null LayoutManager, чтобы вы могли все контролировать самостоятельно):

 static class TableTreeCellRenderer extends JPanel implements TreeCellRenderer { private final JTable table; TableTreeCellRenderer() { table = new JTable(); setLayout(null); add(table.getTableHeader()); add(table); } public Dimension getPreferredSize() { Dimension headerSize = table.getTableHeader().getPreferredSize(); Dimension tableSize = table.getPreferredSize(); return new Dimension(Math.max(headerSize.width, tableSize.width), headerSize.height + tableSize.height); } public void setBounds(int x, int y, int width, int height) { super.setBounds(x, y, width, height); int headerHeight = table.getTableHeader().getPreferredSize().height; table.getTableHeader().setBounds(0, 0, width, headerHeight); table.setBounds(0, headerHeight, width, height - headerHeight); } 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(new Object[][] { { v + "0", "1" }, { v + "2", "3" } }, new Object[] { "id", "value" } )); invalidate(); return this; } } 
  • Качание на OSX: как ловушка command-Q?
  • Работа с несколькими пользовательскими шаблонами таблиц, исключающими повторяющийся код
  • Путаница обнаружения столкновений прямоугольника Java
  • Установка размера печати jLabel и установка jRadiobutton на печать
  • JTable, как изменить цвет BackGround
  • Как изменить форму вкладки JTabbedPane?
  • Swing Worker: функция get ()
  • Передача значений между JFrames
  • Правое нажатие на JButton
  • Почему заголовок JTable не отображается на изображении?
  • Проблемы с JFormattedTextField
  • Давайте будем гением компьютера.