JTextField Eingabe automatisch bestaetigen

Status
Nicht offen für weitere Antworten.
F

Fabeltier

Gast
Hallo,
ich habe ein Textfeld und moechte gerne einen Eintrag setzen und diesen gleich "confirmen", ich denke, dass das ueber eine "action" laufen muss, bin aber irgendwie ratlos. Ich habe schon versucht es einfach per \n oder \f\n zu bestaetigen - behalte aber immer noch den Prompt.
Code:
			JTextField tf = new JTextField(20);
			tf.addActionListener(new ActionListener(){
				public void actionPerformed(ActionEvent e){
					textErhaltenUndWeiterMachen(); // diese funktion soll vom action listener aus gestartet werden
				}
			});


			tf.setText("blablabla");

			// hier wuerde ich gerne die action, bestaetigen/text erhalten starten
			???

			return tf;

Ich habe schon versucht statt des action listeners gleich die funktion von actionPerformed() aufzurufen, aber das funktioniert leider auch nicht, der Prompt muss weg aus dem Textfeld! Ausserdem hatte ich mir vom tf den actionlistener (index 0) geben lassen und wollte action performed aufrufen, es bleibt immer noch der prompt?!

Gibts da keinen Weg?
 
F

Fabeltier

Gast
hm, ok - das ganze haengt im Editor eines Baumes. Die knoten arbeiten mit einem JTextField. Bei bestimmten Eintraegen sollte sich allerdings ein JFileChooser starten. Ich kann den JFileChooser nicht zurueckgeben, sondern nur das JTextField. Deshalb will ich den gefunden Eintrag (also File.getAbsolutePathblabla) in das JTextField schreiben und dieses aber gleich bestaetigen, damit man eben nicht mehr nach dem J-File-Choosen, noch ein extra Enter druecken muss.

Dh, ich moechte gerne wissen, wie ich einen Eintrag in ein JTextField schreibe und dann das starte, was ich als Benutzer mit dem Druck auf die Enter-Taste auch starten wuerde. (ich hoffe das ist verstaendlicher?!).

Dabei geht es mir nicht unbedingt um diese spezielle Situation, sondern mich wuerde auch generell einmal interessieren, wie ich die "Enter-Action" eines JTextField's oder auch eines jButton's etc starten kann. Ein eingetragenes \n scheint ja offensichtlich nicht auszureichen!?
 

Wildcard

Top Contributor
Code:
tf.addActionListener(new ActionListener(){
    public void actionPerformed(ActionEvent e){
         doSomething(); // diese funktion soll vom action listener aus gestartet werden
       }
    }); 

public void doSomething()
{
   //do something here
}

...
tf.setText("blahblah");
doSomething();
 
F

Fabeltier

Gast
Danke fuer Deine Muehen, aber ich hatte bereits versucht irgendwie zu erklaeren, dass der direkte Aufruf der Methode die ich per actionPerformed() aufrufe, immer den Prompt im JTextField zuruecklaesst. Das Biest ist zaeh! Ich hab schon versucht das Textfeld danach per setEditable(false) abzustellen, ein "\n" oder "\f\n" mitzugeben, tf.getActionListeners()[0].actionPerformed() (verzweifelt - geb ich zu!) oder tf.notifyAll() etc. pp. aufzurufen, aber es will einfach nicht. Sicherlich kann ich das konkrete Problem auch im Code umgehn, es ist ja auch kein gravierendes Problem, sondern eher ein nerviger Bug, immer noch mal per ENTER bestaetigen zu muessen.

Wie gesagt wuerde mich auch generell einmal interessieren, wie ich diese "Action-Cascade" die ich per ENTER starte, mittels Funktionen starten kann.
 

Wildcard

Top Contributor
Was meinst du den mit Prompt? Den Focus? Warum sollte der stören?
Und wenn er dich stört, warum gibts du ihn nicht an eine andere Komponente?
 
F

Fabeltier

Gast
Hm, also mit Prompt meine ich... den Prompt halt, ...die Eingabeaufforderung, ...etwa so wie hier beschrieben:
de.wikipedia.org/wiki/Prompt

Das Ding bekomm ich automatisch, wenn ich per CellEditor in dem Baum eine Celle veraendern will - das TextFeld wird erzeugt und bleibt solange am Leben, bis die Eingabe bestaetigt wurde. Soweit so gut, blos wenn ich diese Eingabe eben per JFileChooser hole und dort automatisch eintrage, wuerde ich sie halt auch gerne automatisch bestaetigen wollen. Den FileChooser uebergebe ich nur ungerne, da mir der Baum ansonsten (unbehandelt) einfach die grafischen Inereien, des kleinen Fensters des FileChoosers direkt als Knoten in den Baum haengt (das is sogar noch funktionsfaehig und sieht lustig aus, bringt mir aber nix). Soweit ich mich bisher mit Baeumen befasst habe, ist es einfacher den Inhalt des FileChoosers im CellEditor abzufangen und zu setzen, nur muss der eben dann noch bestaetigt werden.

