Beim Start von TableEditor Inhalt der Zelle markieren.

MSJones

Mitglied
Hallo.

Folgendes Problem:
Ich hab eine Tabelle, zu der ich mir einen eigenen Editor zusammengebastelt habe.
Nun möchte ich erreichen, daß wenn der Editor aktiv wird, der bestehende Inhalt markiert wird und der Benutzer so einfach drauf los schreiben kann und nicht erst den alten Wert löschen muß.

Leider funktioniert das nicht so richtig.

Hier erstmal mein Code:
Die eigentliche Tabelle:
Java:
package TableEditor;

import java.awt.Dimension;

import javax.swing.JFrame;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;

public class Table extends JFrame
{
	// Konstanten:
	private static final long serialVersionUID = 1941793965489302399L;

	// Attribute:
	public static void main (String[] args)
	{
		Table table = new Table();
		table.start();
	}
	
	public void start()
	{
		DefaultTableModel model1 = new DefaultTableModel(new String[]{"header1", "header2", "header3", "header4"}, 4);
		MyColumnModel columnModel1 = new MyColumnModel();

		JTable tbl = new JTable(model1, columnModel1);
		tbl.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
		tbl.createDefaultColumnsFromModel();

		tbl.setValueAt("123", 1, 1);
		tbl.setValueAt("123", 2, 2);
		tbl.setValueAt("123", 3, 3);

		tbl.setPreferredSize(new Dimension(200,200));
		add(tbl);
		pack();
		setVisible(true);
	}
}

Das ColumnModel:
Java:
package TableEditor;

import javax.swing.table.DefaultTableColumnModel;
import javax.swing.table.TableColumn;

public class MyColumnModel extends DefaultTableColumnModel
{
	// Konstanten:
	private static final long serialVersionUID = -7727423991064482954L;
	
	// Attribute:

	@Override
	public void addColumn(TableColumn aColumn)
	{
		super.addColumn(aColumn);
		
		aColumn.setCellEditor(new MoneyCellEditor());
	}
}

Und der Editor:
Java:
package TableEditor;

import java.awt.Color;
import java.awt.Component;

import javax.swing.AbstractCellEditor;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.table.TableCellEditor;

public class MoneyCellEditor extends AbstractCellEditor implements TableCellEditor
{
	// Konstanten:
	private static final long serialVersionUID = -7264931193618526446L;
	
	// Attribute:
	private JTextField text = new JTextField();
	
	@Override
	public Object getCellEditorValue()
	{
		if (text.getText().trim().equals(""))
		{
			text.setText("0");
		}
		text.setText(Double.valueOf(text.getText().replace(",", ".")) + " €");
		return text.getText();
	}

	@Override
	public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column)
	{
		if (value == null)
		{
			text.setText("");
			return text;
		}
		
		String strValue = value.toString();
		text.setText(strValue.replace(".", "").replace(" ", "").replace("€", "").replace(",", "."));
		
		System.out.println("Selected");
		text.selectAll();
		System.out.println(text.getSelectedText());
		text.setBackground(Color.RED);
		
		return text;
	}
}

Die Roteinfärbung von der Zelle wird gemacht, ich bekomme auch zurückgemeldet, daß der Text markiert ist, aber beim Ändern bleibt der alte Text trozdem einfach stehen.

Wo liegt mein Fehler, was mach ich falsch?
Und was muß ich ändern, damit es richtig funktioniert?

Gruß,
MSJones
 
Das ist ein bisschen kompliziert, ich schätze das läuft intern so ab: Dein Cell Editor gibt das Textfeld zurück, danach weist der JTable dem Textfeld aber noch einen focus zu und deine Selection is wieder futsch.
So funktioniert das ganze so wie du willst (schätz ich mal):
Java:
class MyTableCellEditor extends AbstractCellEditor implements TableCellEditor
	{
		JTextField textField=new JTextField();
	
		MyTableCellEditor()
		{
			textField.addFocusListener(new FocusAdapter(){

				@Override
				public void focusGained(FocusEvent arg0) {
					textField.selectAll();
				}
			});
		}
		@Override
		public Object getCellEditorValue() {
			return textField.getText();
		}

		@Override
		public Component getTableCellEditorComponent(JTable table,
				Object value, boolean isSelected, int row, int column) {
			
			textField.setBackground(Color.red);
			if(value!=null)
			{
				textField.setText(value.toString());
			}
			else
			{
				textField.setText("");
			}
			return textField;
		}
	}
 

Zurück
Oben