Dieser funktioniert nur wenn ich einen actionBuffer anlege bei dem ich für jedes eingegebene Zeichen einen Asterisk und für Enter, Backspace und Delete ein '|'.
Das ganze alles, um die Zeilen nicht neu zu setzen wenn noch Zeichen in der Zeile in der gelöscht wird stehen.
1. Problem: ist dann wenn ich nicht am Ende des Textes der TextArea beginne funktioniert das ganze nicht.
2. Problem: ich muss den actionBuffer mit in der Datenbank speichern.
3. Problem: wenn ich einen Teil des Textes markiere und lösche wird nicht der vorgesehene Teil im actionBuffer nicht gelöscht.
4. Problem: gibt es bestimmt, ist mir aber noch nicht bekannt
Ich habs mit der CaretPosition scho versucht. Diese gibt mir aber immer nur die Position aus an der der Cursor zuvor stand.
Gibt es einen Source Code der auf alle möglichen Eingaben des Benutzers reagiert.
D.h. z.B. neu setzen der Zeilenhöhe wenn kein Text mehr in der zu löschenden Zeile steht, oder nicht neu setzen wenn noch Text drin steht, bei Enter und line wrap neu setzen der Zeilenhöhe,...
Bin schon eine ganze Weile an diesem Problem und komm nur sehr spärlich weiter. Bin daher dankbar über jede Hilfe.
Vielen Dank schonmal im voraus
Romsl
Das ganze alles, um die Zeilen nicht neu zu setzen wenn noch Zeichen in der Zeile in der gelöscht wird stehen.
1. Problem: ist dann wenn ich nicht am Ende des Textes der TextArea beginne funktioniert das ganze nicht.
2. Problem: ich muss den actionBuffer mit in der Datenbank speichern.
3. Problem: wenn ich einen Teil des Textes markiere und lösche wird nicht der vorgesehene Teil im actionBuffer nicht gelöscht.
4. Problem: gibt es bestimmt, ist mir aber noch nicht bekannt
Ich habs mit der CaretPosition scho versucht. Diese gibt mir aber immer nur die Position aus an der der Cursor zuvor stand.
Gibt es einen Source Code der auf alle möglichen Eingaben des Benutzers reagiert.
D.h. z.B. neu setzen der Zeilenhöhe wenn kein Text mehr in der zu löschenden Zeile steht, oder nicht neu setzen wenn noch Text drin steht, bei Enter und line wrap neu setzen der Zeilenhöhe,...
Code:
import javax.swing.event.*;
import java.util.EventObject;
import javax.swing.*;
import javax.swing.table.*;
import java.awt.*;
import daps_gui.*;
import java.sql.*;
import java.awt.event.*;
/**
* <p>Headline: </p>
* <p>Description: </p>
* @version 1.0
*/
public class MultiCellEditor extends AbstractCellEditor implements TableCellEditor {
protected EventListenerList listenerList = new EventListenerList();
transient protected ChangeEvent changeEvent = null;
protected int lineCount = 0;
protected StringBuffer actionBuffer = new StringBuffer();
protected KeyListener keyListener = new KeyAdapter() {
public void keyPressed(KeyEvent e) {
try {
if (e.getKeyCode() == e.VK_BACK_SPACE || e.getKeyCode() == e.VK_DELETE) {
if (actionBuffer.charAt(actionBuffer.length() - 1) == '|') {
table.setRowHeight(tableRow - 1, (table.getFont().getSize() + 4) * (textArea.getLineCount() - 1));
lineCount = textArea.getLineCount();
actionBuffer.deleteCharAt(actionBuffer.length() - 1);
System.out.println(actionBuffer);
}
else {
table.setRowHeight(tableRow - 1, (table.getFont().getSize() + 4) * (textArea.getLineCount()));
lineCount = textArea.getLineCount();
actionBuffer.deleteCharAt(actionBuffer.length() - 1);
System.out.println(actionBuffer);
}
}
else if (e.getKeyCode() == e.VK_ENTER && !e.isControlDown()) {
table.setRowHeight(tableRow - 1, (table.getFont().getSize() + 4) * (textArea.getLineCount() + 1));
lineCount = textArea.getLineCount();
actionBuffer.append('|');
}
else if (e.getKeyCode() == e.VK_ENTER && e.isControlDown()) {
lineCount = textArea.getLineCount();
stopCellEditing();
}
else if (!e.isActionKey()) {
table.setRowHeight(tableRow - 1, (table.getFont().getSize() + 4) * (textArea.getLineCount()));
lineCount = textArea.getLineCount();
actionBuffer.append('*');
}
}
catch (IndexOutOfBoundsException ioofe) {
//do nothing
}
}
};
protected JTextArea textArea = new JTextArea();
protected Font font = new Font("SansSerif", Font.PLAIN, 10);
protected DAPS daps = null;
protected ReservationGUI reservationGUI = null;
protected ResultSet data = null;
protected int reid = 0;
protected int zid = 0;
protected JTable table = null;
protected int tableRow = 0;
public MultiCellEditor(DAPS daps, ReservationGUI reservationGUI, int reid) {
this.daps = daps;
this.reservationGUI = reservationGUI;
this.reid = reid;
}
/**
* Returns true.
* @param e an event object
* @return true
*/
public boolean isCellEditable(EventObject e) {
return true;
}
/**
* Returns true.
* @param anEvent an event object
* @return true
*/
public boolean shouldSelectCell(EventObject anEvent) {
return true;
}
/**
* Calls <code>fireEditingStopped</code> and returns true.
* @return true
*/
public boolean stopCellEditing() {
this.daps.reservation.changeDescription(reid, zid, this.textArea.getText(), this.actionBuffer.toString());
try {
this.actionBuffer.delete(0, actionBuffer.length() - 1);
}
catch (StringIndexOutOfBoundsException sioobe) {
//do nothing
}
fireEditingStopped();
return true;
}
/**
* Calls <code>fireEditingCanceled</code>.
*/
public void cancelCellEditing() {
fireEditingCanceled();
}
/**
* Adds a <code>CellEditorListener</code> to the listener list.
* @param l the new listener to be added
*/
public void addCellEditorListener(CellEditorListener l) {
listenerList.add(CellEditorListener.class, l);
}
/**
* Removes a <code>CellEditorListener</code> from the listener list.
* @param l the listener to be removed
*/
public void removeCellEditorListener(CellEditorListener l) {
listenerList.remove(CellEditorListener.class, l);
}
/**
* Notifies all listeners that have registered interest for
* notification on this event type. The event instance
* is created lazily.
*
* @see EventListenerList
*/
protected void fireEditingStopped() {
// Guaranteed to return a non-null array
Object[] listeners = listenerList.getListenerList();
// Process the listeners last to first, notifying
// those that are interested in this event
for (int i = listeners.length - 2; i >= 0; i -= 2) {
if (listeners[i] == CellEditorListener.class) {
// Lazily create the event:
if (changeEvent == null) {
changeEvent = new ChangeEvent(this);
}
((CellEditorListener) listeners[i + 1]).editingStopped(changeEvent);
}
}
}
/**
* Notifies all listeners that have registered interest for
* notification on this event type. The event instance
* is created lazily.
*
* @see EventListenerList
*/
protected void fireEditingCanceled() {
// Guaranteed to return a non-null array
Object[] listeners = listenerList.getListenerList();
// Process the listeners last to first, notifying
// those that are interested in this event
for (int i = listeners.length - 2; i >= 0; i -= 2) {
if (listeners[i] == CellEditorListener.class) {
// Lazily create the event:
if (changeEvent == null) {
changeEvent = new ChangeEvent(this);
}
((CellEditorListener) listeners[i + 1]).editingCanceled(changeEvent);
}
}
}
public Object getCellEditorValue() {
return this.textArea.getText();
}
public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row,
int column) {
this.tableRow = row + 1;
this.table = table;
this.lineCount = this.textArea.getLineCount();
data = this.daps.reservation.getRoomsOfReservation(reid);
try {
data.absolute(tableRow);
this.zid = data.getInt(2);
actionBuffer.append(data.getString(8));
}
catch (SQLException sqle) {
sqle.printStackTrace();
}
actionBuffer.deleteCharAt(actionBuffer.length() - 1);
if (this.textArea.getKeyListeners().length < 1) {
this.textArea.addKeyListener(keyListener);
}
this.textArea.setText(String.valueOf(value));
this.textArea.setFont(font);
this.textArea.setWrapStyleWord(true);
this.textArea.setLineWrap(true);
return this.textArea;
}
}
Bin schon eine ganze Weile an diesem Problem und komm nur sehr spärlich weiter. Bin daher dankbar über jede Hilfe.
Vielen Dank schonmal im voraus
Romsl