2014-11-08 69 views
1

我試圖在沒有左鍵單擊單元格的情況下編輯JTable中的JTextField。似乎沒有左鍵單擊單元格,焦點不會獲得,並且JTextField中無法顯示光標。右鍵單擊單元格應該使JTextField可編輯,並且遊標應該可見並閃爍以準備輸入JTextField。使光標在JTable中的JTextField中不顯示左鍵點擊

我發現了許多有類似問題的人的例子,但他們只是不同而已,我無法將任何解決方案應用到我的代碼中(可能缺乏經驗和大腦能力?)。

下面的代碼是我目前無法訪問的真實代碼的髒副本。如果我的如何在JTable中顯示JTextField的實現不正確,請告訴我。

任何幫助或建議,將不勝感激。謝謝

import java.awt.Color; 
import java.awt.Component; 
import java.awt.Dimension; 
import java.awt.event.MouseEvent; 
import java.awt.event.MouseListener; 
import java.util.LinkedList; 
import java.util.List; 
import javax.swing.AbstractCellEditor; 
import javax.swing.JFrame; 
import javax.swing.JScrollPane; 
import javax.swing.JTable; 
import javax.swing.JTextField; 
import javax.swing.table.AbstractTableModel; 
import javax.swing.table.TableCellEditor; 
import javax.swing.table.TableCellRenderer; 


public class EditableJTextFieldInJTable implements MouseListener{ 

protected List<JTextField> textFields; 
protected JTable table; 

    public EditableJTextFieldInJTable(){ 

     textFields = new LinkedList<JTextField>(); 

     JTextField tf1 = new JTextField("number 1"); 
    tf1.setBackground(Color.yellow); 
    tf1.setEditable(false); 
    textFields.add(tf1); 

    JTextField tf2 = new JTextField("number 2"); 
    tf2.setEditable(false); 
    tf2.setBackground(Color.green); 
    textFields.add(tf2); 

    TableModel tableModel = new TableModel(); 
    table = new JTable(tableModel); 
    table.addMouseListener(this); 
    table.setDefaultRenderer(Object.class, new CellRenderer()); 
    table.setDefaultEditor(Object.class, new CellEditor());  
    table.setTableHeader(null); 

    JFrame frame = new JFrame("Table Cell Edit Test"); 
    frame.setPreferredSize(new Dimension(800, 480)); 
    frame.getContentPane().add(new JScrollPane(table)); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.pack(); 
    frame.setVisible(true); 

} 


private class TableModel extends AbstractTableModel{ 

    @Override 
    public int getColumnCount(){ 
     return 1; 
    } 

    @Override 
    public int getRowCount(){ 
     return textFields.size(); 
    } 

    @Override 
    public Object getValueAt(int row, int col){ 
     return textFields.get(row); 
    } 

    @Override 
    public boolean isCellEditable(int row, int col){ 
     return textFields.get(row).isEditable();   
    } 

} 


public class CellRenderer implements TableCellRenderer{ 

    public Component getTableCellRendererComponent(JTable table, Object value, 
     boolean isSelected, boolean hasFocus, int row, int col){ 
     return textFields.get(row); 
    } 

} 


public class CellEditor extends AbstractCellEditor implements TableCellEditor{ 

    public Component getTableCellEditorComponent(JTable table, Object value, 
      boolean isSelected, int row, int col){ 
     JTextField textField = textFields.get(row); 
     return textField; 
    } 

    @Override 
    public Object getCellEditorValue(){ 
     return null; 
    } 

} 


@Override 
public void mouseClicked(MouseEvent arg0){ 
    if(arg0.getSource().equals(table)){ 
     int row = table.rowAtPoint(table.getMousePosition()); 
     System.out.println("row: " + row + " clicked."); 
     JTextField textField = textFields.get(row); 
     if(arg0.getButton() == MouseEvent.BUTTON3 && textField != null){ 
      textField.setEditable(true); 
      System.out.println("row: " + row + " set editable. Caret should now be visible in cell."); 
     } 
    } 

} 


@Override 
public void mouseEntered(MouseEvent arg0) { 
    // Empty method. 
} 


@Override 
public void mouseExited(MouseEvent arg0) { 
    // Empty method. 
} 


@Override 
public void mousePressed(MouseEvent arg0) { 
    // Empty method. 
} 


@Override 
public void mouseReleased(MouseEvent arg0) { 
    // Empty method. 
    } 

    public static void main(String[] args){ 
     new EditableJTextFieldInJTable(); 
    } 

} 

回答

0

所以經過堅持,似乎我找到了答案。首先,我必須讓表格知道我想要編輯單元格,然後請求TextField的焦點。

@Override 
public void mouseClicked(MouseEvent arg0){ 
    if(arg0.getSource().equals(table)){ 
     int row = table.rowAtPoint(table.getMousePosition()); 
     System.out.println("row: " + row + " clicked."); 
     final JTextField textField = textFields.get(row); 
     if(arg0.getButton() == MouseEvent.BUTTON3 && textField != null){ 
      textField.setEditable(true); 
      table.editCellAt(row, 0); 
      textField.requestFocus(); // 'textField' is the object within the cell. 
      textField.setCaretPosition(textField.getText().length()); 
      System.out.println("row: " + row + " set editable. Caret should now be visible in cell."); 
     } 
    } 
}