hi zusammen ....
ich versuche moment krampfhaft, einen eigenen TableCellEditor zu implementieren.
meine eigene Component welche ich verwenden möchte besteht aus einem JTextField sowie einem JButton. per button kann man einen pfad auf dem lokalen rechner auswählen, welcher anschliessend im JTextField erscheinen soll.
das funktioniert au prächtig... möchte ich das ganze jetzt aber in meiner JTable als CellEditor verwenden, gibts probleme.
beispiel:
ich starte das bearbeiten der zelle. der editor wird angezeigt, alles funktioniert wunderbar.
klicke ich auf eine andere zelle in der gleichen JTable, wird der editor geschlossen und der wert übernommen. auch hier alles wunderbar.
befinde ich mich jetzt aber in meinem editor, und wechsle den fokus auf eine komplett andere component (also z.b. auf ein anderes JTextField in meinem dialog), verschwindet der wert welcher bis anhin in meiner editor-component gestanden hat auf nimmerwiedersehen
hier meine implementierung:
kann mir vielleicht jemand weiterhelfen? hatte jemand ein ähnliches problem?
vielen dank & grüsse
m@nu
ich versuche moment krampfhaft, einen eigenen TableCellEditor zu implementieren.
meine eigene Component welche ich verwenden möchte besteht aus einem JTextField sowie einem JButton. per button kann man einen pfad auf dem lokalen rechner auswählen, welcher anschliessend im JTextField erscheinen soll.
das funktioniert au prächtig... möchte ich das ganze jetzt aber in meiner JTable als CellEditor verwenden, gibts probleme.
beispiel:
ich starte das bearbeiten der zelle. der editor wird angezeigt, alles funktioniert wunderbar.
klicke ich auf eine andere zelle in der gleichen JTable, wird der editor geschlossen und der wert übernommen. auch hier alles wunderbar.
befinde ich mich jetzt aber in meinem editor, und wechsle den fokus auf eine komplett andere component (also z.b. auf ein anderes JTextField in meinem dialog), verschwindet der wert welcher bis anhin in meiner editor-component gestanden hat auf nimmerwiedersehen
hier meine implementierung:
Code:
/*
* Created on 03.06.2005
*/
package net.msites.drivesync.gui.core.celleditors;
import java.awt.Component;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.ArrayList;
import java.util.EventObject;
import javax.swing.JTable;
import javax.swing.event.CellEditorListener;
import javax.swing.event.ChangeEvent;
import javax.swing.table.TableCellEditor;
import net.msites.drivesync.gui.reusable.components.JFolderChooser;
/**
* @author Manuel Alabor
*/
public class FolderChooserCellEditor extends JFolderChooser implements TableCellEditor {
/* Objekte: */
private ArrayList listeners;
private String currentValue;
public FolderChooserCellEditor() {
/* Initialisieren: */
listeners = new ArrayList();
currentValue = "";
/* KeyListener hinzufügen: */
// Der folgende KeyListener ermöglicht das Beenden der Eingabe durch
// drücken der [Enter]-Taste. Per [Escape] kann die Eingabe abgebrochen
// werden.
// Der KeyListener wird dem Textfeld der JFolderChooser-Component hinzu-
// gefügt.
getTextField().addKeyListener(new KeyListener() {
public void keyReleased(KeyEvent ke) {
if(ke.getKeyCode() == KeyEvent.VK_ENTER) {
fireEditingStopped();
} else if(ke.getKeyCode() == KeyEvent.VK_ESCAPE) {
fireEditingCanceled();
}
}
public void keyPressed(KeyEvent arg0) {}
public void keyTyped(KeyEvent ke) {}
});
/* FocusListener hinzufügen: */
// Sobald das JTextField den Fokus verliert, muss geprüft werden, ob
// das editingStopped-Ereignis ausgelöst werden muss.
// Hat z.B. der Browse-Button das Fokus erhalten, muss das Ereignis
// nicht ausgelöst werden.
getTextField().addFocusListener(new FocusListener() {
public void focusLost(FocusEvent fe) {
Component opp = fe.getOppositeComponent();
if(opp != null && !opp.equals(getBrowseButton())) {
fireEditingStopped();
}
}
public void focusGained(FocusEvent arg0) {}
});
}
public void cancelCellEditing() {
setPath(currentValue);
}
public boolean stopCellEditing() {
currentValue = getPath();
return true;
}
public Object getCellEditorValue() {
return currentValue;
}
public boolean isCellEditable(EventObject arg0) {
return true;
}
public boolean shouldSelectCell(EventObject arg0) {
return false;
}
// TableCellEditor Implementierung -----------------------------------------
public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
setPath(value.toString());
return this;
}
// Event-Auslösung ---------------------------------------------------------
/**
* Löst das <code>editingStopped</code>-Ereigniss bei allen angeschlossenen
* <code>CellEditorListener</code> aus.
*/
private void fireEditingStopped() {
ChangeEvent event = new ChangeEvent(this);
// TRICKY würde für das abarbeiten ein Iterator verwendet, würde eine
// ConcurrentModificationException ausgegeben, da die JTable, welche
// diesen Editor verwendet, den CellEditorListener bereits wieder ent-
// fernen will, in dem Moment wo hier das Event geschickt wird.
// Per int-for-Schlaufe besteht dieses Problem nicht.
for(int i = 0; i < listeners.size(); i++) {
CellEditorListener listener = (CellEditorListener)listeners.get(i);
listener.editingStopped(event);
}
}
/**
* Löst das <code>editingCanceled</code>-Ereigniss bei allen angeschlossenen
* <code>CellEditorListener</code> aus.
*/
private void fireEditingCanceled() {
ChangeEvent event = new ChangeEvent(this);
for(int i = 0; i < listeners.size(); i++) {
CellEditorListener listener = (CellEditorListener)listeners.get(i);
listener.editingCanceled(event);
}
}
// Listener-Verwaltung -----------------------------------------------------
/**
* @param listener
*/
public void addCellEditorListener(CellEditorListener listener) {
if(!listeners.contains(listener)) {
listeners.add(listener);
}
}
/**
* @param listener
*/
public void removeCellEditorListener(CellEditorListener listener) {
listeners.remove(listener);
}
}
kann mir vielleicht jemand weiterhelfen? hatte jemand ein ähnliches problem?
vielen dank & grüsse
m@nu