JTextArea als CellEditor - Editieren beenden, wenn ENTER gedrückt wurde

Ich bräuchte mal wieder Hilfe, habe mich völlig verstrickt.

Ich habe ein Beispiel mit einer JTable, die in den Zellen einer Spalte eine JTextArea als Editor und Renderer benutzt, im Web gefunden.
Nun würde ich das gerne so anpassen, dass die Zelle beim Drücken auf die ENTER-Taste verlassen, das editieren also beendet wird.

Was müsste man da wo einbauen, damit das klappt?

*** Edit ***

Habe eben noch was gefunden, dass das über KeyBindings geht. Ein Beispiel werde ich mir mal noch suchen.
Vielleicht kann ja jemand trotzdem noch meine Frage oben kurz beantworten.

*** Edit ***

OK, mit folgendem Code, kann ich das Editieren mit STRG+ENTER beenden:

                , KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, KeyEvent.CTRL_MASK)
                , JComponent.WHEN_FOCUSED);

Zusätzlich muss man dann ActionListener implementieren:

        stopCellEditing();
    }```

Nicht ganz, was ich wollte. Ich suche mal noch weiter...

Sorry, keine Antwort (normalerweise beantwortest DU die JTable-Fragen immer, deswegen hat mich das jetzt neugierig gemacht :smiley: ) : Warum eine JTextArea, wenn man sowiese keinen mehrzeiligen Text eingeben kann?! (weil… Enter ja dann nicht mehr geht…). Copy&Paste von Textblöcken in den Editor oder so?

Nee Marco13, da verwechselt du mich jetzt. JTable ist nicht meine Disziplin. Aber ich will das endlich mal angehen. Daher kommen seit Kurzem gehäuft Fragen von mir zum Thema. Standardsachen bekomme ich hin, aber eben die Sachen, die man seltener sieht, die interessieren mich.

Wieso muss es denn ein JTextArea sein? JTextField verhält sich doch wie gewünscht…

bye
TT

Der Text in der Zelle ist recht dynamisch. Es können nur zwei oder drei Worte sein, aber auch mehrere Wortgruppen, die dann nicht mehr in einem Textfeld angezeigt werden können. Die Anzeige sollte also auch Mehrzeiligkeit unterstützen. Excel-ähnlich wäre ideal.
Ich habe keinen Schimmer, wie man sowas bauen könnte.
Die Leute von OpenOffice/Libreoffice haben das hin bekommen. Teile der Suiten sind, so weit ich weiß, in Java geschrieben worden.

das
[spoiler]```public class TableEnterTest {
private static final String INSERT_BREAK = “insert-break”;
private static final String TEXT_SUBMIT = “text-submit”;
public static void main(String[] args) {

	final List<String> data = new ArrayList<String>(Arrays.asList(
			"Test1

Test2", “Test1
Test2”, “Test1
Test2”,
“Test1
Test2”, “Test1
Test2”, “Test1
Test2 Test2 Test2 Test2 Test2 Test2 Test2 Test2 Test2 Test2 Test2 Test2 Test2 Test2 Test2 Test2
Test3”, “Test1
Test2”, “Test1
Test2”,
“Test1
Test2”, “Test1
Test2”, “Test1
Test2”));

	DefaultTableModel defaultTableModel = new DefaultTableModel(
			data.size(), 1) {
		@Override
		public Class<?> getColumnClass(int columnIndex) {
			return String.class;
		}

		@Override
		public Object getValueAt(int row, int column) {
			return data.get(row);
		}

		@Override
		public boolean isCellEditable(int row, int column) {
			return true;
		}

		@Override
		public void setValueAt(Object aValue, int row, int column) {
			data.remove(row);
			data.add(row, (String) aValue);
		}

	};

	JTable jTable = new JTable(defaultTableModel);
	final JTextArea rendererComponent = new JTextArea();
	rendererComponent.setWrapStyleWord(true);
	rendererComponent.setLineWrap(true);

	setCellRenderer(jTable, rendererComponent);
	setCellEditor(jTable, rendererComponent);
	jTable.setRowHeight(60);

	JOptionPane.showMessageDialog(null, jTable, "Abort Test",
			JOptionPane.PLAIN_MESSAGE);

}

private static void setCellEditor(JTable jTable,
		final JTextArea rendererComponent) {
	class TextAreaCellEditor extends AbstractCellEditor implements
			TableCellEditor {
		@Override
		public Object getCellEditorValue() {
			return rendererComponent.getText();
		}

		@Override
		public Component getTableCellEditorComponent(JTable table,
				Object value, boolean isSelected, int row, int column) {
			rendererComponent.setText((String) value);
			return rendererComponent;

// return new JScrollPane( rendererComponent);
}

	}
	final TableCellEditor tableCellEditor = (TableCellEditor) new TextAreaCellEditor();
	KeyStroke enter = KeyStroke.getKeyStroke("ENTER");
	KeyStroke altEnter = KeyStroke.getKeyStroke("alt ENTER");
	InputMap input = rendererComponent.getInputMap();
	input.put(altEnter, INSERT_BREAK); 
	input.put(enter, TEXT_SUBMIT);

	ActionMap actions = rendererComponent.getActionMap();
	actions.put(TEXT_SUBMIT, new AbstractAction() {
		@Override
		public void actionPerformed(ActionEvent e) {
			tableCellEditor.stopCellEditing();
		}
	});
	rendererComponent.getActionMap().put("released", new AbstractAction() {

		@Override
		public void actionPerformed(ActionEvent arg0) {
			tableCellEditor.stopCellEditing();
		}
	});

	jTable.setDefaultEditor(String.class, tableCellEditor);
}

private static void setCellRenderer(JTable jTable,
		final JTextArea rendererComponent) {
	DefaultTableCellRenderer tableCellRenderer = new DefaultTableCellRenderer() {

		@Override
		public Component getTableCellRendererComponent(JTable table,
				Object value, boolean isSelected, boolean hasFocus,
				int row, int column) {
			Component defaultComponent = super
					.getTableCellRendererComponent(table, value,
							isSelected, hasFocus, row, column);
			rendererComponent.setBackground(defaultComponent
					.getBackground());
			rendererComponent.setForeground(defaultComponent
					.getForeground());
			rendererComponent.setFont(defaultComponent.getFont());
			rendererComponent.setBorder(((JComponent) defaultComponent)
					.getBorder());
			rendererComponent.setText((String) value);
			return rendererComponent;
		}

	};

	jTable.setDefaultRenderer(String.class, tableCellRenderer);
}

}```[/spoiler]
ist ziehmlich “excel-like”:
Enter beendet Editieren,
Alt+Enter fügt Zeilenumbruch ein
und shift+enter beendet den Dialog.

Leider klappt die aktivierung nicht mehr, sobald der Editor 'ne JScollPane bekommt…

bye
TT

Danke. Interessanter Code-Schnipsel, muss ich erstmal zerlegen.
Hast du es so vorgesehen, dass beim Zellwechsel per Mausklick die Inhalte der Vorgängerzelle in die aktive Zelle kopiert werden?

*** Edit ***

Meine Suche ergab noch dieses nette Stück Code. http://blog.botunge.dk/post/2009/10/09/JTable-multiline-cell-renderer.aspx
Ein Renderer, der mir sehr gut gefällt. So habe ich es mit vorgestellt.
Jetzt suche ich noch den passenden Editor.

[quote=L-ectron-X]Hast du es so vorgesehen, dass beim Zellwechsel per Mausklick die Inhalte der Vorgängerzelle in die aktive Zelle kopiert werden?[/quote]nein.
rendererComponent.setText((String) value); in getTableCellEditorComponent() sollte das eigentlich verhindern…

bye
TT

Ich habe mal ein bisschen rumprobiert. Nun kann die als TableCellEditor eingebaute JTextArea mit folgendem Code mit dem Drücken der Enter-Taste verlassen werden:

   KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, JComponent.WHEN_FOCUSED),
   JComponent.WHEN_FOCUSED);

…und dann nicht die actionPerformed()-Methode in der Klasse vergessen.