2016-09-03 6 views
0

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; 
      } 
     } 
    } 
} 
+0

にリンクされているモデルに行を追加するのに役立ちます実行可能な[MCVE】さらに、こと、短く、コード私たちのためにコンパイルして実行し、あなたの問題を実証しています。それはあなたの問題とコードを理解し、それによってあなたを助けるための問題を提起します。これらの獣の1つを作成し、あなたの質問(リンクではない)でコード形式のテキストとしてここに投稿するように努力してください。 –

+0

これは決して* never * code:catch(ArrayIndexOutOfBoundsException arrEx){} 'であることに注意してください。なぜあなたはそれを含める必要があると感じますか?また、ヘルプが必要な場合は、プログラムを改善してください。 –

答えて

1

はこれをしようと、それはあなたが投稿していませんでしたあなたのテーブル

model.addRow(new Object[]{objec1,object2}); //param to count of columns to table 
jTable1.setModel(modelo); 
/*You are not required if in the beginning did something like this 
modelo = (DefaultTableModel)jTable1.getModel();*/ 
+1

あなたの回答がOP(オリジナルのポスター)に役立ち、現在の投稿されたコードがどのように改善されるのかと少し考えてください。 –

+0

コードを正しく入力していれば有効だったので受け入れられました。 – user2465510

関連する問題