R
Roar
Gast
hallo,
ich hab hiern kleines problem, es geht um folgendes:
ich hab eine Tabelle in der werden JLabels dargestellt, in der ersten spalte ist auch ein icon mit dabei. so, wenn jetzt die zelle editiert werden soll, würde ja standartmäßig ein JTexField erscheinen, und das JLabel als String dargestellt werden. das hab ich auch erfolgreich unterbunden mit einem eigenen CellEditor von DefaultCellEditor abgeleitet. wenn jetzt editiert wird soll anstatt dem normalen JLabel ein eigener Component angezeiget werden, der ein JLabel als icon und ein JTextField für den text beinhaltet. das klappt auch gut, und wenn ich jetzt beim editieren Escape drücke dann wird das editieren automaticsh gestoppt. so hier erstmal code, der mehr als 1000 worte sagt:
so. wie man sieht hab ich hier nen KeyListener eingebaut, damit das editieren gestoppt wird wenn man auf Enter drückt, und das geht auch soweit so gut, nur dass danach eine ClassCastException auftritt, weil ich in meinem TableCellRenderer die value in der zelle in ein JLabel caste, aber da ich hier bei meinem Editor per super den konstruktor mit dem JTextField aufgerufen hab, also steht da ein String in der zelle, es soll nach dem editieren aber weiterhin mein JLabel mit icon und dem neuen text drinstehen..
wie kann ich das realisieren?
edit:
so, der KeyListener muss natürlich am textField hängen, aber jetzt hab ich das problem, dass der KeyListener gar nicht angeworfen, bzw. erst zu spät angecallt wird, wenn man F1 oder Enter oder so drückt. wieso?
ich hab hiern kleines problem, es geht um folgendes:
ich hab eine Tabelle in der werden JLabels dargestellt, in der ersten spalte ist auch ein icon mit dabei. so, wenn jetzt die zelle editiert werden soll, würde ja standartmäßig ein JTexField erscheinen, und das JLabel als String dargestellt werden. das hab ich auch erfolgreich unterbunden mit einem eigenen CellEditor von DefaultCellEditor abgeleitet. wenn jetzt editiert wird soll anstatt dem normalen JLabel ein eigener Component angezeiget werden, der ein JLabel als icon und ein JTextField für den text beinhaltet. das klappt auch gut, und wenn ich jetzt beim editieren Escape drücke dann wird das editieren automaticsh gestoppt. so hier erstmal code, der mehr als 1000 worte sagt:
Code:
public class FileTableCellEditor extends DefaultCellEditor {
public FileTableCellEditor() {
super(new JTextField());
}
public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
if(((String)table.getColumnModel().getColumn(column).getHeaderValue()).equals("Name") && isSelected) {
return new FileTableEditingCell((JLabel)value, this);
} else {
return (JLabel)value;
}
}
}
class FileTableEditingCell extends JPanel implements KeyListener {
protected JTextField tf;
protected JLabel icon;
private TableCellEditor editor;
public FileTableEditingCell(JLabel lab, TableCellEditor editor) {
tf = new JTextField(((JLabel)lab).getText(), 20);
icon = new JLabel(((JLabel)lab).getIcon());
this.editor = editor;
setLayout(new BorderLayout());
add(icon, BorderLayout.WEST);
add(tf, BorderLayout.CENTER);
addKeyListener(this);
}
public void keyPressed(KeyEvent e) {
}
public void keyReleased(KeyEvent e) {
}
public void keyTyped(KeyEvent e) {
if(e.getKeyCode() == KeyEvent.VK_ENTER) {
editor.cancelCellEditing();
}
}
}
so. wie man sieht hab ich hier nen KeyListener eingebaut, damit das editieren gestoppt wird wenn man auf Enter drückt, und das geht auch soweit so gut, nur dass danach eine ClassCastException auftritt, weil ich in meinem TableCellRenderer die value in der zelle in ein JLabel caste, aber da ich hier bei meinem Editor per super den konstruktor mit dem JTextField aufgerufen hab, also steht da ein String in der zelle, es soll nach dem editieren aber weiterhin mein JLabel mit icon und dem neuen text drinstehen..
wie kann ich das realisieren?
edit:
so, der KeyListener muss natürlich am textField hängen, aber jetzt hab ich das problem, dass der KeyListener gar nicht angeworfen, bzw. erst zu spät angecallt wird, wenn man F1 oder Enter oder so drückt. wieso?