2016-08-01 40 views
1

ändere Ich habe JTable mit Zeilen und Spalten, Ich brauche, wenn ich eine Zelle in der Spalte mit Index 4 bearbeitet -> sollte "VALUE" in der gleichen Zeile ändern, aber nächste Spalte mit dem Index 5. ich habe nächste Code, aber es funktioniert nichtWie benutze ich SetValueAt, wenn ich Zelle in Spalte in JTable

table.getModel().addTableModelListener(new TableModelListener() { 
     public void tableChanged(TableModelEvent e) { 
      if (table.getSelectedRow()>=0) { 
       try { 
        if (table.getSelectedColumn()==4){ 

         table.setValueAt("VALUE", 0, 0); 
        } 
       } catch (ArrayIndexOutOfBoundsException ee){ 
        ee.printStackTrace(); 
       } 
      } 
     } 
    }); 

es hat einen Fehler:

at MainFrame$3.tableChanged(MainFrame.java:188) at javax.swing.table.AbstractTableModel.fireTableChanged(Unknown Source) at javax.swing.table.AbstractTableModel.fireTableCellUpdated(Unknown Source) at javax.swing.table.DefaultTableModel.setValueAt(Unknown Source) at javax.swing.JTable.setValueAt(Unknown Source)

Weil es unendlich Zyklus hat. Hilf mir bitte.

My Table

+0

Ich verstehe dich Problem nicht. Können Sie bearbeiten und klarer sein? – davidxxx

+0

für bessere Hilfe früher ein MCVE/SSCCE, kurz, runnable, kompilierbar, mit hartcodierten Wert für JTable/XxxTableModel in der lokalen Variablen – mKorbel

Antwort

1

Für mich dein Fehler der Tatsache zusammenhängt, dass Sie auf der ausgewählten Spalte verlassen, sollten Sie lieber auf das verlassen, was durch das Ereignis selbst, wie dies vorgesehen ist:

table.getModel().addTableModelListener(new TableModelListener() { 
    public void tableChanged(TableModelEvent e) { 
     if (e.getType() == TableModelEvent.UPDATE) { 
      final int row = e.getFirstRow(); 
      final int column = e.getColumn(); 
      if (column == 4) { 
       table.setValueAt("VALUE", row, column + 1); 
      } 
     } 
    } 
}); 
1

Sie sollten die ausgewählten Spalt ändern und statt table.setValueAt("VALUE", 0, 0) Reihe;

 table.getModel().addTableModelListener(new TableModelListener() { 
     public void tableChanged(TableModelEvent e) { 
      if (table.getSelectedRow()>=0) { 
       try { 
        if (table.getSelectedColumn()==4){ 

         table.setValueAt("VALUE", table.getSelectedRow(), 5); 
        } 
       } catch (ArrayIndexOutOfBoundsException ee){ 
        ee.printStackTrace(); 
       } 
      } 
     } 
    }); 

Oder Sie könnten versuchen, wie unten. Wenn Sie in diesem Beispiel die Spalte "D" bearbeiten, wird die Spalte "E" mit "VALUE" aktualisiert.

import javax.swing.JFrame; 
import javax.swing.JScrollPane; 
import javax.swing.JTable; 
import javax.swing.ListSelectionModel; 
import javax.swing.event.ListSelectionEvent; 
import javax.swing.event.ListSelectionListener; 

public class JTableListSelectionListener { 

    public static void main(String[] a) { 
    JFrame frame = new JFrame(); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

    final JTable table; 

    String[] columnTitles = { "A", "B", "C", "D", "E" }; 
    Object[][] rowData = { { "11", "12", "13", "14", "" }, { "21", "22", "23", "24", "" }, 
     { "31", "32", "33", "34", "" }, { "41", "42", "44", "44", "" } }; 

    table = new JTable(rowData, columnTitles); 

    table.setCellSelectionEnabled(true); 
    ListSelectionModel cellSelectionModel = table.getSelectionModel(); 
    cellSelectionModel.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); 

    cellSelectionModel.addListSelectionListener(new ListSelectionListener() { 
     public void valueChanged(ListSelectionEvent e) { 

     if(e.getValueIsAdjusting()) { 
      return; 
     } 

     String selectedData = null; 

     int[] selectedRows = table.getSelectedRows(); 
     int[] selectedColumns = table.getSelectedColumns(); 


     int selectedCol = -1; 
     int selectedRow = -1; 
     for (int i = 0; i < selectedRows.length; i++) { 
      for (int j = 0; j < selectedColumns.length; j++) { 
      selectedData = (String) table.getValueAt(selectedRows[i], selectedColumns[j]); 
      selectedCol = selectedColumns[j]; 
      selectedRow = selectedRows[i]; 
      } 
     } 

     if(selectedCol == 3) { 
      table.setValueAt("VALUE", selectedRow, selectedCol+1); 
     } 

     System.out.println("Selected: " + selectedData); 
     } 

    }); 

    frame.add(new JScrollPane(table)); 

    frame.setSize(300, 200); 
    frame.setVisible(true); 
    } 

} 
1

Es ist wie Spalte sieht 5 ist abhängig von Spalte 4. Sie können setValueAt() außer Kraft setzen und die nächste Spalte in jeder Zeile wie folgt aktualisiert:

@Override 
public void setValueAt(Object object, int row, int col) { 
    super.setValueAt(object, row, col); 
    int releases = ((Integer) object).intValue(); 
    int tracksToDownload = releases * …; 
    if (col == 4) { 
     super.setValueAt(tracksToDownload, row, col + 1); 
    } 
} 

ich bin nicht sicher, wie Sie berechnen tracksToDownload, aber Sie kann den Wert anderer Spalten in derselben Zeile mit super.getValueAt() lesen.