# JPanel mit Textfeld als TableCellEditor



## Mr.Eddie (12. Jun 2006)

Hallo alle zusammen!

Sobald ich in der JTable auf irgendeiner Zelle anfange zu tippen, springt die Tabelle standardmäßig in den Editier-Modus und das Geschrieben steht in einem Textfeld, dass sich anzeigt (also im Standard-Editor). Ich habe nun ein Problem mit einem TableCellEditor, dessen Methode getTableCellEditorComponent(...) ein JPanel zurückgibt, das wiederum ein Textfeld enthält. Wenn ich mit TAB in die Spalte wechsle, die den JPanel-Editor zugewiesen bekommen hat, und dort anfange zu tippen, wird zwar das Panel angezeigt, aber nicht das Textfeld im Panel fokussiert bzw. der geschriebene Text wird dort nicht hineingeschrieben. Nun habe ich bereits reichlich Beispiele im Internet gefunden, wie man eigene noch so komplexe Editoren zusammenbauen kann, aber auch wenn ich diese Editoren verwende, wird nach Drücken einer Taste lediglich das Panel angezeigt. Erst wenn ich mit der Maus in das Textfeld selbst klicke, kann ich dort was eintragen. Weiß jemand, wie man es hinkriegen kann, dass ein Editor beim Editierstart einer bestimmten Komponente den Fokus gibt, möglichst so, dass das erste getippte Zeichen bereits berücksichtigt wird?

Hier noch mal der Code, mit dem beispielsweise das Problem auftritt:


```
...

    jTable.getColumnModel().getColumn(1).setCellEditor(new MyEditor());

    ...

    class MyEditor extends AbstractCellEditor implements TableCellEditor {
        JPanel panel;
        JTextField txt;
        public MyEditor() {
            panel = new JPanel(new BorderLayout(0,0));
            txt = new JTextField();
            panel.add(txt);
        }

        public Object getCellEditorValue() {
            return txt.getText();
        }

        public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
            txt.setText(value != null ? value.toString() : null);
            return panel;
        }
    }
```

Es sei noch zu erwähnen: Das Textfeld liegt in einem Panel, weil neben dem Textfeld noch ein Button angezeigt werden soll, den ich hier aber weggelassen habe, da er für das Problem uninteressant sein dürfte.


----------



## thE_29 (12. Jun 2006)

Wenn du den Button weglässt, gehts dann?

Bzw, probier das hier mal (glaube aber nicht das es was hilft)

    jTable.setDefaultEditor(Object.class,new MyEditor());


----------



## Mr.Eddie (12. Jun 2006)

Das Problem tritt scheinbar immer dann auf, wenn sich die Komponente, die den eigentlichen Editor darstellt, in einem Kontainer wie beispielsweise JPanel befindet. So, wie der Code oben dargestellt wird (also ohne JButton), tritt der Fehler schon auf. Der Grund könnte sein, dass die Komponente, die von getTableCellEditorComponent(...) zurückgegeben wird, den Fokus erhält, in dem Fall also das JPanel und nicht das Textfeld. Aber auch wenn es so ist, wie kann ich daran etwas ändern? Mit requestFocus() auf dem Textfeld habe ich keine Erfolge erzielen können.

Ich habe es noch mal mit 
	
	
	
	





```
jTable.setDefaultEditor(Object.class, new MyEditor());
```
 probiert, was sich aber wie erwartet nicht anders verhält.


----------



## thE_29 (12. Jun 2006)

Wenn du nochmals in das Feld reinklickst, kannst du dann schreiben?

So, seh gerade das ich sowas auch habe (also eine Editor mit Jpanel)


du musst im Konstruktor noch das sagen


    this.setOpaque(true);


----------



## Mr.Eddie (12. Jun 2006)

Ich habe noch ein bisschen rumprobiert und es zumindest geschafft, dass das Textfeld nach einer Eingabe den Fokus bekommt. Leider geht das per Tastatur eingegebene Zeichen allerdings verloren, somit kann das also nicht die endgültige Lösung darstellen.

Ich habe die Methode getTableCellEditorComponent(...) wie folgt abgeändert:

```
public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
            txt.setText(value != null ? value.toString() : null);
            SwingUtilities.invokeLater(new Runnable() {
                public void run() {
                    txt.requestFocusInWindow();
                }
            });
            return panel;
        }
```


----------



## thE_29 (12. Jun 2006)

Wie gesagt, ich habe auch sowas nur JTextField + JLabel(icon) und bei mir hat der immer im TextFeld den focus...


Aber das kann nur via Mausklick bei mir ausgelöst werden...


Mhm... Die FAQs bezüglich JTable schon angeguckt?


----------



## Mr.Eddie (12. Jun 2006)

Also wenn ich mit der Maus in das Feld klicke, dann springt er tatsächlich direkt in das Textfeld. Aber es ist leider zwingend erforderlich, dass es auch per TAB-Taste bzw. beim 
Verwenden der Pfeiltasten funktioniert.

Die FAQs habe ich nicht gelesen, allerdings habe ich auch nicht damit gerechnet, dass sich zu dem Thema dort etwas finden lässt.


----------



## thE_29 (12. Jun 2006)

Dort ist ein riesen Tutorial zu JTable von Beni!

Man sollte net denken, da wird nix drin sein, sondern mal lieber zuerst reinschauen!!

Ist 5 - 10 sekunden länger und hilft einem viel!! (glaubt man kaum..)

Desweiteren gibts ja auch noch die Boardsuche.. aber die nutzt anscheinend sowieso keiner..


----------



## Mr.Eddie (12. Jun 2006)

Also im Tutorial ist leider nichts dazu erwähnt und in den FAQs selber auch nicht (was mich auch sehr gewundert hätte). Die Forensuche hatte ich schon probiert und auch dort nichts gefunden, was mich jedoch schon mehr gewundert hat. Kann mir eigentlich nicht vorstellen, der erste zu sein, der dieses Problem hat. Doch selbst im Internet unter Einbeziehung englischsprachiger Foren bin ich leider noch nicht fündig geworden.


----------



## thE_29 (12. Jun 2006)

http://www.java-forum.org/de/viewtopic.php?t=7703

Hier ist ein Editor!

Es stellt halt spezielle für dein Problem nix...

Das ist war..

Aber schau dirs mal an, vielleicht kommt ein Gedankesblitz ^^


----------

