1 Востаннє редагувалося Lujok (04.09.2016 20:19:55)

Тема: Редагування вузлів JTree .

Моя модель JTree   реалізує implements TreeModel  .
Якщо я вірно зрозумів то треба перевизначити valueForPathChanged(TreePath path, Object newValue)   щоб редагувати вузли дерева.
valueForPathChanged  отримує значення другого параметра  від  TreeCellEditor  (    newValue - the new value from the TreeCellEditor ).
Чи я вірно розумію що мені треба робити ?:
Мені треба створити обект типу TreeCellEditor тce = new TreeCellEditor() { ...  перевизначити методи . В тому числі метод getCellEditorValue   який  Returns the value contained in the editor (наприклад користувач вводе щось в діалоговому вікні ?)  , далі це значення передається . як аргумент, в valueForPathChanged ?

2

Re: Редагування вузлів JTree .

Lujok написав:

Мені треба створити обект типу TreeCellEditor тce = new TreeCellEditor()

Чесно, я сумніваюсь, що Ви створите об'єкт даного ІНТЕРФЕЙСА;)
Давненько не сидів за Javою, але простенький варіант, щось таке:

package main;

import javax.swing.JFrame;
import javax.swing.JTree;
import javax.swing.SwingUtilities;

//ОСЬ ЩО ПОРТРІБНО ДЛЯ РЕДАГУВАННЯ ВУЗЛІВ ДЕРЕВА
import javax.swing.JTextField;
import javax.swing.DefaultCellEditor;
import javax.swing.tree.DefaultTreeCellRenderer;
import javax.swing.tree.DefaultTreeCellEditor;

public class Main extends JFrame {
    
    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                new Main();
            }
        });
    }

    public Main() {
        JTree tree = new JTree();
        add(tree);

        tree.setEditable(true); //дозволяєм редагування
        JTextField field = new JTextField(); // будемо використовувати даний компонент для редагування
        DefaultCellEditor editor = new DefaultCellEditor(field); //стандартний редактор, можна JTextField, JComboBox, JCheckBox
        DefaultTreeCellRenderer renderer = new DefaultTreeCellRenderer(); //рендерер для дерева
        DefaultTreeCellEditor treeEditor = new DefaultTreeCellEditor(tree, renderer, editor); //стандартний редактор реалізує всі методи TreeCellEditor
        tree.setCellEditor(treeEditor); //задаєм редактор для дерева

        setTitle("Edit JTree nodes");
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setSize(300, 300);
        setLocationRelativeTo(null);
        setVisible(true);
    }
}
Подякували: Lujok1

3 Востаннє редагувалося Lujok (13.09.2016 19:36:54)

Re: Редагування вузлів JTree .

fed_lviv написав:
Lujok написав:

Мені треба створити обект типу TreeCellEditor тce = new TreeCellEditor()

Чесно, я сумніваюсь, що Ви створите об'єкт даного ІНТЕРФЕЙСА;)
Давненько не сидів за Javою, але простенький варіант, щось таке:

package main;

import javax.swing.JFrame;
import javax.swing.JTree;
import javax.swing.SwingUtilities;

//ОСЬ ЩО ПОРТРІБНО ДЛЯ РЕДАГУВАННЯ ВУЗЛІВ ДЕРЕВА
import javax.swing.JTextField;
import javax.swing.DefaultCellEditor;
import javax.swing.tree.DefaultTreeCellRenderer;
import javax.swing.tree.DefaultTreeCellEditor;

public class Main extends JFrame {
    
    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                new Main();
            }
        });
    }

    public Main() {
        JTree tree = new JTree();
        add(tree);

        tree.setEditable(true); //дозволяєм редагування
        JTextField field = new JTextField(); // будемо використовувати даний компонент для редагування
        DefaultCellEditor editor = new DefaultCellEditor(field); //стандартний редактор, можна JTextField, JComboBox, JCheckBox
        DefaultTreeCellRenderer renderer = new DefaultTreeCellRenderer(); //рендерер для дерева
        DefaultTreeCellEditor treeEditor = new DefaultTreeCellEditor(tree, renderer, editor); //стандартний редактор реалізує всі методи TreeCellEditor
        tree.setCellEditor(treeEditor); //задаєм редактор для дерева

        setTitle("Edit JTree nodes");
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setSize(300, 300);
        setLocationRelativeTo(null);
        setVisible(true);
    }
}



А що треба щоб зберегти відредаговане значення  в вузлі  tree ?

4 Востаннє редагувалося fed_lviv (14.09.2016 08:18:11)

Re: Редагування вузлів JTree .

