Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何操作指定列上的JTable返回值?_Java_Swing_Jtable_Jtextfield_Tablecelleditor - Fatal编程技术网

Java 如何操作指定列上的JTable返回值?

Java 如何操作指定列上的JTable返回值?,java,swing,jtable,jtextfield,tablecelleditor,Java,Swing,Jtable,Jtextfield,Tablecelleditor,我有一个JTable,它有两列(可编辑JTable)。当用户在第二列中键入内容时,我的要求如下: 用户只能键入数字和逗号 当用户输入错误的字符时,它将发出嘟嘟声(Toolkit.getDefaultToolkit().beep();) 我该如何实现这一目标?(如果是jtextfield,则需要文档过滤器或普通文档等,如果是JTable,则如何实现?实现一个能够返回文本组件(jtextfield)的组件,该组件附带一个能够根据需要过滤传入文本的组件 你可能想看看 (查找“实现文档过滤器

我有一个JTable,它有两列(可编辑JTable)。当用户在第二列中键入内容时,我的要求如下:

  • 用户只能键入数字和逗号

  • 当用户输入错误的字符时,它将发出嘟嘟声
    (Toolkit.getDefaultToolkit().beep();

我该如何实现这一目标?(如果是jtextfield,则需要文档过滤器或普通文档等,如果是JTable,则如何实现?

实现一个能够返回文本组件(
jtextfield
)的组件,该组件附带一个能够根据需要过滤传入文本的组件

你可能想看看

  • (查找“实现文档过滤器”)
用示例更新

如果是jtextfield,则需要文档过滤器或普通文档等,如果是 JTable,那怎么办

阅读教程,针对您遇到的问题提出问题。重要的是,你要理解为什么事情是以某种方式完成的,而不是简单地复制和粘贴其他代码,否则你就不知道什么时候在复制坏主意;)

公共类TestFilteredCellEditor{
公共静态void main(字符串[]args){
新的TestFilteredCellEditor();
}
公共TestFilteredCellEditor(){
invokeLater(新的Runnable(){
@凌驾
公开募捐{
试一试{
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
}捕获(ClassNotFoundException ex){
}catch(实例化异常){
}捕获(非法访问例外){
}捕获(无支持的LookandFeelexception ex){
}
JFrame=新JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(新的BorderLayout());
frame.add(新的filtereditorpane());
frame.pack();
frame.setLocationRelativeTo(空);
frame.setVisible(true);
}
});
}
公共类FilteredEditorPane扩展了JPanel{
公共筛选器编辑器窗格(){
setLayout(新的BorderLayout());
JTable table=newjtable(newmytablemodel());
TableColumnModel columnModel=table.getColumnModel();
columnModel.getColumn(1.setCellEditor)(新的FilteredTableEditor());
添加(新JScrollPane(表));
}
}
公共类FilteredTableEditor扩展AbstractCellEditor实现TableCellEditor{
私有JTextField编辑器;
公共FilteredTableEditor(){
编辑器=新的JTextField();
((AbstractDocument)editor.getDocument()).setDocumentFilter(新的NumericDocumentFilter());
}
@凌驾
公共布尔值isCellEditable(EventObject e){
返回true;
}
@凌驾
公共对象getCellEditorValue(){
返回editor.getText();
}
@凌驾
公共组件getTableCellEditorComponent(JTable表、对象值、布尔isSelected、int行、int列){
if(字符串的值实例){
editor.setText((字符串)值);
}否则{
editor.setText(null);
}
返回编辑器;
}
}
公共类NumericDocumentFilter扩展了DocumentFilter{
public void insertString(DocumentFilter.FilterBypass fb,int offset,
字符串字符串,属性集属性)
抛出BadLocationException{
StringBuilder缓冲区=新的StringBuilder(字符串);
布尔值isBad=false;
对于(int i=buffer.length()-1;i>=0;i--){
char ch=缓冲区charAt(i);
如果(!Character.isDigit(ch)){
缓冲区。删除字符(i);
isBad=正确;
}
}
如果(是坏的){
getDefaultToolkit().beep();
}
super.insertString(fb,offset,buffer.toString(),attr);
}
公共无效替换(DocumentFilter.FilterBypass fb,
int offset、int length、String String、AttributeSet attr)引发BadLocationException{
如果(长度>0){
fb.移除(偏移、长度);
}
插入字符串(fb、偏移量、字符串、属性);
}
}
公共类MyTableModel扩展了AbstractTableModel{
@凌驾
public int getRowCount(){
返回1;
}
@凌驾
public int getColumnCount(){
返回2;
}
@凌驾
公共对象getValueAt(int行索引、int列索引){
返回“”;
}
@凌驾
公共布尔值isCellEditable(int-rowIndex、int-columnIndex){
返回true;
}
@凌驾
公共类getColumnClass(int columnIndex){
返回字符串.class;
}
}
}
实现一个能够返回文本组件(
JTextField
)的组件,该组件附带一个能够根据需要过滤传入文本的组件

你可能想看看

  • (查找“实现文档过滤器”)
用示例更新

如果是jtextfield,则需要文档过滤器或普通文档等,如果是 JTable,那怎么办

阅读教程,针对您遇到的问题提出问题。重要的是,你要理解为什么事情是以某种方式完成的,而不是简单地复制和粘贴其他代码,否则你就不知道什么时候在复制坏主意;)

公共类TestFilteredCellEditor{
公共静态无效
public class TestFilteredCellEditor {

    public static void main(String[] args) {
        new TestFilteredCellEditor();
    }

    public TestFilteredCellEditor() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException ex) {
                } catch (InstantiationException ex) {
                } catch (IllegalAccessException ex) {
                } catch (UnsupportedLookAndFeelException ex) {
                }

                JFrame frame = new JFrame();
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLayout(new BorderLayout());
                frame.add(new FilteredEditorPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class FilteredEditorPane extends JPanel {

        public FilteredEditorPane() {
            setLayout(new BorderLayout());
            JTable table = new JTable(new MyTableModel());
            TableColumnModel columnModel = table.getColumnModel();
            columnModel.getColumn(1).setCellEditor(new FilteredTableEditor());
            add(new JScrollPane(table));
        }
    }

    public class FilteredTableEditor extends AbstractCellEditor implements TableCellEditor {

        private JTextField editor;

        public FilteredTableEditor() {
            editor = new JTextField();
            ((AbstractDocument) editor.getDocument()).setDocumentFilter(new NumericDocumentFilter());
        }

        @Override
        public boolean isCellEditable(EventObject e) {
            return true;
        }

        @Override
        public Object getCellEditorValue() {
            return editor.getText();
        }

        @Override
        public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
            if (value instanceof String) {
                editor.setText((String) value);
            } else {
                editor.setText(null);
            }
            return editor;
        }
    }

    public class NumericDocumentFilter extends DocumentFilter {

        public void insertString(DocumentFilter.FilterBypass fb, int offset,
                String string, AttributeSet attr)
                throws BadLocationException {

            StringBuilder buffer = new StringBuilder(string);
            boolean isBad = false;
            for (int i = buffer.length() - 1; i >= 0; i--) {
                char ch = buffer.charAt(i);
                if (!Character.isDigit(ch)) {
                    buffer.deleteCharAt(i);
                    isBad = true;
                }
            }
            if (isBad) {
                Toolkit.getDefaultToolkit().beep();
            }
            super.insertString(fb, offset, buffer.toString(), attr);
        }

        public void replace(DocumentFilter.FilterBypass fb,
                int offset, int length, String string, AttributeSet attr) throws BadLocationException {
            if (length > 0) {
                fb.remove(offset, length);
            }
            insertString(fb, offset, string, attr);
        }
    }

    public class MyTableModel extends AbstractTableModel {

        @Override
        public int getRowCount() {
            return 1;
        }

        @Override
        public int getColumnCount() {
            return 2;
        }

        @Override
        public Object getValueAt(int rowIndex, int columnIndex) {
            return "";
        }

        @Override
        public boolean isCellEditable(int rowIndex, int columnIndex) {
            return true;
        }

        @Override
        public Class<?> getColumnClass(int columnIndex) {
            return String.class;
        }
    }
}