Wie schon mal erwaehnt wuerde mich interessieren, wie man allg. bspw ein JTextField per Funktion bestaetigt (dh. eben ein \n wegschickt, die entsprechenden ActionListener startet, den "Focus" weiterrueckt, etc pp. das muss doch auch per Funktion moeglich sein, oder nicht? Vllt hilft mir ja ein Schlagwort weiter, nachdem ich da googeln koennte?
 

Wildcard

Top Contributor
Ach so... du meinst den CellEditor. Jetzt verstehe ich dich.
du brauchst CellEditor#stopCellEditing()
Programmatisch kann man einen ActionListener auslösen indem man ein ActionEvent erzeugt und übergibt, aber glaub mir einfach das man das so nicht macht :wink:
 
E

erledigt

Gast
Glaub ich gerne. Es is ja auch nich das allererste Java Prg mit dem ich kaempfe und ich habe es auch noch nie so gemacht (weils sinnlos is und immer bessere Wege dafuer gibt).

Deshalb meinte ich ob es da entweder eine entsprechende Methode gibt oder halt nicht (das eigene ActionEvent waere ja die absolute Notloesung gewesen). stopEditing() hatte ich noch nicht ausprobiert - stimmt, ich hatte es mit cancelEditing() probiert, welches ja stopEditing() auch rufen sollte.. mal sehn, wo da der Fehler liegt. Dann weiss ich ja jetz die Richtung, Danke fuer Deine Gedult! :wink:
 
G

Gast

Gast
Um einen Event zu erzeugen gibt es am JTextfield eine Methode "fireActionPerformed". Bei Aufruf wird bei allen am Textfeld registrierten ActionListenern die Methode actionPerformed() aufgerufen.
 

Wildcard

Top Contributor
Diese Methode ist nicht grundlos protected. Von JTextField zu erben, nur um solche hässlichen Dinge zu tun, ist schlicht und einfach nicht im Sinne des Erfinders...
 
F

Fabeltier

Gast
Ergaenzung, also das Ding geht nich und ich hab mom auch keinen Bock mehr, solln die dummen Benutzer halt zweimal bestaetigen, denen wird auch kein Finger dadurch abfallen.

Ich hatte das gestern vorm schlafen gehn, nich mehr ganz genau gelesen: die Methode die von actionPerformed() aus gestartet wird ist ja (logischerweise) bereits die stopCellEditing() und das mit dem direkten Aufruf geht eben nicht. Ich habe den CellEditor nun auch von DefaultCellEditor abgeleitet, damit es nicht an meiner Implementierung liegen kann. Ich denke auch, so wie ich das Verhalten von SWING JTree's bisher erlebt habe und was ich darueber weiss, gibts nur das davor und das danach, auf das man aktiv Einfluss nehmen kann.

Sicher wird die Methode stopCellEditing() den Editierungsprozess stoppen, aber dieser muss auch erst mal laufen. Dh wenn ich sie von getTreeCellEditorComponent() "davor" aus, aufrufe wird nix gestoppt, weil (noch) nix der Editor noch nicht editiert wird. Methoden wie getCellEditorValue() oder das entsprechende valueForPathChanged() im TreeModel, sind Methoden von "danach", ein stopCellEditor() hier, ist deshalb auch schwachsinnig. Genauso sinnlos waren auch meine Versuche ewig den ActionListener bzw actionPerformed direkt zu starten, von getCellEditorComponent() aus, weil das ja auch von "davor" aus gewesen waere - nja, die eigene Sturheit nicht begreifen zu wollen..

Die einzige Moeglichkeit eine Methode in das "waehrend" des Editionsvorgangs reinzuschmuggeln, besteht offensichtlich nur im anhaengen eines ActionListeners, der dann entsprechendes stopCellEditor() ausfuehren kann. Deshalb geht nix mit direktem aufrufen - wer anderes behauptet, poste bitte ein Demo!!!


Ansaetze:
Warum uebergebe ich nicht einfach direkt einen JFileChooser? Weil sich dieser auf nimmer wieder sehen verabschiedet! Bestaetigen des JFileChooser Fensters fuehrt nicht zu einem stopCellEditing() und deshalb tritt oben irgendwo beschriebenes bizarres Problem auf, die graphischen Innereien, des JFileChoosers werden (funktionsfaehig!) im Baum platziert.

Warum nicht JFileChooser von getCellEditorValue() "danach" aufrufen? Oder warum den JFileChooser nicht von valueForPathChanged() in TableModel "danach" aufrufen? Vorher muss von getCellEditorComponent() unbedingt ein "Component" artiges Object uebergeben werden/reingesteckt werden (welches sollte das sein?) - null erzeugt intern eine NullPointerException, die nirgends mehr auffangbar ist. (Spassig ist etwa auch ein JLabel mitzugeben, dann verschwindet der komplette baum und bestaetigen kann man auch nix mehr, geschweige denn, ein stopCellEditing() von einem ActionListener aus starten..).

Die einzigste halbwegs sinnvolle Moeglichkeit scheint ein starten und haendeln des JFileChoosers von getCellEditorComponent() aus (davor) und returnen eines bereits gesetzten JTextFields, welches eben noch separt bestaetigt werden muss (leider, aber vll find ich ja zufaellig noch ne Moeglichkeit, andre Sachen sind mom wichtiger..).


Danke noch mal fuer Eure Muehe, der Lerneffekt war jedenfalls wiedermal da :wink:
 
F

Fabeltier

Gast
NEIN, das komplette Projekt ist streng geheim und wird erfolgreicher als Microsoft's Windows werden. Ich werde schon seit Tagen verfolgt deswegen, mein Kuehlschrank ist komplett verwanzt und mein Telefon hoeren sie auch schon ab - aber ich hab mal ein Demo erstellt, das genau nur auf das Problem mit dem JFileChooser eingeht und die einzigste Loesung, die ich dafuer bisher gefunden habe (wegen s.o.):
Code:
import java.awt.Component;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.io.File;
import java.util.EventObject;
import javax.swing.JFileChooser;
import javax.swing.JScrollPane;
import javax.swing.JTextField;
import javax.swing.JTree;
import javax.swing.WindowConstants;
import javax.swing.event.TreeModelListener;
import javax.swing.filechooser.FileFilter;
import javax.swing.tree.DefaultTreeCellEditor;
import javax.swing.tree.TreeModel;
import javax.swing.tree.TreePath;

/**
 * The Frame.
 * 
 * @author user
 */
public class TreeTest extends javax.swing.JFrame {
	private JScrollPane sp;

	private CustomTree tree;

	public static void main(String[] args) {
		TreeTest inst = new TreeTest();
		inst.setVisible(true);
	}

	public TreeTest() {
		super();
		initGUI();
	}

	private void initGUI() {
		setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
		sp = new JScrollPane();
		tree = new CustomTree(new TestTreeModel());
		tree.setEditable(true);
		tree.setCellEditor(new TestCellEditor(tree));
		sp.setViewportView(tree);
		getContentPane().add(sp);
		pack();
		setSize(400, 300);
	}
}

/**
 * The TreeModel.
 * 
 * @author user
 */
class TestTreeModel implements TreeModel {
	private Node root = new Node() {
		@Override
		public String toString() {
			return getContent();
		}
	};

	public Object getRoot() {
		return root;
	}

	public Object getChild(Object parent, int index) {
		return ((Node) parent).getChildAt(index);
	}

	public int getChildCount(Object parent) {
		return ((Node) parent).getChildCount();
	}

	public boolean isLeaf(Object node) {
		return ((Node) node).isLeaf();
	}

	public int getIndexOfChild(Object parent, Object child) {
		return ((Node) parent).getChildIndexOf(((Node) child).getContent());
	}

	public void valueForPathChanged(TreePath path, Object newValue) {
		Node node = (Node) path.getLastPathComponent();
		String sz = newValue.toString();
		node.setContent(sz);
	}

	public void addTreeModelListener(TreeModelListener l) {
		// no adding
	}

	public void removeTreeModelListener(TreeModelListener l) {
		// no removing
	}

}

/**
 * The node type.
 * 
 * @author user
 */
class Node {
	protected String content;

	private Node[] children;

	private int level;

	/**
	 * root node ctor
	 */
	public Node() {
		init("rootnode", null, 0);
	}

	public Node(String someText, Node parentNode) {
		init(someText, parentNode, parentNode.getLevel() + 1);
	}

	private void init(String text, Node parentNode, int thisLevel) {
		setLevel(thisLevel);
		setContent(text);
	}

	public Node getChildAt(int index) {
		generateChildNodes();
		return children[index];
	}

	public int getChildIndexOf(String szChildContent) {
		for (int cnt = 0; cnt < children.length; ++cnt) {
			if (children[cnt].getContent().equals(szChildContent))
				return cnt;
		}
		return -1;
	}

	public String getContent() {
		return content;
	}

	public boolean isLeaf() {
		return (getLevel() == 2);
	}

	public int getChildCount() {
		if (children == null) {
			generateChildNodes();
		}
		return children.length;
	}

	/**
	 * Contains the structure of the tree.
	 */
	private void generateChildNodes() {
		if (children == null) {
			if (level == 0) {
				children = new Node[1];
				children[0] = new Node("item", this);
			}

			if (level == 1) {
				children = new Node[1];
				if (this.getContent().equals("item")) {
					children[0] = new Node("click me 3x", this);
				}
			}
		}
	}

	public String toString() {
		return getContent();
	}

	public int getLevel() {
		return level;
	}

	public void setLevel(int level) {
		this.level = level;
	}

	public void setContent(String content) {
		this.content = content;
	}
}

/**
 * The TreeCellEditor class.
 * 
 * @author user
 */
class TestCellEditor extends DefaultTreeCellEditor {
	private JTextField tf;

	private Component selected;

	public TestCellEditor(JTree tree) {
		super(tree, null);
	}

	public Component getTreeCellEditorComponent(JTree tree, Object value,
			boolean isSelected, boolean expanded, boolean leaf, int row) {
		cancelCellEditing();
		Node node = (Node) value;

		if (leaf) {
			tf = new JTextField(20);
			tf.setText(node.getContent());
			tf.addActionListener(new ActionListener() {
				public void actionPerformed(ActionEvent e) {
					stopCellEditing();
				}
			});

			// XXX JFileChooser - content of getFileChooser() JFileChooser
			final String szFileExtension = ".txt";
			JFileChooser fc = new JFileChooser();
			fc.setFileFilter(new FileFilter() {
				@Override
				public boolean accept(File f) {
					for (int cnt = 0; cnt < szFileExtension.length(); ++cnt) {
						if (f.getName().toLowerCase().endsWith(szFileExtension))
							return true;
					}
					if (f.isDirectory())
						return true;
					return false;
				}

				@Override
				public String getDescription() {
					String sz = "";
					for (int cnt = 0; cnt < szFileExtension.length(); ++cnt) {
						sz += (cnt == 0) ? "" : ", ";
						sz += "*" + szFileExtension;
					}
					return sz;
				}
			});
			fc.showOpenDialog(null);
			// XXX - end

			File file = fc.getSelectedFile();
			if (file == null)
				tf.setText("N/A");
			else
				tf.setText(file.getAbsolutePath());
			this.selected = this.tf;
			return tf;
		}
		return null;
	}

	public Object getCellEditorValue() {
		if (selected.equals(this.tf)) {
			return tf.getText();
		}
		return null;
	}

	public boolean isCellEditable(EventObject anEvent) {
		if (anEvent instanceof MouseEvent) {
			return (((MouseEvent) anEvent).getClickCount() > 2);
		} else {
			return true;
		}
	}
}

/**
 * 
 * @author user
 */
class CustomTree extends JTree {
	public CustomTree(TestTreeModel model) {
		super(model);
	}

	public boolean isPathEditable(TreePath path) {
		if (isEditable()) {
			return getModel().isLeaf(path.getLastPathComponent());
		}
		return false;
	}
}
 

Wildcard

Top Contributor
Wow... ziemlich wirr :shock:
Ist völlig klar das stopCellEditing bei dir nicht funktioniert.
getTreeCellEditorComponent ist dazu da eine Component zurückzugeben die während des Editiervorgangs angezeigt wird. Das ist nicht der TreeCellEditor der mit stopCellEditing angesprochen wird.
Wenn ich das richtig sehe willst du doch überhaupt nicht das die Nodes im klassischen Sinne editierbar sind, sondern anstatt eines editors einen Filechooser starten, oder?
Warum benutzt du dann nicht einfach einen MouseListener? :bahnhof:
Das scheint mir ohnehin alles recht umständlich... warum ein eigenes Model? Warum eigene Nodes?
 
F

Fabeltier

Gast
Also ich hab das ganze aus meiner "customized JTree" Sammlung eben schnell zusammengeflickt, eigentlich ist es nicht so wild wie es aussieht. Sicherlich koennte man auch DefaultTreeNode's und DefaultTreeModel verwenden fuer das Demo hier. Meine Anwendung ist jedoch weit komplexer und.. nja, diese Dinge (Model, Nodes, etc) sind eigentlich nicht so wichtig fuer das Beispiel. Die anderen Klassen sind von den Default Klassen auch nur abgeleitet.

Das stopCellEditing() funktioniert deshalb weiterhin, wie Du es von den reinen Default Klassen her kennst (der Cell Editor zB wurde nur von DefaultCellEditor abgeleitet). Man kann das sehr schoen testen, indem man zB den ActionListener des JTextField's tf einfach mal auskommentiert - das editieren kann durch kein ENTER der Welt mehr gefangen werden... dh, sobald der Editierprozess laeuft muss er mit stopCellEditing() (des Editors und nicht des JTree's) auch beendet werden, weil man waehrend dessen jegliche Kontrolle an den Editor abgibt. Wie gesagt, der eigene Code laeuft vor und nach dem editieren, dazwischen laeuft nur Java-Magic.

