gpt4 book ai didi

java - JTable 单元格/列,允许我只输入一位数字

转载 作者:塔克拉玛干 更新时间:2023-11-02 07:47:20 28 4
gpt4 key购买 nike

java - 我想要一个 JTable 单元格/列,它允许我只输入一位数字(如 1 到 9)。我该怎么做?

我试过了,但我按下的数字在单元格中出现了两次。

table.addKeyListener(new KeyAdapter() {         
public void keyPressed(KeyEvent e) {
System.out.println("pressed..."+e.getKeyChar());
char key = e.getKeyChar();
int selectedColumn = table.getSelectedColumn();
int selectedRow = table.getSelectedRow();
if(table.getValueAt(selectedRow, selectedColumn) == null)
table.setValueAt(key, selectedRow, selectedColumn);
}
});

最佳答案

不要使用 KeyListener。您可以做的是为 TableCellEditor 使用 JTextField并添加一个 DocumentFilter到只允许数字的 JTextField

这是一个运行示例

import javax.swing.DefaultCellEditor;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
import javax.swing.table.TableCellEditor;
import javax.swing.text.AbstractDocument;
import javax.swing.text.AttributeSet;
import javax.swing.text.BadLocationException;
import javax.swing.text.DocumentFilter;
import javax.swing.text.DocumentFilter.FilterBypass;

public class JTableNumberColumn {

public JTableNumberColumn() {
JFrame frame = new JFrame();
JTextField field = createTextField();
frame.add(new JScrollPane(createTable(field)));
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}

private JTextField createTextField() {
JTextField field = new JTextField();
((AbstractDocument) field.getDocument()).setDocumentFilter(new DocumentFilter() {
@Override
public void insertString(FilterBypass fb, int off, String str, AttributeSet attr)
throws BadLocationException {
fb.insertString(off, str.replaceAll("\\D++", ""), attr); // remove non-digits
}

@Override
public void replace(FilterBypass fb, int off, int len, String str, AttributeSet attr)
throws BadLocationException {
fb.replace(off, len, str.replaceAll("\\D++", ""), attr); // remove non-digits
}
});
return field;
}

private JTable createTable(final JTextField field) {
String[] cols = {"Only Numbers", "Col 2", "Col 3"};
String[][] data = {{null, null, null}, {null, null, null}, {null, null, null}};
final TableCellEditor editor = new DefaultCellEditor(field);
JTable table = new JTable(data, cols) {
@Override
public TableCellEditor getCellEditor(int row, int column) {
int modelColumn = convertColumnIndexToModel(column);

if (modelColumn == 0) {
return editor;
} else {
return super.getCellEditor(row, column);
}
}
};
return table;
}

public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
new JTableNumberColumn();
}
});
}
}

编辑 1

我可能误解了你的问题。如果您只想允许一个 号码。那么你可以使用 JFormattedTextFieldMaskFormatter作为 TableCellEditor。这是一个例子

import javax.swing.DefaultCellEditor;
import javax.swing.JFormattedTextField;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.SwingUtilities;
import javax.swing.table.TableCellEditor;
import javax.swing.text.MaskFormatter;

public class JTableNumberColumn {

public JTableNumberColumn() {
JFrame frame = new JFrame();
JFormattedTextField field = createFormattedTextField();
frame.add(new JScrollPane(createTable(field)));
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}


private JFormattedTextField createFormattedTextField() {
JFormattedTextField field = new JFormattedTextField(createFormatter("#"));
return field;
}

protected MaskFormatter createFormatter(String s) {
MaskFormatter formatter = null;
try {
formatter = new MaskFormatter(s);
} catch (java.text.ParseException exc) {
System.err.println("formatter is bad: " + exc.getMessage());
System.exit(-1);
}
return formatter;
}

private JTable createTable(final JFormattedTextField field) {
String[] cols = {"Only Numbers", "Col 2", "Col 3"};
String[][] data = {{null, null, null}, {null, null, null}, {null, null, null}};
final TableCellEditor editor = new DefaultCellEditor(field);
JTable table = new JTable(data, cols) {
@Override
public TableCellEditor getCellEditor(int row, int column) {
int modelColumn = convertColumnIndexToModel(column);

if (modelColumn == 0) {
return editor;
} else {
return super.getCellEditor(row, column);
}
}
};
return table;
}

public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
new JTableNumberColumn();
}
});
}
}

编辑2

它已引起我的注意,我也忽略了您只想要 1-9 而不是 0-9 的事实。在那种情况下,我会坚持使用 JTextFieldDocumentFilter 的第一个选项,但在过滤器中,检查输入的长度并将正则表达式更改为仅允许 1 -9。

举个例子

import javax.swing.DefaultCellEditor;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
import javax.swing.table.TableCellEditor;
import javax.swing.text.AbstractDocument;
import javax.swing.text.AttributeSet;
import javax.swing.text.BadLocationException;
import javax.swing.text.DocumentFilter;
import javax.swing.text.DocumentFilter.FilterBypass;

public class JTableNumberColumn {

public JTableNumberColumn() {
JFrame frame = new JFrame();
JTextField field1 = createTextField();
frame.add(new JScrollPane(createTable(field1)));
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}

private JTextField createTextField() {
final JTextField field = new JTextField();
((AbstractDocument) field.getDocument()).setDocumentFilter(new DocumentFilter() {
@Override
public void insertString(FilterBypass fb, int off, String str, AttributeSet attr)
throws BadLocationException {
int length = field.getDocument().getLength();
if (length + str.length() <= 1) {
fb.insertString(off, str.replaceAll("[^1-9]", ""), attr); // remove non-digits
}
}

@Override
public void replace(FilterBypass fb, int off, int len, String str, AttributeSet attr)
throws BadLocationException {
int length = field.getDocument().getLength();
if (length + str.length() <= 1) {
fb.replace(off, len, str.replaceAll("[^1-9]", ""), attr); // remove non-digits
}
}
});
return field;
}


private JTable createTable(final JTextField field) {
String[] cols = {"Only Numbers", "Col 2", "Col 3"};
String[][] data = {{null, null, null}, {null, null, null}, {null, null, null}};
final TableCellEditor editor = new DefaultCellEditor(field);
JTable table = new JTable(data, cols) {
@Override
public TableCellEditor getCellEditor(int row, int column) {
int modelColumn = convertColumnIndexToModel(column);

if (modelColumn == 0) {
return editor;
} else {
return super.getCellEditor(row, column);
}
}
};
return table;
}

public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
new JTableNumberColumn();
}
});
}
}

关于java - JTable 单元格/列,允许我只输入一位数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22657812/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com