Hallo Miteinander!
Ich habe ein Problem mit einer JTable.
Und zwar möchte ich, dass der User Werte eingibt, und diese dann intern weiterverarbeiten. Die Tabelle muss dazu zweimal mit Werten gefüllt werden. Klickt man auf den "finish"-Button, so beginnt der nächste Füll-Vorgang. Das funktioniert soweit auch, bis auf den Fehler, dass man jedesmal, bevor man den "finish"-Button drückt, mit der Maus noch in eine andere Zelle der Tabelle als in die zuletzt-wert-eingegebene klicken muss, da es sonst, wenn man den Wert aus dieser Zelle auszulesen versucht eine NumberFormatException gibt. Ich verwende in meiner Tabelle ein eigenes TableModel und einen eigenen TableCellRenderer (weiss nicht, ob das für diese Frage von Belang ist).
Ich habe schon versucht, statt dem Mausklick auf eine andere Zelle, vom Programm aus eine andere Zelle zu selektionieren. und zwar so:
tabelle.setSelectionMode( ListSelectionModel.SINGLE_SELECTION );
tabelle.setColumnSelectionAllowed( true );
tabelle.setRowSelectionAllowed( true );
tabelle.changeSelection( count+2, count+2, false, false );
Das geht zwar, aber die Exception bekomme ich dann trotzdem.
Der andere Veruch war, die Zelle upzudaten. Mit:
tabelle.tableChanged( new TableModelEvent( tabelle.getModel(), tabelle.getSelectedRow(), tabelle.getSelectedRow(),
tabelle.getSelectedColumn(), TableModelEvent.UPDATE));
Aber die Exception will nicht weg! ???:L
Könnt ihr mir helfen?
Hier ist noch der Code meiner Tabellen-Klasse:
Ich habe ein Problem mit einer JTable.
Und zwar möchte ich, dass der User Werte eingibt, und diese dann intern weiterverarbeiten. Die Tabelle muss dazu zweimal mit Werten gefüllt werden. Klickt man auf den "finish"-Button, so beginnt der nächste Füll-Vorgang. Das funktioniert soweit auch, bis auf den Fehler, dass man jedesmal, bevor man den "finish"-Button drückt, mit der Maus noch in eine andere Zelle der Tabelle als in die zuletzt-wert-eingegebene klicken muss, da es sonst, wenn man den Wert aus dieser Zelle auszulesen versucht eine NumberFormatException gibt. Ich verwende in meiner Tabelle ein eigenes TableModel und einen eigenen TableCellRenderer (weiss nicht, ob das für diese Frage von Belang ist).
Ich habe schon versucht, statt dem Mausklick auf eine andere Zelle, vom Programm aus eine andere Zelle zu selektionieren. und zwar so:
tabelle.setSelectionMode( ListSelectionModel.SINGLE_SELECTION );
tabelle.setColumnSelectionAllowed( true );
tabelle.setRowSelectionAllowed( true );
tabelle.changeSelection( count+2, count+2, false, false );
Das geht zwar, aber die Exception bekomme ich dann trotzdem.
Der andere Veruch war, die Zelle upzudaten. Mit:
tabelle.tableChanged( new TableModelEvent( tabelle.getModel(), tabelle.getSelectedRow(), tabelle.getSelectedRow(),
tabelle.getSelectedColumn(), TableModelEvent.UPDATE));
Aber die Exception will nicht weg! ???:L
Könnt ihr mir helfen?
Hier ist noch der Code meiner Tabellen-Klasse:
Code:
public class tabletest extends JFrame {
JTextField input;
JTable tabelle;
int count;
int verteilt = 0;
int bekommen = 0;
int whichTab = 0; //Sympathien => whichTab = 0, Einfluss => whichTab = 1
String[] names = null;
int[][] sympathien = null;
int[][] einfluss = null;
tabletest tabl = null;
public tabletest(MyTableModel tableModel) {
super("tabletest");
tabl = this;
setSize(1000, 600);
this.getContentPane().setLayout(new GridLayout(2, 2, 0, 0));
tabelle = new JTable(tableModel);
int cols = tabelle.getColumnModel().getColumnCount();
for(int i=0; i<cols; i++){
tabelle.getColumnModel().getColumn(i).setMinWidth(60);
}
tabelle.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
tabelle.setTableHeader(null);
tabelle.setDefaultRenderer(Object.class, new MyCellRenderer());
JScrollPane scrollPane = new JScrollPane ( tabelle );
JLabel labeladdname = new JLabel("Name hinzufuegen");
input = new JTextField(50);
input.setText("namen hinzufuegen und sympathie-bewertungen eingeben");
JButton addname = new JButton("Add");
JButton finish = new JButton ("finish");
JButton remove = new JButton("remove");
Container c = this.getContentPane();
GridBagLayout gbl = new GridBagLayout();
c.setLayout( gbl );
// x y w h wx wy
addComponent( c, gbl, scrollPane, 0, 0, 5, 2, 1.0, 1.0 );
addComponent( c, gbl, labeladdname, 0, 2, 1, 1, 1.0, 0.0 );
addComponent( c, gbl, input, 0, 3, 1, 1, 1.0, 0.0 );
addComponent( c, gbl, addname, 1, 3, 1, 1, 1.0, 0.0 );
addComponent( c, gbl, remove, 2, 3, 1, 1, 1.0, 0.0 );
addComponent( c, gbl, finish, 4, 3, 1, 1, 1.0, 0.0 );
this.setVisible(true);
count = 1;
input.addKeyListener(new KeyAdapter() {
public void keyPressed (KeyEvent e){
char c = e.getKeyChar();
if (c == KeyEvent.VK_ENTER) {
if (count <= 0) count = 1;
tabelle.setValueAt(input.getText(),0,count);
tabelle.setValueAt(input.getText(),count,0);
tabelle.setValueAt("0",count,count);
input.setText("");
++count;
}
}
public void keyReleased (KeyEvent e) {}
public void keyTyped(KeyEvent e)
{
}
});
input.addMouseListener(new MouseListener(){
public void mouseClicked(MouseEvent e){
input.setText("");
}
public void mouseEntered(MouseEvent e){}
public void mouseExited(MouseEvent e){}
public void mousePressed(MouseEvent e){}
public void mouseReleased(MouseEvent e){}
});
addname.addActionListener( new ActionListener()
{
public void actionPerformed( ActionEvent e )
{
if (count <= 0) count = 1;
tabelle.setValueAt(input.getText(),0,count);
tabelle.setValueAt(input.getText(),count,0);
tabelle.setValueAt("0",count,count);
input.setText("");
++count;
}
});
remove.addActionListener( new ActionListener()
{
public void actionPerformed( ActionEvent e )
{
--count;
if (count <= 0) count = 1;
tabelle.setValueAt("",0,count);
tabelle.setValueAt("",count,0);
tabelle.setValueAt("",count,count);
}
});
finish.addActionListener( new ActionListener()
{
public void actionPerformed( ActionEvent e ){
// //schon probiertes, die NFE wegzubekommen, nicht funktionierendes:
// tabelle.tableChanged(new TableModelEvent(tabelle.getModel(),
// tabelle.getSelectedRow(), tabelle.getSelectedRow(), tabelle.getSelectedColumn(), TableModelEvent.UPDATE));
//
// tabelle.setSelectionMode( ListSelectionModel.SINGLE_SELECTION );
// tabelle.setColumnSelectionAllowed( true );
// tabelle.setRowSelectionAllowed( true );
// tabelle.changeSelection( count+2, count+2, false, false );
boolean weitermachen = true;
String[] names = new String[count-1];
int[][] values = new int[count-1][count-1];
//namen einlesen
for (int i = 1; i<count;++i) {
names[i-1] = (String)tabelle.getValueAt(0,i);
}
//bewertungen einlesen
for (int i = 1; i < count; ++i) {
for (int j = 1; j < count; ++j) {
try{
values[i-1][j-1] = Integer.parseInt(tabelle.getValueAt(i,j).toString());
input.setText("tut des jetztet???");
}catch(NumberFormatException nfe){
System.out.println(nfe.toString());
weitermachen = false;
}
}
}
if(weitermachen){
for (int i = 1; i < count; ++i) {
for (int j = 1; j < count; ++j) {
tabelle.setValueAt("", i, j);
}
}
if(whichTab == 0){
for(int i = 1; i<count; i++){
tabelle.setValueAt(new Integer(0), i, i);
}
input.setText("Einfluss-Bewertungen eingeben.");
whichTab = 1;
}else{
tabl.setVisible(false);
}
}
}
});
}
public static void main(String argv[]) {
MyTableModel m = new MyTableModel();
tabletest frame = new tabletest(m,);
}
static void addComponent( Container cont,
GridBagLayout gbl,
Component c,
int x, int y,
int width, int height,
double weightx, double weighty )
{
GridBagConstraints gbc = new GridBagConstraints();
gbc.fill = GridBagConstraints.BOTH;
gbc.gridx = x; gbc.gridy = y;
gbc.gridwidth = width; gbc.gridheight = height;
gbc.weightx = weightx; gbc.weighty = weighty;
gbl.setConstraints( c, gbc );
cont.add( c );
}
}
class MyTableModel extends AbstractTableModel{
private Object[][] objects;
public MyTableModel(){
super();
objects = new Object[50][50];
for(int i = 0; i<objects.length; i++){
for(int j = 0; j<objects.length; j++){
objects[i][j] = "";
}}}
public int getRowCount(){
return objects.length;
}
public int getColumnCount(){
return objects[0].length;
}
public Object getValueAt(int row, int column){
return objects[row][column];
}
public void setValueAt(Object o, int row, int col){
objects[row][col] = o;
fireTableCellUpdated(row, col);
}
public boolean isCellEditable(int row, int col){
return true;
}
}
class MyCellRenderer extends DefaultTableCellRenderer{
int counter = 0;
public MyCellRenderer(){
super();
setOpaque(true);
}
}