"Anstatt des Editors nen JFileChooser" - nja, waere ne Idee, aber eben nur fuer bestimmte Zellen und diese muessen dann auch geaendert werden, was eben einen zusaetzlichen TreeModelListener notwendig machen wuerde um auf externe Aenderungen zu reagieren, der den Wert dann per treeStructureChanged() aendern koennte. Hm.. mal sehn, warum also keinen Mouselistener verwenden? Mein Ziel ist es unterschiedliche Nodes unterschiedlich zu behandeln (daher die eignenen Modelle/Nodes), im Demo ist nur ein Node editierbar, letztendlich in der Anwendung soll es nicht-editierbare, per JTextField editierbare, per ComboBox und per JFileChooser editierbare Nodes geben. Das Problem waere also gleichzeitig TreeModelListener (fuer JFileChooser) und TreeCellEditor (JTextField und JComboBox) zu verwenden. Gut, dh aber auch ALLE veraenderbaren Zellen muessten editierbar sein (ueber die Ableitung von JTree haendelbar). Wenn aber dann eine Zelle geklickt wird ginge bei der ein JFileChooser notwendig waere, ginge gleichzeitig der MouseListener und der Editor auf. Das ist wohl das Hauptproblem: der Editor MUSS alle Zellen behandeln, die auch editierbar sind, dh, wenn ich per JFileChooser - bspw ueber den MouseListener - noch was aussuchen wuerde haette ich gleichzeitig schon ne NullPointerException vom Editor bekommen, weil der mit der getCellEditorComponent(), dann nix bzw null zurueck liefern wuerde und das fuehrt zu oben schon beschriebener interner NullPointerException, die man auch nicht fangen kann! Es sei denn man koennte unterscheiden, zwischen ich erlaube den MouseListener aber keinen Cell Editor fuer diese Zellen. Die Methode die dazu aufgerufen wird ist JTree::isEditable() bzw JTree::isPathEditable() und gibt lediglich True oder False zurueck aber nich "True fuer Mouse, aber False fuer Editor", "False fuer Mouse und True fuer Editor", "True fuer beide" oder "False fuer beide" wieder - Du siehst fuer die beiden braeuchte man also zwei bools und nicht nur einen - das ginge wohl indem man den kompletten Tree Mechanismus ableitet und etwas umkrempelt, das geht mir aber fuer diese Sache dann doch etwas zu weit. :wink:

