EDIT:問題が解決しました。私は誤ってbreak
の代わりにif
の文の中にreturn
を入れました。関数はDefaultTableModel
を変更する前に終了していました。JTableに行を挿入する
StockNameArr
は、アルファベット順に配列された表内の全株式記号の配列です(アルファベット順に並べられています)。
このクラスは、2つのクリック可能な列を持つJTable
を表します。最初の列は現在stdout
にしか印刷されず、うまくいきます。 2番目の行は、その行が削除され、アルファベット順に各株の名前がJComboBox
に配置されます。これは私が知る限り正しく動作します。 JComboBox
内のアイテムのいずれかがクリックされると
、それは、アイテムを削除する必要があり(8行の他の列と一致する)String[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】さらに、こと、短く、コード私たちのためにコンパイルして実行し、あなたの問題を実証しています。それはあなたの問題とコードを理解し、それによってあなたを助けるための問題を提起します。これらの獣の1つを作成し、あなたの質問(リンクではない)でコード形式のテキストとしてここに投稿するように努力してください。 –
これは決して* never * code:catch(ArrayIndexOutOfBoundsException arrEx){} 'であることに注意してください。なぜあなたはそれを含める必要があると感じますか?また、ヘルプが必要な場合は、プログラムを改善してください。 –