2017-11-30 25 views
1

私はアプリケーションパッケージを作成していますが、メインクラスはメインメソッドで、GUIクラスからは分離されています。 GUIクラスには、2つのタブを持つjtabbedpaneが含まれています。最初のタブにはjtableがあり、2番目のタブには3つのテーブルがあり、jtable2、jtable3、jtable4という名前が付けられています。メインクラスの新しいインスタンスでは、私は最初のJTableに、このGUIクラスのコンストラクタでのListSelectionListenerを追加しました:Jtable ListSelectionListenerはjtableアクションに応答せず、同じクラスの別のjtableアクションに応答します

jTable1.getSelectionModel().addListSelectionListener((ListSelectionEvent event) -> { 
     // do some actions here, for example 
     /* my code */ 
    }); 

と良い運命によって、それは、そのような選択に、非常によく を働いていると私はまた、非常によくも働いているGUIクラスのコンストラクタでJTabbedPaneのにChangeListenerを追加しました:

jTabbedPane1.addChangeListener((ChangeEvent e) -> { 
     /* my code */ 
    }); 

しかし、私が試したとき3つのテーブルを含み、ListSelectionListenerを追加する2番目のタブで、GUIクラスコンストラクタのListSelectionListenerをjtable2という最初のテーブルに追加することを開始し、ListSelectionListenerを追加するコード〜jtable2は、

jTable2.getSelectionModel().addListSelectionListener((ListSelectionEvent event) -> { 
     System.out.println("jTable2 Selected"); 
     /* mycode */ 
    }); 

疑問は間違いなく問題とはどのように解決するのですか?それは単純ではない場合、どのような確率やどのように私は多くを説明することができますか?

注のListSelectionListenerの追加は、他の第2のタブのテーブルに行われるであろう(jtable3、及びjtable4)、それが作成される他の計画されたタブに喜んで追加されたであろうと含むテーブル

見て、気をつけてくれてありがとう

+0

問題を示す適切な[mcve]を投稿してください。したがって、JTableとListSelectionListenerを持つフレームが必要です。 1つのテーブルで作業する場合に取得します。その後、知識を使って実際のプログラムを修正します。 – camickr

+0

実際には、私は最小限で完全で検証可能な例を書いて、直接答えを出すことができる前にそれを解決しようとします。jTabbedPane addChangeListenerで応答しない選択のjtableを再作成する際の問題は、 jtableのタブを再作成してjtableを更新し、最初のタブの他のテーブルの変更を更新します.jTabbedPane ChangeListenerでjtableの再作成をコメントすると非常にうまく動作します。 –

答えて

0

問題は、リスニングされていないアクションのjtableをjTabbedPaneの変更で再作成することでした。各タブの変更と同じように、jtableを再作成してjtableの新しい入力情報で更新していました。他のタブ:

jTabbedPane1.addChangeListener((ChangeEvent e) -> { 
    if(jTabbedPane1.getSelectedIndex() == 1) 
    { 
     jTable2 = new javax.swing.JTable(){ 
       DefaultTableCellRenderer renderRight = 
       new DefaultTableCellRenderer(); 

       { // initializer block 
        renderRight.setHorizontalAlignment(SwingConstants.RIGHT); 
       } 

       @Override 
       public TableCellRenderer getCellRenderer (int arg0, int arg1)          
       { 
        return renderRight; 
       } 
       public boolean isCellEditable(int row, int column) { 
        return false; 
       }; 


      }}); 

      jTable2.setAutoCreateRowSorter(true); 
      jTable2.setFont(new java.awt.Font("Traditional Arabic", 0, 23)); 
      jTable2.setRowHeight(25); 

      DefaultTableModel workersJtableForFamilyModel = 
      new DefaultTableModel(); 

      /* update model with columns and rows, and set it */ 
    } 

}); 

問題は、jtableを再作成して、メモリ内の観測されたjtableオブジェクトがポインティングとリッスンで見逃されるようにすることでした。したがって、解決策は、新しいjtableオブジェクトを作成せずにjtableのモデルを更新し、それはjtableに:

jTabbedPane1.addChangeListener((ChangeEvent e) -> { 
    if(jTabbedPane1.getSelectedIndex() == 1) 
    {  
      DefaultTableModel workersJtableForFamilyModel = 
      new DefaultTableModel(); 

      /* Feed the model with new columns and rows */ 
      /* write updated Model prepration statements */ 

      /* set the updated model to the jtable */ 
      jTable2.setModel(workersJtableForFamilyModel); 

    } 

}); 
関連する問題