Ihr geht ja auf die Funktionsweise in Eurer JTree Einfuehrung schon etwas auf die Moeglichkeiten des TreeCellEditors ein. Letztendlich verlangt der CellEditor aber nur ein Component zur Steuerung und somit koennte es vllt per JFileChooser auch gehn, ohne doppelt zu bestaetigen (oder auch nicht? Mal sehn..) - ich geb zu, der Bug erscheint mir mehr und mehr laecherlich. Ein guter Link zu JTree's ist auch folgender:
www.phptr.com/articles/printerfriendly.asp?p=26327&rl=1
 

Wildcard

Top Contributor
hmm, geht bestimmt eleganter, aber es funktioniert zumindest:
Code:
import java.awt.Component;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.io.File;
import java.util.EventObject;
import java.util.List;

import javax.swing.JFileChooser;
import javax.swing.JScrollPane;
import javax.swing.JTextField;
import javax.swing.JTree;
import javax.swing.SwingUtilities;
import javax.swing.WindowConstants;
import javax.swing.event.CellEditorListener;
import javax.swing.event.ChangeEvent;
import javax.swing.event.TreeModelListener;
import javax.swing.filechooser.FileFilter;
import javax.swing.tree.DefaultTreeCellEditor;
import javax.swing.tree.TreeModel;
import javax.swing.tree.TreePath;


