Hallo,
Ich habe ein JTable wo der Benutzer normalerweise nur in eine Spalte editieren kann. Wenn die Eingabelänge=9, dann wird die Information bearbeitet und in die Zeile gespeichert und gleichzeitig eine neue Zeile erstellt, wo der Focus sich immer noch in der erste Spalte befindet. Wenn die Eingabe falsch ist, sollte eine Fehlermeldung für den Benutzer geben, Eingabe gelöscht und der Focus immer in derselbe Zelle bleiben. Bei mir aber springt der Focus in der nächste Zelle. Wieso??
[Java]
import java.awt.*;
import java.util.Vector;
import javax.swing.*;
import javax.swing.event.TableModelEvent;
import javax.swing.event.TableModelListener;
import javax.swing.table.DefaultTableModel;
public class Test implements TableModelListener{
DefaultTableModel model;
JTable table;
final int LIMIT=9;
public Test(){
createTable();
JPanel leftPanel = new JPanel(new BorderLayout(6, 6));
leftPanel.add(new JScrollPane(table), BorderLayout.CENTER);
JPanel centerPanel = new JPanel(new GridLayout(1, 2, 6, 6));
centerPanel.add(leftPanel);
JPanel contentPane = new JPanel(new BorderLayout(6, 6));
contentPane.add(centerPanel, BorderLayout.CENTER);
JFrame f = new JFrame("Test Frame");
f.setContentPane(contentPane);
f.pack();
f.setLocationRelativeTo(null);
f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
f.setVisible(true);
}
public static void main(String[] args) {
new Test();
}
private void createTable() {
table=new JTable();
model = new DefaultTableModel() {
@Override
public boolean isCellEditable(int row, int col) {
if(col==1 ){
return true;
}else{
return false;
}
}
};
model.addColumn("A");
model.addColumn("B");
model.addColumn("C");
model.addColumn("D");
model.addColumn("E");
model.addColumn("F");
model.addTableModelListener(this);
table.setModel(model);
table.setCellSelectionEnabled(true);
table.setColumnSelectionAllowed(true);
table.setRowSelectionAllowed(true);
addEmptyRow() ;
}
@Override
public void tableChanged(TableModelEvent e) {
if(e.getColumn()==1 && model.getRowCount()>0){
String line=(String)model.getValueAt(model.getRowCount()-1,1);
if(line.length()==LIMIT){
addDataToLastRow(line);
}
if(!line.isEmpty() && line.length()!=LIMIT){
JOptionPane.showMessageDialog(null, "Eingabe hat ein nicht erkennbaren Format,wird geloescht");
if (table.getCellEditor() != null) {
table.getCellEditor().cancelCellEditing();
}
loescheLastRow();
}
}
}
private void addDataToLastRow(String info) {
int lastRow =model.getRowCount()-1;
model.setValueAt(info, lastRow, 2);
model.setValueAt(info, lastRow, 3);
model.setValueAt(info, lastRow, 4);
model.setValueAt(info, lastRow, 5);
addEmptyRow();
}
private void loescheLastRow() {
model.removeRow(model.getRowCount() - 1);
addEmptyRow();
}
private void addEmptyRow() {
Vector temp=new Vector();
temp.add(model.getRowCount()+1);
temp.add("");
temp.add("");
temp.add("");
temp.add("");
temp.add("" );
model.addRow(temp);
focusEmptyRow();
}
void focusEmptyRow(){
int row = model.getRowCount()-1;
//System.out.println("row:"+row);
int col = 1;
// Set the cell in edit mode
boolean success = table.editCellAt(row, col);
//System.out.println("success:"+success);
if (success) {
// Select cell
boolean toggle = false;
boolean extend = false;
table.changeSelection(row, col, toggle, extend);
table.requestFocus();
}
}
}
[/Java]
Ich habe ein JTable wo der Benutzer normalerweise nur in eine Spalte editieren kann. Wenn die Eingabelänge=9, dann wird die Information bearbeitet und in die Zeile gespeichert und gleichzeitig eine neue Zeile erstellt, wo der Focus sich immer noch in der erste Spalte befindet. Wenn die Eingabe falsch ist, sollte eine Fehlermeldung für den Benutzer geben, Eingabe gelöscht und der Focus immer in derselbe Zelle bleiben. Bei mir aber springt der Focus in der nächste Zelle. Wieso??
[Java]
import java.awt.*;
import java.util.Vector;
import javax.swing.*;
import javax.swing.event.TableModelEvent;
import javax.swing.event.TableModelListener;
import javax.swing.table.DefaultTableModel;
public class Test implements TableModelListener{
DefaultTableModel model;
JTable table;
final int LIMIT=9;
public Test(){
createTable();
JPanel leftPanel = new JPanel(new BorderLayout(6, 6));
leftPanel.add(new JScrollPane(table), BorderLayout.CENTER);
JPanel centerPanel = new JPanel(new GridLayout(1, 2, 6, 6));
centerPanel.add(leftPanel);
JPanel contentPane = new JPanel(new BorderLayout(6, 6));
contentPane.add(centerPanel, BorderLayout.CENTER);
JFrame f = new JFrame("Test Frame");
f.setContentPane(contentPane);
f.pack();
f.setLocationRelativeTo(null);
f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
f.setVisible(true);
}
public static void main(String[] args) {
new Test();
}
private void createTable() {
table=new JTable();
model = new DefaultTableModel() {
@Override
public boolean isCellEditable(int row, int col) {
if(col==1 ){
return true;
}else{
return false;
}
}
};
model.addColumn("A");
model.addColumn("B");
model.addColumn("C");
model.addColumn("D");
model.addColumn("E");
model.addColumn("F");
model.addTableModelListener(this);
table.setModel(model);
table.setCellSelectionEnabled(true);
table.setColumnSelectionAllowed(true);
table.setRowSelectionAllowed(true);
addEmptyRow() ;
}
@Override
public void tableChanged(TableModelEvent e) {
if(e.getColumn()==1 && model.getRowCount()>0){
String line=(String)model.getValueAt(model.getRowCount()-1,1);
if(line.length()==LIMIT){
addDataToLastRow(line);
}
if(!line.isEmpty() && line.length()!=LIMIT){
JOptionPane.showMessageDialog(null, "Eingabe hat ein nicht erkennbaren Format,wird geloescht");
if (table.getCellEditor() != null) {
table.getCellEditor().cancelCellEditing();
}
loescheLastRow();
}
}
}
private void addDataToLastRow(String info) {
int lastRow =model.getRowCount()-1;
model.setValueAt(info, lastRow, 2);
model.setValueAt(info, lastRow, 3);
model.setValueAt(info, lastRow, 4);
model.setValueAt(info, lastRow, 5);
addEmptyRow();
}
private void loescheLastRow() {
model.removeRow(model.getRowCount() - 1);
addEmptyRow();
}
private void addEmptyRow() {
Vector temp=new Vector();
temp.add(model.getRowCount()+1);
temp.add("");
temp.add("");
temp.add("");
temp.add("");
temp.add("" );
model.addRow(temp);
focusEmptyRow();
}
void focusEmptyRow(){
int row = model.getRowCount()-1;
//System.out.println("row:"+row);
int col = 1;
// Set the cell in edit mode
boolean success = table.editCellAt(row, col);
//System.out.println("success:"+success);
if (success) {
// Select cell
boolean toggle = false;
boolean extend = false;
table.changeSelection(row, col, toggle, extend);
table.requestFocus();
}
}
}
[/Java]