Hallo,
springe ich in einer editierbaren JTable mit der Tab-Taste ein Feld an kann ich in die Zelle direkt Text eingeben.
Ich möchte den Usern in manchen Zellen eine Auswahlhilfe bieten.
Dazu erstelle ich ein Panel auf dem ein TextField und ein Button (für die Auswahl eines Textes etc.) sitzen.
Dieses Panel weise ich der Table als CellEditor zu. Soweit so gut.
Springe ich mit der Tab-Taste in das Feld kann ich leider nicht direkt lostippen.
Ich muss erst mit der Maus ins Feld klicken um eine Eingabe zu machen.
Wie erreiche ich das gleiche Verhalten für eine Eingabe wie beim Standard CellEditor?
Für Anregungen bin ich dankbar
Uli
springe ich in einer editierbaren JTable mit der Tab-Taste ein Feld an kann ich in die Zelle direkt Text eingeben.
Ich möchte den Usern in manchen Zellen eine Auswahlhilfe bieten.
Dazu erstelle ich ein Panel auf dem ein TextField und ein Button (für die Auswahl eines Textes etc.) sitzen.
Dieses Panel weise ich der Table als CellEditor zu. Soweit so gut.
Springe ich mit der Tab-Taste in das Feld kann ich leider nicht direkt lostippen.
Ich muss erst mit der Maus ins Feld klicken um eine Eingabe zu machen.
Wie erreiche ich das gleiche Verhalten für eine Eingabe wie beim Standard CellEditor?
Für Anregungen bin ich dankbar
Uli
Java:
import java.awt.Component;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.AbstractCellEditor;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.TableCellEditor;
public class TableWithPanel
{
public TableWithPanel()
{
JFrame frame = new JFrame("TablePanelDemo");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//Tabelle mit eigenen CellEditor in der 3.Spalte
JTable table = new JTable(new TestTableModel());
table.setPreferredScrollableViewportSize(new Dimension(550, 120));
table.getColumnModel().getColumn(2).setCellEditor(new PanelCellEditor());
JScrollPane scrollPane = new JScrollPane(table);
Container container = frame.getContentPane();
container.setLayout(new GridLayout(1,0));
container.add(scrollPane);
frame.pack();
frame.setVisible(true);
}
class TestTableModel
extends AbstractTableModel
{
String[] columnNames = {"Textfeld 1", "Textfeld 2", "Panel/Textfeld"};
Object[][] data = {{"a1", "b1", "c1",},
{"a2", "b2", "c2",},
{"a3", "b3", "c3",}};
public int getColumnCount() {
return columnNames.length;
}
public int getRowCount() {
return data.length;
}
public String getColumnName(int col) {
return columnNames[col];
}
public Object getValueAt(int row, int col) {
return data[row][col];
}
public boolean isCellEditable(int row, int col) {
return true;
}
public void setValueAt(Object value, int row, int col) {
data[row][col] = value;
fireTableCellUpdated(row, col);
}
}
class PanelCellEditor
extends AbstractCellEditor
implements TableCellEditor, ActionListener
{
private JTextField textField;
private JButton button;
private JPanel panel;
public PanelCellEditor()
{
//Panel erzeugen der ein TextField und einen Button für eine Auswahl enthält
textField = new JTextField();
button = new JButton("...");
button.addActionListener(this);
panel = new JPanel();
panel.setLayout(new GridLayout(1,1));
panel.add(textField);
panel.add(button);
}
public Component getTableCellEditorComponent(JTable table,
Object value,
boolean isSelected,
int row,
int column)
{
textField.setText(value.toString());
return panel;
}
@Override
public Object getCellEditorValue(){
return textField.getText();
}
@Override
public void actionPerformed(ActionEvent arg0){
textField.setText("Auswahl");
}
}
public static void main(String[] args)
{
new TableWithPanel();
}
}