我有一个JTable,用户可以添加,编辑和删除单元格(所有这些除了JTable之外没有额外的组件)。我想为特定列中的所有单元格设置自定义掩码(类似于JFormattedTextField)。
实施例: JTable有2列:时间和描述。时间列中的所有单元格都有HH:MM掩码,“描述”列中的单元格没有掩码。
我怎样才能做到这一点?
感谢。
答案 0 :(得分:3)
有关于验证IP地址的JTable字段的问题here。在接受的答案中,SO用户(peeskillet)展示了如何使用正则表达式作为“掩码”来验证JTable的输入。如果你可以将正则表达式调整到你的面具上并研究他的代码,那么他应该帮助你做正确的方向。
祝你好运!
修改强>
我指的代码:
import javax.swing.DefaultCellEditor;
import javax.swing.InputVerifier;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableCellEditor;
public class TableVerifyInput {
//The 'mask' as you say for the fields
private static final String IP_REGEX = "^(?:[0-9]{1,3}\\.){3}[0-9]{1,3}$";
public TableVerifyInput() {
final InputVerifier verifier = getInputVerifier();
final DefaultCellEditor editor = getTableCellEditor(verifier);
String[] cols = {"IP address", "Column 2"};
Object[][] data = {{null, null}, {null, null}};
DefaultTableModel model = new DefaultTableModel(data, cols);
JTable table = new JTable(model) {
public TableCellEditor getCellEditor(int row, int column) {
int modelColumn = convertColumnIndexToModel(column);
if (modelColumn == 0) {
return editor;
} else {
return super.getCellEditor(row, column);
}
}
};
JFrame frame = new JFrame("Table Cell Verify");
frame.add(new JScrollPane(table));
frame.pack();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
private InputVerifier getInputVerifier() {
InputVerifier verifier = new InputVerifier() {
@Override
public boolean verify(JComponent input) {
JTextField field = (JTextField) input;
String text = field.getText();
return text.matches(IP_REGEX) || text.isEmpty();
}
@Override
public boolean shouldYieldFocus(JComponent input) {
boolean valid = verify(input);
if (!valid) {
JOptionPane.showMessageDialog(null, "Invalid IP address");
}
return valid;
}
};
return verifier;
}
private DefaultCellEditor getTableCellEditor(final InputVerifier verifier) {
DefaultCellEditor editor = new DefaultCellEditor(new JTextField()) {
{
getComponent().setInputVerifier(verifier);
}
@Override
public boolean stopCellEditing() {
if (!verifier.shouldYieldFocus(getComponent())) {
return false;
}
return super.stopCellEditing();
}
@Override
public JTextField getComponent() {
return (JTextField) super.getComponent();
}
};
return editor;
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
new TableVerifyInput();
}
});
}
}
再次感谢SO用户peeskillet的贡献。
答案 1 :(得分:1)
好的,似乎我找到了一个很好的解决方案。 在这个帖子上:Changing JTable Cell's Font while editing it解决问题的答案就是这个代码:
DefaultCellEditor dce = new DefaultCellEditor( textField );
myTable.getColumnModel().getColumn(1).setCellEditor(dce);
然后我适应使用MaskFormatter:
table.setModel(new DefaultTableModel(new String[][] { } , new String[] {"Time", "Description"} ) );
JFormattedTextField ftext = new JFormattedTextField();
MaskFormatter mask;
try {
mask = new MaskFormatter("##:##");
mask.install(ftext);
} catch (ParseException e) {
e.printStackTrace();
}
table.getColumnModel().getColumn(0).setCellEditor(new DefaultCellEditor(ftext));
这基本上就是我想要的。谢谢你的回答。