/**
 * The TreeModel.
 * 
 * @author user
 */
public class TreeTest extends javax.swing.JFrame {
	   private JScrollPane sp;

	   private CustomTree tree;

	   public static void main(String[] args) {
	      TreeTest inst = new TreeTest();
	      inst.setVisible(true);
	   }

	   public TreeTest() {
	      super();
	      initGUI();
	   }

	   private void initGUI() {
	      setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
	      sp = new JScrollPane();
	      tree = new CustomTree(new TestTreeModel());
	      tree.setEditable(true);
	      tree.setCellEditor(new TestCellEditor(tree));
	      sp.setViewportView(tree);
	      getContentPane().add(sp);
	      pack();
	      setSize(400, 300);
	   }
	}

	/**
	* The TreeModel.
	*
	* @author user
	*/
	class TestTreeModel implements TreeModel {
	   private Node root = new Node() {
	      @Override
	      public String toString() {
	         return getContent();
	      }
	   };

	   public Object getRoot() {
	      return root;
	   }

	   public Object getChild(Object parent, int index) {
	      return ((Node) parent).getChildAt(index);
	   }

	   public int getChildCount(Object parent) {
	      return ((Node) parent).getChildCount();
	   }

	   public boolean isLeaf(Object node) {
	      return ((Node) node).isLeaf();
	   }

	   public int getIndexOfChild(Object parent, Object child) {
	      return ((Node) parent).getChildIndexOf(((Node) child).getContent());
	   }

	   public void valueForPathChanged(TreePath path, Object newValue) {
	      Node node = (Node) path.getLastPathComponent();
	      String sz = newValue.toString();
	      node.setContent(sz);
	   }

	   public void addTreeModelListener(TreeModelListener l) {
	      // no adding
	   }

	   public void removeTreeModelListener(TreeModelListener l) {
	      // no removing
	   }

	}

	/**
	* The node type.
	*
	* @author user
	*/
	class Node {
	   protected String content;

	   private Node[] children;

	   private int level;

	   /**
	    * root node ctor
	    */
	   public Node() {
	      init("rootnode", null, 0);
	   }

	   public Node(String someText, Node parentNode) {
	      init(someText, parentNode, parentNode.getLevel() + 1);
	   }

	   private void init(String text, Node parentNode, int thisLevel) {
	      setLevel(thisLevel);
	      setContent(text);
	   }

	   public Node getChildAt(int index) {
	      generateChildNodes();
	      return children[index];
	   }

	   public int getChildIndexOf(String szChildContent) {
	      for (int cnt = 0; cnt < children.length; ++cnt) {
	         if (children[cnt].getContent().equals(szChildContent))
	            return cnt;
	      }
	      return -1;
	   }

	   public String getContent() {
	      return content;
	   }

	   public boolean isLeaf() {
	      return (getLevel() == 2);
	   }

	   public int getChildCount() {
	      if (children == null) {
	         generateChildNodes();
	      }
	      return children.length;
	   }

	   /**
	    * Contains the structure of the tree.
	    */
	   private void generateChildNodes() {
	      if (children == null) {
	         if (level == 0) {
	            children = new Node[1];
	            children[0] = new Node("item", this);
	         }

	         if (level == 1) {
	            children = new Node[1];
	            if (this.getContent().equals("item")) {
	               children[0] = new Node("click me 3x", this);
	            }
	         }
	      }
	   }

	   public String toString() {
	      return getContent();
	   }

	   public int getLevel() {
	      return level;
	   }

	   public void setLevel(int level) {
	      this.level = level;
	   }

	   public void setContent(String content) {
	      this.content = content;
	   }
	}

	/**
	* The TreeCellEditor class.
	*
	* @author user
	*/
	class TestCellEditor extends DefaultTreeCellEditor {
	   private final JTextField tf=new JTextField(20);;

	   private Component selected;

	   public TestCellEditor(JTree tree) {
	      super(tree, null);
	   }

	   public Component getTreeCellEditorComponent(JTree tree, Object value,
	         boolean isSelected, boolean expanded, boolean leaf, int row) {
	      cancelCellEditing();
	      Node node = (Node) value;

	      if (leaf) {
	        // tf = new JTextField(20);
	         tf.setText(node.getContent());
	         tf.addActionListener(new ActionListener() {
	            public void actionPerformed(ActionEvent e) {
	               stopCellEditing();
	            }
	         });

	         // XXX JFileChooser - content of getFileChooser() JFileChooser
	         final String szFileExtension = ".txt";
	         final JFileChooser fc = new JFileChooser();
	         fc.setFileFilter(new FileFilter() {
	            @Override
	            public boolean accept(File f) {
	               for (int cnt = 0; cnt < szFileExtension.length(); ++cnt) {
	                  if (f.getName().toLowerCase().endsWith(szFileExtension))
	                     return true;
	               }
	               if (f.isDirectory())
	                  return true;
	               return false;
	            }

	            @Override
	            public String getDescription() {
	               String sz = "";
	               for (int cnt = 0; cnt < szFileExtension.length(); ++cnt) {
	                  sz += (cnt == 0) ? "" : ", ";
	                  sz += "*" + szFileExtension;
	               }
	               return sz;
	            }
	         });
	         Thread t = new Thread(new Runnable() {
			
				public void run()
				{
					fc.showOpenDialog(null);
			         File file = fc.getSelectedFile();
			         if (file == null)
			            tf.setText("N/A");
			         else
			            tf.setText(file.getAbsolutePath());
			         stopCellEditing();
				}
			});
	         SwingUtilities.invokeLater(t);
	         
	         // XXX - end


	         this.selected = this.tf;

	         return tf;
	      }
	      return null;
	   }

	   public Object getCellEditorValue() {
	      if (selected.equals(this.tf)) {
	         return tf.getText();
	      }
	      return null;
	   }

	   @Override
	public boolean stopCellEditing()
	{
	        ChangeEvent event = new ChangeEvent( this );
	        CellEditorListener[] listeners =  getCellEditorListeners();
	        for (CellEditorListener listener : listeners)
			{
				listener.editingStopped(event);
			}

		return true;
	}

	public boolean isCellEditable(EventObject anEvent) {
	      if (anEvent instanceof MouseEvent) {
	         return (((MouseEvent) anEvent).getClickCount() > 2);
	      } else {
	         return true;
	      }
	   }
	}

	/**
	*
	* @author user
	*/
	class CustomTree extends JTree {
	   public CustomTree(TestTreeModel model) {
	      super(model);
	   }

	   public boolean isPathEditable(TreePath path) {
	      if (isEditable()) {
	         return getModel().isLeaf(path.getLastPathComponent());
	      }
	      return false;
	   }
	}
 
