2016-07-15 81 views
0

簡短版本:給定一個帶有擴展DefaultTableModel的TableModel的JTable,我可以在不使用CellEditor的情況下使用類String選擇單元格中的所有文本嗎?有沒有辦法在沒有CellEditor的情況下選擇JTable中的單元格中的所有文本?

長版本:我做了一個TableModel,它擴展了DefaultTableModel,並且應該只有可選擇的行是可編輯的。以下是有關部分:

class MyTableModel extends DefaultTableModel { 

    private List<String> columnNames; 
    private List<List<String>> strings; 

    /** editable stores the columns which we're allowed to change */ 
    private List<Integer> editable; 

    public MyTableModel (List<String> columnNames, List<List<String>> 
      strings, List<Integer> editable) { 
     this.columnNames = columnNames; 
     this.strings = strings; 
     this.editable = editable; 
    } 

    public Object getValueAt(int row, int col) { 
     return strings.get(col).get(row); 
     return null; 
    } 

    public void setValueAt(Object value, int row, int col) { 
     strings.get(col).set(row, (String) value); 
     fireTableCellUpdated(row, col); 
    } 

    public boolean isCellEditable(int row, int col) { 
     return canEdit(col); 
    } 

    /** 
    * This method looks like it should be lumped into isCellEditable() 
    * But there's unique behavior I plan on having later for the first 
    * column and this will let my code down the road be much cleaner. 
    **/ 
    public boolean canEdit(int col) { 
     return col != 0 && editable.indexOf(col) != -1; 
    } 
} 

據瞭解,在治療的DefaultTableModel填充字符串作爲JTextField的細胞。我們使用這個表格是爲了填充兩列。一個帶有文件名(作爲字符串)的不可編輯的列,隨後是一個可編輯的字符串空列。當選擇一個可編輯的單元格時,我希望它將文本設置爲文件名之前的文本文本,然後選擇所有文本(稍後,用戶將爲每個文件執行一個具有可選String字段的命令,因此如果文件名關聯的可編輯單元格不是空的,它使用該值。我們不希望用戶每次設置時都不得不重新鍵入整個文件名,但也希望讓他們能夠在需要時快速完成此操作)。

表中有一個MouseListener,用於查看是否單擊了可編輯的單元格,如果是,則它也填充單元格中的文件名稱。

table.addMouseListener(new MouseAdapter() { 
    public void mouseReleased(MouseEvent e) {  
     JTable table = ((JTable) e.getSource()); 
     MyTableModel model = (MyTableModel)table.getModel(); 
     int row = table.rowAtPoint(e.getPoint()); 
     int col = table.columnAtPoint(e.getPoint()); 

     if(tableModel.canEdit(col)) 
      tableModel.setValueAt(
       tableModel.getValueAt(row, col - 1), row, col); 
    } 
}); 

這工作正常,但我不能得到要選擇的文本。我似乎無法找到返回單元組件的方法,並且我添加了一個我在網上找到的CellEditor,但它不會改變任何內容。

class MyCellEditor extends DefaultCellEditor { 

    public MyCellEditor(JTextField textField) { 
     super(textField); 

     textField.addFocusListener(new FocusAdapter() { 
      public void focusGained(FocusEvent e) { 
       textField.selectAll(); 
      } 
     }); 
    } 
} 

添加到表與此:

for(int i = 0; i < table.getRowCount(); i++) 
    table.setCellEditor(new MyCellEditor(new 
       JTextField((String)table.getValueAt(i, 2)))); 

事情就好辦多了,如果有到完全忽略CellEditor的一種方式,但如果有件事情我已經喜歡弄亂順序完成這些聽衆處理事件,我不介意包括它。我想要避免的是需要編寫一些巨大的CellEditor或大規模地檢修任何代碼,以增加一點便利。

+1

*「這是有關部分:」 *爲了更好地幫助更快,發佈[MCVE]或[簡短,獨立,正確的例子](http://www.sscce.org/)。 –

+0

*「X很好,但..」*(嘆氣)希望我有一美元,每次我讀到這樣的話.. –

+0

「越多的代碼要經歷,越不可能找到你的人通過以下兩種方式之一簡化您的示例: 從頭開始重新創建一個新程序,僅添加需要查看問題的程序。對於那些認爲您已經知道問題源的大型系統,這可能會更快如果你不能公開發布原來的代碼是爲了法律或者道德方面的原因,也是有用的 分而治之當你有少量的代碼但是問題的根源完全不清時,直到問題消失的時間 - 然後......「 –

回答

3

嘗試在SwingUtilities.invokeLater(...)中包裝selectAll()聲明。

參見:how do I simulate "onStartCellEditing" for DefaultCellEditor

中的任意單元格中選擇文本的一個普通的例子,當單元格編輯啓動:

+0

非常感謝!我只是在「= new JTable(){」之後複製並粘貼覆蓋函數,它就像一個魅力!還有一個問題。選擇該框可讓我直接進行編輯,並選中所有文本,但實際上並未突出顯示。我仍然必須雙擊進入並設置我的光標。我試着在selectAll()之前或之後添加grabFocus(),但都沒有成功。這是一個很小的問題,但我們的用戶並不是非常聰明的電腦,所以我認爲高亮文本會對他們有很大的幫助。 –

+0

劃痕。我從grabFocus()切換到requestFocusInWindow(),然後在表格的mouseReleased()函數的末尾添加了一個顯式的調用editCell(row,col),它完美的工作!再次感謝所有的幫助! –

相關問題