2017-04-06 141 views
0

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

在其中一个(第一张图片),当用户只需选择一个单元格并开始编写我的单元格编辑器不起作用。

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

只有当用户双击时才有编辑的方法吗?

PS .: isCellEditable和setClickClickCountToStart不起作用。

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

回答

1

有一种方法可以让编辑只有当用户双击?

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

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

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

  1. 覆盖了TableModelgetColumnClass(...)方法返回IntegerDouble。然后该表格将使用一个适当的编辑器,该编辑器仅允许输入数字数据。所以你不需要编写自定义编辑器。

  2. 如果你想自定义编辑,然后而是采用了JTextField中您可以使用您指定掩码为只允许数值

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

编辑:

你也许能够让你的代码中使用的工作:

table.setSurrendersFocusOnKeystroke(true); 

我相信这应该通过的KeyEvents到编辑器,即使该小区不是在编辑模式。

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

我还没有尝试过使用这个文本字段作为编辑器,但我没有看到为什么它不会工作,因为逻辑不是基于KeyEvents。

+0

我的编辑更改单元格的文本为用户键入任何东西。 单元格应该从0.00开始,当用户键入1时,它将变为0.01,依此类推,因此如果他键入1和2,则变为0.12,对于1,2和3,变为1.23。 当用户双击单元格时它工作正常。 –

+0

@FelipeHogrefeBento,我给了你3种可能的解决方案。 – camickr

+0

但是如何以两种方式编辑一个单元? –