Хм, так воно начебто зберігається. Розвертаю дерево, редагую вузол, звертаю дерево, розвертаю дерево і начебто нове значення прописане.
Хіба, що ви хочите отримувати нове значення, після редагування. Ну тоді, якщо я Вас правильно зрозумів, потрібно трішки попрацювати, замість:

DefaultCellEditor editor = new DefaultCellEditor(field); //стандартний редактор, можна JTextField, JComboBox, JCheckBox

Потрібно зробити свій редактор, наприклад, можна наслідуватися від АБСТРАКТНОГО КЛАСА AbstractCellEditor та реалізувати ІНТЕРФЕЙС TreeCellEditor. Припустимо в ньому прописуємо поле для редагування field і додаємо слухача до даного поля addActionListener. Метод actionPerformed(ActionEvent ee) буде викликатися по закінченню редагування, ось там і ловіть нове значення .

Подякували: Lujok1

5 Востаннє редагувалося Lujok (14.09.2016 18:25:50)

Re: Редагування вузлів JTree .

fed_lviv написав:

Хм, так воно начебто зберігається. Розвертаю дерево, редагую вузол, звертаю дерево, розвертаю дерево і начебто нове значення прописане.

В мене чомусь після редагування не зберігається . А має значення яка модель дерева  використовується (дефолт чи своя )?


Взагалі я хочу розібратися як використовувати моделі компонентів , в тому числі і JTree . Не моделі Default ,  а свої. Ось зараз застряв на TreeModel .  Треба мені щоб що найменше можна було редагувати вузли дерева і одночасно редагувались значення   там на основі чого створено JTree ( зараз це xml файл ).

6

Re: Редагування вузлів JTree .

Ну, так в чому проблема. Після редагування вузла беріть НОВЕ значення і заносьте в свій XML.
Беріть вище написаний код і зробіть малі зміни. Зробіть свій редактор комірки. І, замість DefaultCellEditor прописуєте свій редактор.
Наприклад, свій редактор:

    class MyCellEditor extends AbstractCellEditor implements TreeCellEditor {

        private JTree tree;
        private JTextField field = new JTextField("");

        MyCellEditor(JTree tree) {
            this.tree = tree;
            field.addActionListener(new ActionListener() {
                                 //даний метод викликається по завершенню редагування
                @Override
                public void actionPerformed(ActionEvent arg0) {
                                        //ОСЬ ТУТ МИ БЕРЕМО НОВЕ ЗНАЧЕННЯ І ВИВОДЕМО В КОНСОЛЬ, А ВИ КИДАЙТЕ ЙОГО В СВІЙ ФАЙЛ
                    System.out.println(field.getText());
                    stopCellEditing();
                }
            });
        }

        @Override
        public Object getCellEditorValue() {
            return field.getText();
        }

        @Override
        public Component getTreeCellEditorComponent(JTree arg0, Object arg1, boolean arg2, boolean arg3, boolean arg4,
                int arg5) {
            field.setText(arg1.toString());
            return field;
        }
    }

В старому коді замість:

DefaultCellEditor editor = new DefaultCellEditor(field);

Вставляємо:

MyCellEditor editor = new MyCellEditor(tree);
Подякували: Lujok1

7 Востаннє редагувалося Lujok (15.09.2016 18:28:08)

Re: Редагування вузлів JTree .

fed_lviv написав:

В старому коді замість:

DefaultCellEditor editor = new DefaultCellEditor(field);

Вставляємо:

MyCellEditor editor = new MyCellEditor(tree);

В такому випадку в строках  :

DefaultTreeCellEditor treeEditor = new DefaultTreeCellEditor(tree, renderer,  editor); //стандартний редактор реалізує всі методи TreeCellEditor 
tree.setCellEditor(editor); //задаєм редактор для дерева 

нетбинс пише:   incompatible  types :MyCellEditor   cannot be converted to TreeCelEditor

8

Re: Редагування вузлів JTree .

Lujok написав:
tree.setCellEditor(editor); //задаєм редактор для дерева 

нетбинс пише:   incompatible  types :MyCellEditor   cannot be converted to TreeCelEditor

Ви нічого, дивного в цій стрічці не помічаэте???  :) Навіщо , Ви ъъ змінили?. Потрібно було тільки одну стрічку змінити. А тут залиште treeEditor.

9

Re: Редагування вузлів JTree .

fed_lviv написав:

Ви нічого, дивного в цій стрічці не помічаэте???  :) Навіщо , Ви ъъ змінили?. Потрібно було тільки одну стрічку змінити. А тут залиште treeEditor.

Так тут я переплутав .

Але в  цій  строкі теж  вказує на туж помилку

DefaultTreeCellEditor treeEditor = new DefaultTreeCellEditor(tree, renderer,  editor); //стандартний редактор реалізує всі методи TreeCellEditor