我编写了一个自定义的DefaultCelleditor
,这样当我键入示例Jtable
的Lengte
列时,除了数字之外什么都不能输入。
如果用户单击单元格一次,然后开始键入,同时仍然允许用户双击单元格开始编辑,我如何防止用户能够编辑单元格?
import java.awt.Color;
import java.awt.Component;
import java.awt.EventQueue;
import java.awt.GridLayout;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.lang.reflect.Constructor;
import javax.swing.DefaultCellEditor;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.border.LineBorder;
@SuppressWarnings("serial")
public class JTableTest extends JFrame {
private JTableTest() {
super("JTable Test");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLayout(new GridLayout(1, 1));
createPanel();
pack();
setVisible(true);
}
JPanel panel = new JPanel(new GridLayout(1, 1));
JScrollPane scroll;
private void createPanel() {
Object[] headers = {"Length", "Title"};
Object[][] sampleData = {{"673", "Bat Outta Hell"},
{"358", "Spanish Train"},
{"673", "Bat Outta Hell"}};
JTable table = new JTable(sampleData, headers);
table.setDefaultEditor(Object.class, new NumEditor());
scroll = new JScrollPane(table);
panel.add(scroll);
getContentPane().add(panel);
}
private class NumEditor extends DefaultCellEditor {
Class<?>[] argTypes = new Class<?>[]{String.class};
Constructor<?> constructor;
Object value;
public NumEditor() {
super(new JTextField());
getComponent().setName("Table.editor");
}
public boolean stopCellEditing() {
String s = (String)super.getCellEditorValue();
try {
if ("".equals(s)) {
if (constructor.getDeclaringClass() == String.class) {
value = s;
}
return super.stopCellEditing();
}
value = constructor.newInstance(new Object[]{s});
}
catch (Exception e) {
((JComponent)getComponent()).setBorder(new LineBorder(Color.red));
return false;
}
return super.stopCellEditing();
}
public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
this.value = null;
((JComponent)getComponent()).setBorder(new LineBorder(Color.black));
try {
Class<?> type = table.getColumnClass(column);
if (type == Object.class) {
type = String.class;
}
KeyListener kL = new KeyListener() {
public void keyPressed(KeyEvent e) {
}
public void keyReleased(KeyEvent e) {
}
public void keyTyped(KeyEvent e) {
char c = e.getKeyChar();
if(Character.isDigit(c)){
} else {
e.consume();
}
}
};
if(column == 0)
((JComponent)getComponent()).addKeyListener(kL);
else
((JComponent)getComponent()).removeKeyListener(kL);
constructor = type.getConstructor(argTypes);
}
catch (Exception e) {
return null;
}
return super.getTableCellEditorComponent(table, value, isSelected, row, column);
}
public Object getCellEditorValue() {
return value;
}
}
public static void main(String[] args) {
EventQueue.invokeLater(() -> new JTableTest());
}
}
查看celleditor.iscelleditable(EventObject anEvent)
。AbstractCelleditor
和DefaultCelleditor
实现Celleditor
接口。
如果EventObject
是KeyEvent
类型的实例,则可以重写此方法以返回false。否则返回super.iscelleditable(anEvent)
。
我希望enter键的作用类似于JTable上的tab键。我知道这个问题已经问过几次了,我使用了本页中找到的解决方案:使用Enter键就像JTable上的Tab键一样。 因此,当我按下tab键时,下一个单元格被聚焦,其中的文本被选中,但当我键入enter键时,第一次单元格松开焦点,第二次enter键时,下一个单元格获得焦点,其中的文本被选中。 所以我的问题是:有没有一种方法可以让第一个从单元格中输入
问题内容: 我试图以编程方式开始在按键上编辑当前行的第三列。 我实现了一个KeyListener,其中包含以下代码 当我释放Enter时,单元格确实是可编辑的(我可以在末尾键入),但是没有插入符号。 当我用鼠标单击时,行为是预期的(我可以进行编辑,并且存在carret)。 另外,我注意到在释放键时,我的celleditor为null,而在mouseclick上,它也不为null。 我究竟做错了什么
我正在设计一个客户机交互应用程序,其中的需求如下:- null 在单元格焦点上按下ENTER键=只编辑单元格。 单元格焦点外+按下ENTER键=添加新行。 如果单元格焦点不在,请建议添加行。并编辑单元格焦点是否存在。
我用tkinter创建了一个文本框。当按下Ctrl返回时,以下代码将停止创建换行符。 但是,我还想在用户键入Ctrl-Return时调用一个函数。下面调用该函数,但随后创建一个换行: 如果交换第三行和第四行,则没有换行符,但也不会调用该函数。 有没有一种既防止换行符又调用函数的方法?
问题内容: 我使用此代码在iOS自定义相机App中实现了“轻按一下”功能,但无法正常工作。这是代码 问题答案: 我不知道为什么这样做,但确实如此。
在C#windows应用程序中,要导航窗体的所有控件(使用Enter键),我使用以下代码: 任何人请帮帮我。