EDIT: проблема решена. Я случайно положил return
внутри оператора if
вместо break
. Перед тем, как изменить значение DefaultTableModel
, функция вышла.Вставка строки в JTable
StockNameArr
представляет собой массив всех символов запаса в таблице (которые расположены по алфавиту), расположенных в алфавитном порядке.
Этот класс представляет собой JTable
с двумя столбцами, которые можно щелкнуть. Первый столбец печатает только stdout
, и это отлично работает. Вторая удаляет строку, в которой она находится, и упорядочивает имя каждого запаса в алфавитном порядке в JComboBox
. Насколько я знаю, это работает правильно.
Когда один из элементов в JComboBox
щелкают, он должен удалить элемент, создать String[8]
(сопоставляя другие столбцы 8 строк), вставьте имя запаса из пункта, который кликнул, и вставить массив как строка в том же месте, в котором она была ранее удалена.
Однако на самом деле этот элемент удален из JComboBox
, в то время как новая строка никогда не вставлена в таблицу. Я пробовал позвонить:
model.insertItemAt(...);
thisTable.setModel(model);
Но это ничего не делало. Думаю, что, возможно, model
или thisTable
были настроены правильно, я ссылался на thisTable
на это как переменную класса и попытался вставить строку в TableModel
, даже создав для нее новую переменную во внутреннем классе. Тем не менее, не повезло.
Может ли кто-нибудь мне помочь?
import java.awt.event.Action/Event;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.Collections;
import javax.swing.JComboBox;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;
public class JMainTable extends JTable {
JMainTable thisTable = this; //Represents this class in inner classes
final String[] stockNames;
DefaultTableModel model;
JComboBox<String> dropdown;
ArrayList<String> dropdownStocks = new ArrayList<String>();
int rowChangeOffset = 0;
public JMainTable(DefaultTableModel tableModel, String[] stockNameArr, JComboBox<String> combobox) {
super(tableModel);
// thisTable = this;
stockNames = stockNameArr;
addMouseListener(new mainTableListener());
model = tableModel;
dropdown = combobox;
dropdown.putClientProperty("JComboBox.isTableCellEditor", Boolean.TRUE);
//^ prevents ActionListener from firing when scrolling through list with arrow keys
dropdown.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
if (!e.getActionCommand().equals(ActionEvent.KEY_EVENT_MASK)){
System.out.println("Clicked");
JComboBox<String> source = (JComboBox<String>) e.getSource();
String stockString = (String) source.getSelectedItem();
int index = dropdownStocks.indexOf(stockString);
try {
source.removeItemAt(index);
dropdownStocks.remove(index);
} catch(ArrayIndexOutOfBoundsException arrEx) {}
int indexInStockNames = 0; //for compiler
for(int i = 0; i<stockNames.length; i++) {
if(stockNames[i].equals(stockString)) {
indexInStockNames = i;
return;
}//end of If
}//End of For
String[] replacementRow = new String[8];
replacementRow[0] = stockString;
//model.insertRow(indexInStockNames, replaceRow);
((DefaultTableModel) thisTable.getModel()).insertRow(indexInStockNames, replacementRow);
if(index>=0) {//Prevents offset from being changed
//when user clicks on empty JComboBox
rowChangeOffset--;
}
}
}
});
}
class mainTableListener extends MouseAdapter {
@Override
public void mousePressed(MouseEvent mouseevent) {
int column;
if((column = thisTable.getSelectedColumn()) == 6) {
int row = thisTable.getSelectedRow();
System.out.println("Button for " + stockNames[row + rowChangeOffset] + " working.");//TESTING
//NOIMPLEMEN
} else if((column = thisTable.getSelectedColumn()) == 7) {
int row = thisTable.getSelectedRow();
model.removeRow(row);
try{
dropdownStocks.add(stockNames[row + rowChangeOffset]);
} catch(Exception adsf) {adsf.printStackTrace(); System.out.println(stockNames[row+rowChangeOffset]);}
int index;
try {
Collections.sort(dropdownStocks);
index = dropdownStocks.indexOf(stockNames[row+rowChangeOffset]);
} catch(Exception ex) {/*dropdownStocks may be empty*/
index=0;
}
dropdown.insertItemAt(stockNames[row+rowChangeOffset], index);
rowChangeOffset = rowChangeOffset + 1;
}
}
}
}
Вы не отправил жизнеспособный [mcve] все же, код, который короток, что компилирует и работает для нас без изменений, и это демонстрирует вашу проблему, и это создает проблему для нашей способности понять вашу проблему и ваш код и тем самым помочь вам. Подумайте о том, чтобы приложить усилия к созданию одного из этих зверей, а затем опубликовать его здесь в виде текста с отформатированным кодом (не по ссылке). –
Обратите внимание, что это * никогда * код: 'catch (ArrayIndexOutOfBoundsException arrEx) {}', это код, который никогда не должен быть в вашей программе. Почему вы чувствуете необходимость включить его? Кроме того, и снова, пожалуйста, улучшите свою программу, если вам все еще нужна помощь. –