2014-11-08 93 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."); 
     } 
    } 
} 
相关问题