简体   繁体   English

使光标在JTable中的JTextField中可见,而无需单击鼠标左键

[英]Make Cursor Visible in JTextField within JTable without Left-click

I'm trying to edit a JTextField within a JTable without left-clicking the cell. 我试图在JTable中编辑JTextField,而不用鼠标左键单击单元格。 It seems that without left-clicking the cell, focus is not gained and cursor cannot be seen in the JTextField. 似乎,如果没有用鼠标左键单击该单元格,就无法获得焦点,并且在JTextField中也看不到光标。 Right-clicking the cell should make the JTextField editable and the cursor should be visible and blinking ready to type in the JTextField. 右键单击该单元格应使JTextField可编辑,并且光标应可见并且闪烁,可以在JTextField中键入。

I found many examples of people with similar problems, but they were just different enough that I couldn't apply any of the solutions to my code (lack of experience and brain power perhaps?). 我发现了很多有类似问题的人的例子,但是它们之间的差别足够大,以至于我无法将任何解决方案应用于我的代码(也许缺乏经验和脑力?)。

The below code is a dirty replica of the real code which I do not have access to at the moment. 下面的代码是我目前无法访问的真实代码的肮脏副本。 If my implementation of how to display a JTextField within a JTable is incorrect, please let me know. 如果我关于如何在JTable中显示JTextField的实现不正确,请告诉我。

Any help or advise would be appreciated. 任何帮助或建议,将不胜感激。 Thanks 谢谢

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();
    }

}

So after persisting, it seems I have found an answer. 因此,坚持不懈之后,似乎已经找到了答案。 First I have to let the table know that I want to edit the cell, and then request focus for the TextField. 首先,我必须让表知道我要编辑单元格,然后为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.");
        }
    }   
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM