Редактировать ячейку JTable как узел JTree

Моя цель — использовать JTable в качестве узла JTree и иметь возможность редактировать ячейки в JTable, дважды щелкнув их. Рендеринг работает хорошо (Jtable как узел Jtree), но я понятия не имею, как для редактирования одной ячейки в таблице. Если я настрою редактируемое дерево, я смогу редактировать узлы, используя двойной щелчок, но я хочу редактировать ячейки сами по себе, потому что пользователь может неохотно сохранять «%» перед числами, которые я использую для рендеринга. Если дерево не редактируется, двойной щелчок ничего не делает. Есть ли простой способ сделать это?

public class TreeWithCellRenderer {

static class MyCellRenderer implements TreeCellRenderer {
    @Override
    public Component getTreeCellRendererComponent(JTree tree, Object value, boolean selected, boolean expanded,
            boolean leaf, int row, boolean hasFocus) {

        String command = (String) ((DefaultMutableTreeNode) value).getUserObject();
        final String[] params = command.split("%");
        JTable table = new JTable();

        table.setModel(new DefaultTableModel() {
            private static final long serialVersionUID = 1L;

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

            @Override
            public int getColumnCount() {
                return params.length;
            }

            @Override
            public Object getValueAt(int row, int column) {
                return params[column];
            }
        });
        return table;
    }
}

private static void createAndShowGUI() {
    // Create and set up the window.
    JFrame frame = new JFrame("JTreeTutorial");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    // Tree components
    DefaultMutableTreeNode root = new DefaultMutableTreeNode("root");
    DefaultMutableTreeNode cmd1 = new DefaultMutableTreeNode("name %1");
    DefaultMutableTreeNode cmd2 = new DefaultMutableTreeNode("name %1 %2");
    root.add(cmd1);
    root.add(cmd2);

    JTree jTree = new JTree(root);
    //Don't like it too much, as it makes you edit the whole node, not cells
    //jTree.setEditable(true);
    jTree.setCellRenderer(new MyCellRenderer());
    JScrollPane scroolPane = new JScrollPane(jTree);
    frame.add(scroolPane);

    // Display the window.
    frame.pack();
    frame.setVisible(true);
}

public static void main(String[] args) {
    createAndShowGUI();
}

}


person dalvarezmartinez1    schedule 30.05.2013    source источник


Ответы (2)


person mKorbel    schedule 30.05.2013
comment
Спасибо. Я попытался следовать примеру из stackoverflow.com. /questions/12642792/, но это позволяет мне редактировать ячейку дерева, то есть целую строку, я хочу редактировать только одну ячейку из этой строки. Можете указать пример? Я совсем новичок в Swing. - person dalvarezmartinez1; 30.05.2013

Вы должны добавить метод isCellEditable для вашей модели данных. В противном случае ваша таблица недоступна для редактирования.

Это может выглядеть так:

@Override
public boolean isCellEditable(int row, int col) 
{
    return col >= 0;
}
person Denis Zaikin    schedule 04.06.2013
comment
Единственная модель, которую я использую, — это модель для таблицы, унаследованная от DefaultTableModel, чей метод isCellEditable выглядит следующим образом: public boolean isCellEditable(int row, int column) { return true; } Так что я не думаю, что это необходимо. - person dalvarezmartinez1; 05.06.2013