Focus in JTable Cell

amandina

Mitglied
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]
 
hi,

versuch mal den focus, in
Java:
 JOptionPane.showMessageDialog(null, "Eingabe hat ein nicht erkennbaren Format,wird geloescht");
einzubringen.

Schreib eine eigene Methode dafür, z.B
Java:
public void getInformationMessage(String information)
{
JOptionPane.showMessageDialog(null, information);
table.requestFocus();
}

gruß nickname
 
Hi,

Das Problem ist, dass die Tabelleden Focus hat, aber nicht in der gewünschten Zelle. Anyway, vielen Dank für deine Antwort, auch wenn keine Lösung ist.
 
Ich habe die Lösung gefunden, nach JTable Initialisierung muss man

[Java]
table.setSurrendersFocusOnKeystroke(true);
[/Java]

und auch

[Java]
@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();
table.setColumnSelectionInterval(1, 1);
table.setRowSelectionInterval(e.getFirstRow(),e.getFirstRow() );

}

}

}

[/Java]
 

Neue Themen


Zurück
Oben