JTable编辑模式

时间:2017-04-06 15:30:52

标签: java swing jtable

我实现了一种方法,因此用户输入设置为十进制格式。但它有两种编辑JTable单元格的形式(?)。

在其中一个(第一张图片)中,当用户只是选择一个单元格并开始编写我的单元格编辑器时,无法正常工作。

但另一方面,当它双击单元格时编辑器可以工作。

只有在用户双击时才允许编辑?

PS。:isCellEditable和setClickCountToStart没有用。

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import javax.swing.DefaultCellEditor;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.border.EmptyBorder;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableColumn;

public class example extends JFrame {

    private JPanel contentPane;

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    example frame = new example();
                    frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    public example() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(100, 100, 450, 300);
        contentPane = new JPanel();
        contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
        contentPane.setLayout(new BorderLayout(0, 0));
        setContentPane(contentPane);

        JTable table = new JTable(new DefaultTableModel(new Object[]{"RB"}, 10));

        table.setPreferredScrollableViewportSize(new Dimension(700, 350));
        TableColumn RBColumn = table.getColumnModel().getColumn(0);
        RBColumn.setCellEditor(new DefaultCellEditor(tfMon())); 

        JScrollPane scrollPane = new JScrollPane(table);

        contentPane.add(scrollPane, BorderLayout.CENTER);
    }


    private JTextField tfMon(){
        JTextField tf = new JTextField();
        tf.addKeyListener(new KeyAdapter() {
            public void keyTyped(KeyEvent e) {
                char c = e.getKeyChar();
                if (!((c >= '0') && (c <= '9') || (c ==         KeyEvent.VK_BACK_SPACE) || (c == KeyEvent.VK_DELETE))){
                    e.consume();
                }else{
                    String txt = tf.getText();
                    txt = txt.replace(".","").replace("0","");
                    if(!((c == KeyEvent.VK_BACK_SPACE) || (c == KeyEvent.VK_DELETE))){
                        e.consume();
                        txt=txt+c;
                    }
                    while(txt.length()<3){
                        txt="0"+txt;
                    }
                    txt = txt.substring(0,txt.length()-2)+"."+txt.substring(txt.length()-2,txt.length());
                    tf.setText(txt);
                }
            }
        });
           return tf;
    }
}

Case 1 happens when user types in this condition enter image description here

2 个答案:

答案 0 :(得分:1)

  

只有在用户双击时才允许编辑?

问题在于你的编辑。解决方案应该是修复编辑器,而不是阻止用户直接在文本字段中输入。

我不确定你的编辑器在做什么,但看起来你试图只在编辑器中输入数字。

如果是这种情况,那么你应该:

  1. 覆盖getColumnClass(...)的{​​{1}}方法,以返回TableModelInteger。然后该表将使用适当的编辑器,该编辑器仅允许输入数字数据。因此,您不需要编写自定义编辑器。

  2. 如果您想要自定义编辑,那么您可以使用Double而不是使用JTextField来指定掩码以仅允许数值

  3. 最后最复杂的是在文本字段的JFormattedTextField上使用DocumentListener(而不是KeyListener)。每当文档发生变化时,都会生成Document

  4. 编辑:

    您可以使用以下方法让代码工作:

    DocumentEvent

    我相信即使单元格未处于编辑模式,这也应该将KeyEvents传递给编辑器。

    实际上,我记得我可能有更好的解决方案。使用自定义JTextField来实现逻辑,而不是KeyListener。查看以下代码:Make a JFormattedTextField behave like ATM input

    我还没有尝试过使用这个文本字段作为编辑器,但我认为没有理由因为逻辑不是基于KeyEvents而无法工作。

答案 1 :(得分:0)

I've found a way to force the edit mode, which will do the trick:

https://stackoverflow.com/a/3015438/6047129