JTextField tf = new JTextField();
tf.setDocument(new PlainDocument(){
public void insertString(int offs, String str, AttributeSet a){
int length = getLength() + str.length();
if(length > 3)
return;
super.insertString(offs, str, a);
}
});
DefaultCellEditor editor = new DefaultCellEditor(tf);
import javax.swing.text.PlainDocument;
import javax.swing.text.BadLocationException;
import javax.swing.text.AttributeSet;
/**
* Diese Klasse ist ein Dokument für Textfelder, welches...
*
* 1. Eingabe auf x Zeichen begrenzt.
*
* Die Zuweisung geschieht über
* JTextfield.setDocumenT(new CharDocument(int anzahl));
*/
public class CharDocument extends PlainDocument{
private static final long serialVersionUID = 5032290234368360350L;
private int limit;
/**
* Konstruktor
* @param int limit: maximale Anzahl der einzugebenen Zeichen
*/
public CharDocument(int newLimit){
super();
if (limit < 0){
limit = 0;
} else {
limit = newLimit;
}
}
/**
* Funktion überschreibt die Methode insertString von PlaintDocument
* @param int offset: Position
* @param String str: der String
* @param AttributeSet attr: Attributset
*/
public void insertString (int offset, String str, AttributeSet attr) throws BadLocationException {
if (str == null) return;
for (int i=0; i<str.length();i++) {
//System.out.println(str);
if ((getLength() + str.length()) > limit){
// wenn man hier rein kommt ist das übergebene limit erreicht
return;
}
//Wichtig Aufruf der übergeordneten Methode
super.insertString(offset, str, attr);
}
}
}
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.DefaultCellEditor;
import javax.swing.JButton;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.event.TableModelEvent;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.TableColumn;
import javax.swing.text.PlainDocument;
public class CreateTableWithColumn extends JPanel implements ActionListener{
private static final long serialVersionUID = -2306289506379055756L;
String[] column_names;
Object[][] data;
public CreateTableWithColumn(int width, int height, String[] _column_names, Object[][] _data, int[] _width_array, int[] _char_length) {
super(new BorderLayout());
column_names = _column_names;
data = _data;
JTable table = new JTable(new MyTableModel());
table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
// Panel erzeugen auf dem alles liegen soll
JPanel panel = new JPanel();
//ScrollPane erzeugen und JTable adden
JScrollPane scrollPane = new JScrollPane(table);
scrollPane.setPreferredSize(new Dimension(width,height));
//grösse der Zellen setzten
initColumnSizesWithCharLength(table, _width_array, _char_length);
//JPanel und JScrollPane hinzufügen.
add(panel);
panel.add(scrollPane);
JButton btn_add_line = new JButton(MyParam.getPicClose());
btn_add_line.setBounds(this.getWidth()-30,5,22,22);
btn_add_line.setBorderPainted(false);
btn_add_line.setToolTipText("Satz hinzufügen");
btn_add_line.setActionCommand("add_line");
btn_add_line.setOpaque(false);
btn_add_line.addActionListener(this);
add(btn_add_line, BorderLayout.SOUTH);
}
private void initColumnSizesWithCharLength(JTable table, int[] _width_array, int[] _char_length) {
TableColumn column = null;
for (int i = 0; i < _width_array.length; i++) {
JTextField tf = new JTextField();
tf.setDocument(new CharDocument(_char_length[i]));
column = table.getColumnModel().getColumn(i);
column.setCellEditor(new DefaultCellEditor(tf));
column.setPreferredWidth(_width_array[i]);
}
}
class MyTableModel extends AbstractTableModel {
private static final long serialVersionUID = -2764611210789334359L;
public int getColumnCount() {
return column_names.length;
}
public int getRowCount() {
return data.length;
}
public String getColumnName(int col) {
return column_names[col];
}
public Object getValueAt(int row, int col) {
System.out.println(data[row][col]);
return data[row][col];
}
public void setValueAt(Object val, int row, int col) {
System.out.println("value = " + val);
data[row][col] = val;
fireTableCellUpdated(row, col);
}
/*
* JTable benutzt diese Methode um den Default Renderer zu beenden
* sonst würde z.B. ststt CheckBoxen nur (true/false) drin stehen
*/
@SuppressWarnings("unchecked")
public Class getColumnClass(int c) {
return getValueAt(0, c).getClass();
}
/*
* Hier kann man bestimmte Zellen editierbar machen
* Beispiel Zelle 0 nicht editierbar machen
* if (col == 0) {
* return false;
* }
*/
public boolean isCellEditable(int row, int col) {
return true;
}
}
@Override
public void actionPerformed(ActionEvent ae) {
String cmd = ae.getActionCommand();
System.out.println(cmd);
if(cmd.equals("add_line")){
System.out.println("Button print_line betätigt");
}
}
}
// Tabelle erstellen und adden
CreateTableWithColumn table_panel = new CreateTableWithColumn(table_x, table_y, getColumnNames(), getData(), getWidthArray(), getCharLengthArray());
frame.add(table_panel, BorderLayout.CENTER);
.
.
.
private static int[] getCharLengthArray() {
int[] char_length = {4, 60};
return char_length;
}
private static int[] getWidthArray() {
int[] width_array = {100, 737};
return width_array;
}
private static String[] getColumnNames() {
String[] column_names = { "Schl.",
"Bezeichnung"};
return column_names;
}
private static Object[][] getData() {
Object[][] data = {
{"Spalte 1", "Spalte 2",},
{"Hallo ", "Dachs",}
};
return data;
}