Arhn - архитектура программирования

Как использовать setValueAt, когда я меняю ячейку в столбце в JTable

У меня есть JTable со строками и столбцами, мне нужно, чтобы при редактировании любой ячейки в столбце с индексом 4 -> должно измениться ЗНАЧЕНИЕ в той же строке, но в следующем столбце с индексом 5. У меня есть следующий код, но он не работает

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();
                }
            }
         }
    });

У него ошибка:

в MainFrame$3.tableChanged(MainFrame.java:188) в javax.swing.table.AbstractTableModel.fireTableChanged(неизвестный источник) в javax.swing.table.AbstractTableModel.fireTableCellUpdated(неизвестный источник) в javax.swing.table.DefaultTableModel.setValueAt (Неизвестный источник) в javax.swing.JTable.setValueAt (Неизвестный источник)

Потому что у него бесконечный цикл. Помоги мне, пожалуйста.

Мой стол


  • Я не понимаю вашей проблемы. Можете ли вы отредактировать и быть более ясным? 01.08.2016
  • для лучшей помощи скорее опубликуйте MCVE / SSCCE, короткий, исполняемый, компилируемый, с жестко заданным значением для JTable / XxxTableModel в локальной переменной 01.08.2016

Ответы:


1

Для меня ваша ошибка связана с тем, что вы полагаетесь на выбранный столбец, вам следует полагаться на то, что предоставляется самим событием, например:

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);
            }
        }
    }
});
01.08.2016

2

Похоже, столбец 5 зависит от столбца 4. Вы можете переопределить setValueAt() и обновить следующий столбец в каждой строке следующим образом:

@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);
    }
}

Я не уверен, как вы вычисляете tracksToDownload, но вы можете прочитать значение других столбцов в той же строке, используя super.getValueAt().

01.08.2016

3

Вы должны изменить выбранный столбец и строку вместо table.setValueAt("VALUE", 0, 0);

        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();
                }
            }
         }
    });

Или вы можете попробовать, как показано ниже. В этом примере, если вы отредактируете столбец «D», тогда столбец «E» будет обновлен со значением «VALUE».

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);
  }

}
01.08.2016
Новые материалы

Коллекции публикаций по глубокому обучению
Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

Представляем: Pepita
Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

Советы по коду Laravel #2
1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

3 способа решить квадратное уравнение (3-й мой любимый) -
1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

Создание VR-миров с A-Frame
Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

Демистификация рекурсии
КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..