E

endgueltig erledigt!

Gast
Super Danke!!! - Multithreading, loest's wieder mal, werd damit vllt noch etwas rumspielen.. genial!!! Ich hatte mich wohl zu sehr auf die Moeglichkeiten des JTree versteift.. wieder was gelernt :###
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
G KeyListener für JTextField Allgemeine Java-Themen 5
J Circumflex in JTextField Allgemeine Java-Themen 1
G JTextField Inhalt in einem Long einfügen Allgemeine Java-Themen 2
J JTextField nicht editierbar Allgemeine Java-Themen 5
G Aus JTextField Zahlen auslesen und random generieren Allgemeine Java-Themen 10
F JTextField funktioniert nicht Allgemeine Java-Themen 6
B JTextfield Allgemeine Java-Themen 9
E Eingabeprüfung JTextField. Fehler bei Copy-Paste Allgemeine Java-Themen 4
L JTextfield wird nicht ausgelesen Allgemeine Java-Themen 7
T JTextField in Listener leeren Allgemeine Java-Themen 2
M jTextField --> Zwischenspeicher Allgemeine Java-Themen 20
M Datum einlesen aus jTextField Allgemeine Java-Themen 2
G JTextField mit Zeichenbeschränkung Allgemeine Java-Themen 7
E JTextField auf JWindow Allgemeine Java-Themen 2
P Suche Benis IP/Netzwerkadresse JTExtField Allgemeine Java-Themen 2
S JTable editieren + in JTextField schreiben Allgemeine Java-Themen 7
O Inhalt vom JTextfield im DebugMode ermitteln? Allgemeine Java-Themen 2
M Autovervollständigung im JTextField Allgemeine Java-Themen 3
P JTextField textfarbe schwarz auch wenn JTF deaktiviert ist Allgemeine Java-Themen 4
M Text in JTextfield einfügen sofort dann wird Text gekürzt Allgemeine Java-Themen 2
MQue JTextField Kommastellen Allgemeine Java-Themen 5
G Problem mit jTextField Allgemeine Java-Themen 7
D JTextfield für double werte Allgemeine Java-Themen 2
D Probleme beim FAQ (JTextField: Dokumentarten) Allgemeine Java-Themen 5
H Position von JTextField Allgemeine Java-Themen 2
O String übergeben ist name eines JTextField wie zugreifen Allgemeine Java-Themen 9
Z JTextField mit Model kommunizieren Allgemeine Java-Themen 6
G Fragen zu JTextField bzw. JTextArea Allgemeine Java-Themen 2
G JTextField: Feld für Ausgabe von Meldungen Allgemeine Java-Themen 14
G Frage zu JTextField Allgemeine Java-Themen 2
E Field-Objekt in JTextField parsen Allgemeine Java-Themen 3
F KeyListener für JTextField Allgemeine Java-Themen 4
G Nur Integer Werte in JTextField Allgemeine Java-Themen 4
H JTextField Allgemeine Java-Themen 2
C JTextField Allgemeine Java-Themen 9
B TextListener bei JTextField Allgemeine Java-Themen 6
kodela Eingabe für TextArray bedingt sperren Allgemeine Java-Themen 3
M Kein Scanner Fehler durch falsche EIngabe Allgemeine Java-Themen 4
N Eingabe wird immer als "false" ausgegeben Allgemeine Java-Themen 6
N String Array Eingabe Allgemeine Java-Themen 6
W Java Telegram Bot - Eingabe durch User Allgemeine Java-Themen 2
M Keine weitere Eingabe in der Main möglich. Eventueller Ansatz über while. Allgemeine Java-Themen 8
G Eingabe auftrennen Allgemeine Java-Themen 3
K OOP Daten addieren sich bei GUI-Eingabe Allgemeine Java-Themen 10
D Flasche Eingabe erkennen Allgemeine Java-Themen 4
K Eingabe mit Char vergleichen klappt nicht! Allgemeine Java-Themen 2
0 Eingabe nicht möglich... Allgemeine Java-Themen 12
Sin137 Interface Eingabe wird doppelt angezeigt Allgemeine Java-Themen 2
C Cmd Eingabe als Administrator Allgemeine Java-Themen 4
J Anzahl der Zeichen bei Eingabe begrenzen Allgemeine Java-Themen 5
M Eingabe von Arrays geht über gewünschte Anzahl hinaus Allgemeine Java-Themen 2
S Erste Schritte Arrayliste alphabetisch sortieren mit Eingabe Allgemeine Java-Themen 9
Cayton Bruchrechner stürzt bei eingabe negativer Zahlen ab Allgemeine Java-Themen 4
S Antlr Grammatik übersetzt ohne Fehler, dennoch wird Zahl nicht als Eingabe erkannt Allgemeine Java-Themen 4
M Befehl in Runtime ausführen der Eingabe benötigt Allgemeine Java-Themen 3
Z Taschenrechner größere Eingabe Allgemeine Java-Themen 3
R Programm soll warten bis eine Passwort eingabe gemacht wurde. Allgemeine Java-Themen 6
M Tastatur eingabe über Buttons Allgemeine Java-Themen 15
D zeichenerkennung für umlaute bei eingabe Allgemeine Java-Themen 4
M Eingabe Überprüfen Allgemeine Java-Themen 3
D Batch-Datei Eingabe Allgemeine Java-Themen 2
N IP-Adresse Eingabe abfragen? Allgemeine Java-Themen 4
S Listener Implentierung bei Eingabe in Textfeld Allgemeine Java-Themen 2
P MS Dos Eingabe Allgemeine Java-Themen 7
M JTable: Anzahl Zeichen bei Eingabe Allgemeine Java-Themen 2
G Überprüfung der Eingabe ob Typ korrekt Allgemeine Java-Themen 4
G Problem mit Quellcode, Eingabe wird nicht angezeigt --HELP-- Allgemeine Java-Themen 2
B Programm soll auf die Eingabe vom Mouselistener warten. Allgemeine Java-Themen 19
M Programmablauf nach letzter eingabe erst fortsetzten Allgemeine Java-Themen 2
G eingabe Allgemeine Java-Themen 4
K Warten auf die Eingabe aus Fenster.... Allgemeine Java-Themen 2
B TextField ohne Eingabe Allgemeine Java-Themen 7
H Frage zu Wildcard Eingabe in Java! Allgemeine Java-Themen 5
R Eingabe eines Textfeldes mit Inhalt einer Datei vergleichen Allgemeine Java-Themen 4
L javaformular auf website (eingabe per email zusenden) Allgemeine Java-Themen 3
B Java Eingabe HELP ( eclipse ) Allgemeine Java-Themen 4
F Unsichtbare Eingabe Allgemeine Java-Themen 10
C Kettenelemente mit Bezeichner durch eingabe? Allgemeine Java-Themen 4
M Suche , bereits während der eingabe ?? Allgemeine Java-Themen 4
J Linux .jar beim Start automatisch ausführen Allgemeine Java-Themen 6
F Sich automatisch aufrufende Java-Methoden Allgemeine Java-Themen 2
P Strukturänderungen/abnormalien in Logfiles automatisch erkennen Allgemeine Java-Themen 5
F Java automatisch ausführen Allgemeine Java-Themen 3
ms_cikar RS232 Serielle Baudrate automatisch einstellen Allgemeine Java-Themen 1
M String automatisch in nächste Zeile umbrechen (Graphics) Allgemeine Java-Themen 6
L Prozess automatisch beenden Allgemeine Java-Themen 8
T Automatisch Mails versenden Allgemeine Java-Themen 4
B automatisch benannte arrays erstellen Allgemeine Java-Themen 9
K NetBeans Ordner bei 'Clean&Build' automatisch in dist Verzeichnis kopieren Allgemeine Java-Themen 0
F paintComponent() nicht automatisch ausführen? Allgemeine Java-Themen 5
das-mo Dokument automatisch ausfüllen Allgemeine Java-Themen 8
L Links aus dem Inet-Browser automatisch anklicken lassen Allgemeine Java-Themen 5
A Jasperreports automatisch ausführen lassen Allgemeine Java-Themen 5
A Login-Daten Formular automatisch ausfüllen Allgemeine Java-Themen 10
S Programm das automatisch ungenutzten Source-Code entfernt..? Allgemeine Java-Themen 4
Iron Monkey JNLP nach Änderung automatisch aktualisieren Allgemeine Java-Themen 18
F Klassendiagramm / UML Diagramm automatisch erstellen Allgemeine Java-Themen 3
F WebBrowser Button automatisch drücken Allgemeine Java-Themen 5
K Eclipse automatisch Projekte cleanen und builden lassen Allgemeine Java-Themen 5
TiME-SPLiNTER Binary BufferedImage automatisch croppen Allgemeine Java-Themen 4

Ähnliche Java Themen

Neue Themen


Oben