Navigation in jTable nach fehlerhafter Eingabe verhindern

MarkusG

Mitglied
Hallo alle zusammen,

ich möchte in einer jTable erzwingen, dass ein User in eine Zelle nur Werte in einem bestimmten Format eingeben darf. Überprüfen möchte ich dies anhand von regulären Ausdrücken. Allerdings möchte ich danach ein Verhalten der jTable erzwingen wie es in der "Standard-jTable" der Fall ist, wenn man in eine numerische Zelle beispielweise alphanumerische Werte eingibt. Die Zelle wird dann rot umrandet und der User kann keine andere Zelle mehr editieren als die mit der fehlerhaften Eingabe, bis diese bereinigt wurde. Hat jemand eine Idee wie man sowas hinbekommt? Hat jemand sowas schon einmal gemacht?

Vielen Dank für eure Mühen,

mfg. Markus
 
Tach,
müsste ich noch mal genau nachschauen, aber das geht irgendwie mit stopCellediting() bzw. cancelCellEditing().
 
Hallo!

Meinst du sowas?
Code:
/**
 * 
 */
package de.tutorials;

import java.awt.Color;
import java.awt.Component;
import java.util.regex.Pattern;

import javax.swing.BorderFactory;
import javax.swing.DefaultCellEditor;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.border.Border;

/**
 * @author Administrator
 * 
 */
public class JTableExample extends JFrame {

	private boolean valid;

	private JTable table;

	private final Border RED_BORDER = BorderFactory.createLineBorder(Color.RED);

	private final Pattern PATTERN_FIGURES = Pattern.compile("\\d+");

	private final Pattern PATTERN_CHARACTERS = Pattern.compile("\\D+");

	private String[] headers = { "Figures", "Characters" };

	private Object[][] rowData = { { "12345", "ABCDE" }, { "67890", "FGHIJ" } };

	public JTableExample() {
		super("JTableExample");
		setDefaultCloseOperation(EXIT_ON_CLOSE);

		table = new JTable(rowData, headers) {

		};

		table.setDefaultEditor(Object.class, new DefaultCellEditor(
				new JTextField()) {

			private JTextField currentJtf;

			public boolean stopCellEditing() {
				String str = currentJtf.getText();
				int column = table.getSelectedColumn();

				boolean stop = true; // 

				switch (column) {
				case 0: {
					if (!PATTERN_FIGURES.matcher(str).matches()) {
						currentJtf.setBorder(RED_BORDER);
						stop = false;
					}
				}
					break;
				case 1: {
					if (!PATTERN_CHARACTERS.matcher(str).matches()) {
						currentJtf.setBorder(RED_BORDER);
						stop = false;
					}
				}
				}

				if (stop) {
					currentJtf.setBorder(null);
					this.fireEditingStopped();
				}

				currentJtf.updateUI();

				return stop;
			}

			public Component getTableCellEditorComponent(JTable table,
					Object value, boolean isSelected, int row, int column) {
				currentJtf = (JTextField) super.getTableCellEditorComponent(
						table, value, isSelected, row, column);
				return currentJtf;
			}

		});

		add(new JScrollPane(table));

		pack();
		setVisible(true);
	}

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		new JTableExample();
	}
}

Gruß Tom
 
Hallo,

genau diese Verhaltensweise benötige ich :eek:)

Wie kann ich nun erreichen, dass der User ausschließlich Zahlen UND "," (Kommas) eingeben darf?

Bei der Spalte in der ich diese Funktionalität benötige handelt es sich um eine Spalte die Attributlängen beinhaltet. Diese sind jeweils auf einen Datentyp bezogen...

Bsp:

Datentyp: Ganzzahl Attributlänge:10

Datentyp: DECIMAL Attributlänge: 5,3 (Fünf = Anzahl Gesamtstellen, 3 = Anzahl Nachkommastellen)

Datentyp: DATE Attributlänge: 2,2,4 (2 Zeichen für den Tag, 2 Zeichen für den Monat und 4 Zeichen für das Jahr)

ausschließlich solche Konstellationen darf der User eingeben. Sprich keine Buchstaben und Sonderzeichen. Ausschließlich Zahlen und Kommata.

Kann mir da jemand helfen, wie das in der Ausdrucksweise eines regulären Ausdruckes realisierbar wäre?

Danke,

Mfg. Markus
 
Bei regulären Ausdrücken bekomme ich Augenkrebs. Um ausschliesslich korrekte Eingaben zuzulassen, benutze ich immer meine eigene von PlainDocument abgeleitete Klasse mit der Implementierung von insertString() und weise dieses Document dem JTextField zu.
Beispiel dazu gibt es hier im Forum und auch in der API iirc.
 
Ich bedanke mich bei allen für ihre entgegengebracjten Mühen :)

Ich habe die Lösung zusammengebastelt

Ich ermittle die Platzhalteranzahl und verwende je nach dieser Anzahl einen bestimmten regulären Ausdruck.

Kommata sind wie folgt zwischen zwei Zahlen möglich:
"[1-9]?,[1-9]"
 
Zurück