[英]Stop JTable being editable only when focussed and key pressed
我編寫了一個自定義的DefaultCellEditor
以便在示例JTable
的length
列中鍵入內容時只能輸入數字。
為此,我向用作編輯器組件的JTextField
添加了一個KeyListener
。 如果雙擊單元格以編輯值,則效果很好,但單擊一次單元格然后開始鍵入,則無效。
如果用戶單擊該單元格一次然后開始輸入,同時又允許用戶雙擊該單元格來開始對其進行編輯,如何防止用戶能夠編輯該單元格呢?
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());
}
}
停止JTable僅在聚焦並按下鍵時才可編輯
好吧,這是在編輯帶有字符串數據的單元格時的默認行為。
嘗試輸入數字數據時為什么會有什么不同?
我編寫了一個自定義的DefaultCellEditor,以便在示例JTable的長度列中鍵入內容時只能輸入數字。
無需編寫自定義編輯器。 只需使用JFormattedTextField
而不是JTextField作為編輯器即可:
就像是。
MaskFormatter format = new MaskFormatter("######");
JFormattedTextField ftf = new JFormattedTextField( format );
DefaultCellEditor dce = new DefaultCellEditor( ftf );
table.getColumnModel().getColumn(2).setCellEditor(dce);
看一下CellEditor.isCellEditable( EventObject anEvent )
。 AbstractCellEditor
和DefaultCellEditor
實現CellEditor
接口。
如果EventObject
是KeyEvent
類型的實例,則可以重寫此方法以返回false。 否則返回super.isCellEditable( anEvent )
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.