2013-06-22 31 views
1

我想要完成的是以下內容: 如果用戶將行中的第5列聚焦在我的JTable中(通過單擊它或按Tab鍵直到他到達第5個單元格)顯示一個對話框。對話框的結果將被放入該單元格中。要訪問該單元格,我需要知道所關注的行和列。JTable,TableColumnModelListener檢測選中的行

我現在面臨的問題是,如果我點擊單元格,在聚焦表中的其他任何東西之前,getSelectedRow()返回-1,而getSelectedColumn()返回右列。

問題:如何確定表中第一次點擊所選行。或者,我唯一的選擇是採取一種大的解決方法來分別處理第一次點擊。

new TableColumnModelListener() { 
    . 
    . 
    . 
    @Override 
    public void columnSelectionChanged(ListSelectionEvent e) { 
     System.out.println(getSelectedColumn()); // this is correct 
     System.out.println(getSelectedRow()); // -1 on first click in JTable 
    }  
} 

回答

3

問題就出現了,因爲行和列的選擇是由兩個不相關的模型處理:改變選擇觸發在兩個(fi mousePressed)將通過首先改變一個,然後另一個(沒有序列保證)這樣做。因此,在收到變更通知時,您無法知道對方是否已經變更。

來解決,包裹通知您的自定義處理成的invokeLater:這是一定會發生的畢竟掛起事件被處理:

@Override 
public void columnSelectionChanged(ListSelectionEvent e) { 
    SwingUtilities.invokeLater(new Runnable() { 
     @Override 
     public void run() { 
      System.out.println(table.getSelectedColumn()); // this is correct 
      System.out.println(table.getSelectedRow()); // -1 on first click in JTable 
     } 
    }); 
} 
+0

非常感謝,作品像魅力:) –

0

試試這個:

table.addMouseListener(new MouseListener() 
    { 
     @Override 
     public void mousePressed(MouseEvent evt) 
     { 
      int row = table.getSelectedRow(); 
      int col = table.getSelectedColumn(); 
      System.out.println(row); 
      System.out.println(col); 
      if (col==4){ 
       JOptionPane.showInputDialog(null, "hi"); 
      } 
     } 

,將每一次給你選擇的行和列的用戶點擊。唯一的缺點是第一行會打印出0,因此您必須設置(col == 4)來觸發對話框。但這不是tablecolumnmodellistener。

或者,你可能想看看這個,因爲,有人似乎有一個類似的問題:JTable not returning selected row correctly

+0

一對夫婦的意見:1)這是很好的做法,有利於一個語義事件 - 就像一個低級事件 - 就像鼠標一樣。否則,你將不得不復制你的代碼來處理所有類型的低級事件,比如鍵盤,觸摸,控制思想等等。b)確實工作的原因是偶然的:它依賴於mouseEvents的調度順序(表的內部監聽器會在你的之前通知),這是未指定的和實現細節。實際上,它甚至不能保證在桌子的生命週期中是一樣的:改變LAF並看到它破壞:-) – kleopatra

+0

可能^^謝謝,我不知道InvokeLater的事情:-) – Karki64

+0

謝謝爲了您的答案Karki,但kleopatras解決方案對我來說最合適。歡呼聲 –