Hallo an alle,
Frage:
Wie kann ich in einer JTable einen "excelähnlichen Editiermodus" erreichen, d.h. wenn ich eine Zelle anwähle und hineinschreibe, dann wird alles andere, was voher drinstand gelöscht.
Mein Ansatz:
Ich möchte gerne den TableEditor anpassen. Ich habe dazu auch schon zwei Versuche unternommen, die beide leider fehlgeschlagen sind -- neue Eingaben werden einfach an den alten Inhalt der Zelle angehängt.
Wunsch 🙂
Ich möchte gerne das Konzept hinter JTables und Swing verstehen, deshalb sind Ansätze, wie man sie hier findet für mich eher uninteressant.
Klasse mit Tabelle:
Erster Versuch CellEditor
Zweiter Versuch CellEditor Quelle
Frage:
Wie kann ich in einer JTable einen "excelähnlichen Editiermodus" erreichen, d.h. wenn ich eine Zelle anwähle und hineinschreibe, dann wird alles andere, was voher drinstand gelöscht.
Mein Ansatz:
Ich möchte gerne den TableEditor anpassen. Ich habe dazu auch schon zwei Versuche unternommen, die beide leider fehlgeschlagen sind -- neue Eingaben werden einfach an den alten Inhalt der Zelle angehängt.
Wunsch 🙂
Ich möchte gerne das Konzept hinter JTables und Swing verstehen, deshalb sind Ansätze, wie man sie hier findet für mich eher uninteressant.
Klasse mit Tabelle:
Java:
package tableSelectionTest;
import java.awt.EventQueue;
import javax.swing.JFrame;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;
import javax.swing.JScrollPane;
public class JTableCellEditorTest {
private JFrame frame;
private JTable table;
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
JTableCellEditorTest window = new JTableCellEditorTest();
window.frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
public JTableCellEditorTest() {
frame = new JFrame();
frame.setBounds(100, 100, 450, 300);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().setLayout(null);
JScrollPane scrollPane = new JScrollPane();
scrollPane.setBounds(49, 27, 265, 160);
frame.getContentPane().add(scrollPane);
table = new JTable();
table.setCellSelectionEnabled(true);
table.setDefaultEditor(String.class, new TextEditor());
table.setModel(new DefaultTableModel(
new String[][] {
{"", ""},
{"", ""},
{"", ""},
{"", ""},
},
new String[] {
"New column", "New column"
}
));
scrollPane.setViewportView(table);
}
}
Erster Versuch CellEditor
Java:
package tableSelectionTest;
import java.awt.Component;
import javax.swing.AbstractCellEditor;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.table.TableCellEditor;
@SuppressWarnings("serial")
public class CustomTableCellEditor extends AbstractCellEditor implements
TableCellEditor {
private JTextField textField;
public CustomTableCellEditor(){
textField = new JTextField();
}
@Override
public Component getTableCellEditorComponent(JTable arg0, Object arg1,
boolean arg2, int arg3, int arg4) {
textField.setText("Hallo Welt");
textField.selectAll();
return textField;
}
@Override
public Object getCellEditorValue() {
return textField.getText();
}
}
Zweiter Versuch CellEditor Quelle
Java:
package tableSelectionTest;
import java.awt.Component;
import javax.swing.DefaultCellEditor;
import javax.swing.JTable;
import javax.swing.JTextField;
public class TextEditor extends DefaultCellEditor {
public TextEditor() {
super(new JTextField());
}
@Override
public Component getTableCellEditorComponent(JTable table, Object value,
boolean isSelected, int row, int column) {
Component c = super.getTableCellEditorComponent(table, value,
isSelected, row, column);
((JTextField) getComponent()).selectAll();
return c;
}
}