我实现了一种方法,因此用户输入设置为十进制格式。但它有两种编辑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;
}
}
答案 0 :(得分:1)
只有在用户双击时才允许编辑?
问题在于你的编辑。解决方案应该是修复编辑器,而不是阻止用户直接在文本字段中输入。
我不确定你的编辑器在做什么,但看起来你试图只在编辑器中输入数字。
如果是这种情况,那么你应该:
覆盖getColumnClass(...)
的{{1}}方法,以返回TableModel
或Integer
。然后该表将使用适当的编辑器,该编辑器仅允许输入数字数据。因此,您不需要编写自定义编辑器。
如果您想要自定义编辑,那么您可以使用Double
而不是使用JTextField来指定掩码以仅允许数值
最后最复杂的是在文本字段的JFormattedTextField
上使用DocumentListener
(而不是KeyListener)。每当文档发生变化时,都会生成Document
。
编辑:
您可以使用以下方法让代码工作:
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: