JTree (schonwieder) - TreeCellEditor

Status
Nicht offen für weitere Antworten.

Evolver

Bekanntes Mitglied
Meine hoffentlich letzte offene Frage zum Umgang mit JTrees.

Ich habe einen TreeCellEditor implementiert. Er besteht nur aus einem JTextField (ist eigentlich selbst eins). Wenn ein Knoten zum Editieren aktiv ist kann der User also schön seinen Text eingeben. Klickt er irgendwo anders hin, wird standartmäßig die Eingabe abgebrochen. Dies entspricht FocusAdapter.focusLost(). Nun möchte ich aber nicht, dass das Editieren dadurch abgebrochen wird. Ich habe also meiner Klasse im Konstruktor den Code hinzugefügt:
Code:
class TextFieldEditor extends JTextField implements TreeCellEditor
	{
		// die Liste aller registrierten Listener
		private ArrayList<CellEditorListener> mListeners = new ArrayList<CellEditorListener>(); 
		   
		public TextFieldEditor()
		{
			super();
			this.addFocusListener(new FocusAdapter()
					{
						public void focusLost(FocusEvent pFE)
						{
							TextFieldEditor.this.stopCellEditing();
							System.out.println("Test");
						}
					});
		}
		
		// ...
Leider wird schon vorher immer TreeCellEditor.cancelCellEditing() aufgerufen und die Eingabe somit abgebrochen. Danach kommt das Programm noch in meine Funktion focusLost(), aber dann ist es ja schon zu spät. Wie behebe ich diese Problem?
 

Evolver

Bekanntes Mitglied
Doch noch eine Frage: Wie oben, aber wenn der User Escape drückt. Zwar wird zurerst der KeyListener aufgerufen, von dem aus ich stopCellEditing aufrufe, das nützt mir aber nicht viel, da im Anschluss automatisch cancelCellEditing aufgerufen wird.
 

Evolver

Bekanntes Mitglied
Entschuldigung, aber ich muss das Theman nochmal nach oben schieben.

Hat denn wirklich niemand eine Idde, einen Ansatz, wir ich verhindern kann, dass beim TreeCellEditor cancelCellEditing() aufgerufen wird, wenn man Escape drückt?
 

André Uhres

Top Contributor
Eine mögliche Lösung: einen KeyListener an die Editorkomponente hängen und bei ESCAPE stopCellEditing() aufrufen:
Code:
package tree;
/*********************
 * DisableEscape.java
 *********************/
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.tree.*;
public class DisableEscape extends JFrame {
    public JTree tree;
    public DisableEscape() {
        tree = new JTree();
        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        getContentPane().add(new JScrollPane(tree), BorderLayout.CENTER);
        tree.setCellEditor(new UserTreeCellEditor(tree, (DefaultTreeCellRenderer) tree.getCellRenderer()));
        tree.setEditable(true);
        tree.setInvokesStopCellEditing(true);
        pack();
    }
    public static void main(String[] args) {new DisableEscape().setVisible(true);}
}
/************************
 * UserTreeCellEditor
 ************************/
class UserTreeCellEditor extends DefaultTreeCellEditor {
    private JTextField tf;
    public UserTreeCellEditor(JTree tree, DefaultTreeCellRenderer renderer) {
        super(tree, renderer);
    }
    @Override
    public Component getTreeCellEditorComponent(JTree tree, Object value, boolean isSelected, boolean expanded, boolean leaf, int row) {
        Component c = super.getTreeCellEditorComponent(tree, value, isSelected, expanded, leaf, row);
        if(tf == null) {
            tf = (JTextField)editingComponent;
            tf.addKeyListener(new KeyAdapter() {
                @Override
                public void keyPressed(KeyEvent e) {
                    if(e.getKeyCode() == KeyEvent.VK_ESCAPE){
                        stopCellEditing();
                    }
                }
            });
        }
        return c;
    }
}
 

Evolver

Bekanntes Mitglied
Ich denke etwas sehr ähnlich habe ich es schon:
Code:
class DBOverviewCellEditor extends JTextField implements TreeCellEditor
{
		private ArrayList<CellEditorListener> mListeners; 
		// ...
		public DBOverviewCellEditor()
		{
			super();
			this.setColumns(16);
			this.addKeyListener(new KeyAdapter()
					{
						@Override
						public void keyPressed(KeyEvent pKE)
						{
							if(pKE.getKeyCode()==KeyEvent.VK_ESCAPE) {
								DBOverviewCellEditor.this.stopCellEditing();
							}
						}
					});
			//...
	}
	//...
}

Das funktioniert soweit, dass erst stopCellEditing() aufgerufen wird. Im Anschluss kommt trotzdem cancelCellEditing().
 

André Uhres

Top Contributor
Man kann auch über die ActionMap der ESCAPE Taste eine andere Action zuordnen:
Code:
/*
 * DisableEscape.java
 */
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class DisableEscape extends JFrame {
    public JTree tree;
    public DisableEscape() {
        tree = new JTree();
        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        getContentPane().add(new JScrollPane(tree), BorderLayout.CENTER);
        tree.setEditable(true);
        tree.setInvokesStopCellEditing(true); 
        InputMap im = tree.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT);
        im.put(KeyStroke.getKeyStroke("ESCAPE"), "stopEditing");
        tree.getActionMap().put("stopEditing", new AbstractAction() {
            public void actionPerformed(ActionEvent e) {
                tree.stopEditing();
            }
        });
        pack();
    }
    public static void main(String[] args) {new DisableEscape().setVisible(true);}
}
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
Bananabert Swing jtree : image als user object Allgemeine Java-Themen 2
F JTree: Nodes dynamisch anlegen via LinkedHashMap Allgemeine Java-Themen 2
E Swing Jtree Allgemeine Java-Themen 9
R JTree - Mehrere Roots Allgemeine Java-Themen 6
DStrohma Icons in JTree Nodes weiter nach rechts rücken Allgemeine Java-Themen 2
M JTree aktualisieren nach Mausklick Allgemeine Java-Themen 12
DStrohma Jede node in JTree mit eigenem Icon Allgemeine Java-Themen 7
Benji0815 Verzeichnis wie im Windows Explorer in einem JTree anzeigen Allgemeine Java-Themen 6
S JAVA JTree rekursiv umschreiben Allgemeine Java-Themen 5
S Suche im JTree nach Neuaufbau Allgemeine Java-Themen 4
N JTree nicht genutzte Pfade schließen Allgemeine Java-Themen 2
G JTree Node löschen Allgemeine Java-Themen 2
G JTree Node verschieben Allgemeine Java-Themen 2
MQue leerer JTree Allgemeine Java-Themen 6
MQue JTree Allgemeine Java-Themen 6
MQue JCheckBox in JTree Allgemeine Java-Themen 2
F JTree in Jsp Allgemeine Java-Themen 2
T Äquivalent zu JTree Allgemeine Java-Themen 4
C JTree: ActionListener auf die Nodes Allgemeine Java-Themen 3
M JTree mit Rechtsklick markieren Allgemeine Java-Themen 4
C JTree: Nodes automatisch öffnen Allgemeine Java-Themen 2
P JTree/ Nodes einfügen Allgemeine Java-Themen 2
P JTree Allgemeine Java-Themen 6
P aus JTree eine XML- Datei Allgemeine Java-Themen 6
P Vector auf JTree Allgemeine Java-Themen 6
P JTree Farbe Allgemeine Java-Themen 14
S JTree selektion erkennen und drauf reagieren Allgemeine Java-Themen 2
E JTree - einzelnes Element (Knoten) editieren Allgemeine Java-Themen 2
E JTree - Selektieren mit Rechtsklick Allgemeine Java-Themen 15
P JTree ID vergeben Allgemeine Java-Themen 3
P JTree Allgemeine Java-Themen 4
P JTree/ JTabbedPane Allgemeine Java-Themen 34
L JTree Allgemeine Java-Themen 23
E root JTree Allgemeine Java-Themen 2
E Child in JTree hinzufügen Allgemeine Java-Themen 4
E JTree in NetBeans Allgemeine Java-Themen 2
R Objekt an Knoten von JTree anhaengen Allgemeine Java-Themen 2
R Daten aus Baum entsprechend in jTree einfuegen Allgemeine Java-Themen 2
T Jtree zu langsam beim klappen Allgemeine Java-Themen 8
S JTree - Brett vor'm Kopp Allgemeine Java-Themen 19
G Baumhierarchie in JTree eintragen Allgemeine Java-Themen 4
K JTree - Knoten expandieren Allgemeine Java-Themen 4
K JTree Inhalt löschen und Anzeige aktualisieren Allgemeine Java-Themen 13
G JTree automatisch sortieren lassen Allgemeine Java-Themen 5
Luma Diskettenlaufwerk rattert los bei Eintrag in JTree Allgemeine Java-Themen 6
G in Jtree suchen Allgemeine Java-Themen 2
K JTree plus eigener FileLoader Allgemeine Java-Themen 2
H Wie stellt ein JTree fest, wo etwas eingehängt werden soll? Allgemeine Java-Themen 2

Ähnliche Java Themen

Neue Themen


Oben