Проблемы с вашим текущим подходом
Поскольку вы слушаете itemStateChanged
Combobox, он будет вызываться для всех строк, даже если одна строка будет изменена, поскольку это ожидаемое поведение. [Попробуйте поместить оператор печати в этот прослушиватель, чтобы увидеть это]
Нет необходимости слушать изменение выпадающего списка, что вы хотите слушать в изменении столбца таблицы.
Поскольку вы увеличиваете на основе некоторого значения значений со списком. Я придумал следующее решение.
Существует mainTable
, в котором 2-й столбец [индекс 1] является раскрывающимся списком. Всякий раз, когда значение поля со списком изменяется для любой строки в mainTable
, старое значение уменьшается, а новое значение увеличивается в counterTable
.
Я переопределил DefaultTableModel, так что всякий раз, когда вызывается setValue, он будет проверять, является ли это нашим желаемым столбцом, и если да, то он будет уменьшать старое значение и увеличивать новое значение в таблице счетчиков.
Просто запустите приведенный ниже код SSCCE, выберите значения из второго столбца и посмотрите изменения.
Следующее делает то, что вы просили
import java.awt.BorderLayout;
import java.util.Objects;
import javax.swing.DefaultCellEditor;
import javax.swing.DefaultComboBoxModel;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;
public class TableDropDown extends JFrame {
private JComboBox jComboBox1;
private JTable mainTable = new JTable();
private JTable counterTable = new JTable();
public TableDropDown() {
initialize();
}
private void initialize() {
//Loading the mainTable with sample values
DefaultTableModel model = new DefaultTableModel(new Object[][]{
{"Test", null, null},
{"Type", null, null},
{"What", null, null},
{"Which", null, null}
},
new String[]{
"Title 1", "Title 2", "Title 3"
}) {
@Override
//Main part that does the trick
public void setValueAt(Object newValue, int row, int column) {
//check if this is our column
if (column == 1) {
Object oldvalue = getValueAt(row, column);
if (!Objects.equals(newValue, oldvalue)) {
if (oldvalue != null) {
decreaseCountFor(oldvalue.toString());
}
increaseCountFor(newValue.toString());
}
}
super.setValueAt(newValue, row, column);
}
};
mainTable.setModel(model);
//loading counterTable and combobox sample values A to J
String[] contents = new String[10];
DefaultTableModel cModel = new DefaultTableModel(null,
new String[]{"Type", "Count"});
for (int i = 0; i < 10; i++) {
contents[i] = "" + (char) (i + 65);
cModel.addRow(new Object[]{contents[i], 0});
}
counterTable.setModel(cModel);
counterTable.setEnabled(false);//to disable editing
jComboBox1 = new JComboBox(new DefaultComboBoxModel(contents));
//setting cellEditor for Column 1
mainTable.getColumnModel().getColumn(1).setCellEditor(new DefaultCellEditor(jComboBox1));
//stuffs to add value to frame
add(new javax.swing.JScrollPane(mainTable), BorderLayout.CENTER);
add(new javax.swing.JScrollPane(counterTable), BorderLayout.EAST);
pack();
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public int getRowForValue(String val) {
for (int i = 0; i < counterTable.getRowCount(); i++) {
if (counterTable.getValueAt(i, 0).equals(val)) {
return i;
}
}
return -1;
}
public int getPrevoiusValue(int row) {
return Integer.parseInt(counterTable.getValueAt(row, 1).toString());
}
public void increaseCountFor(String x) {
int row = getRowForValue(x);
counterTable.setValueAt(getPrevoiusValue(row) + 1, row, 1);
}
public void decreaseCountFor(String x) {
int row = getRowForValue(x);
counterTable.setValueAt(getPrevoiusValue(row) - 1, row, 1);
}
public static void main(String[] args) {
new TableDropDown().setVisible(true);
}
}
person
Madhan
schedule
20.07.2015
c
будет использоваться для всех строк в этом столбце. выполните проверку в элементе прослушивания. Можете ли вы опубликовать кодCItemListener
или MCVE - person Madhan   schedule 19.07.2015//do something
]?Проверить выбранную строку и внести изменения только в эту строку.например,dochangesinrow(table.getSelecterow())
- person Madhan   schedule 20.07.2015