达人们,我这里有一个 JScrollPane,有 3列 variable, value, time, 全是 string 类型.不过要求手工对 value 的输入必须是浮点类型的,否则的话连非法输入都不让显示。程序里对 value 的修改可以不受这个条件限制,可以修改为非浮点型的字符串。请问该如何实现?十分感谢!我写好的代码:GlobalVari_5.java
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Vector;import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.ListSelectionModel;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.DefaultTableModel;public class GlobalVari_5 extends JFrame{
private static final long serialVersionUID = 1L;

private static double select = 0;
private static int rowIndex = 0; //  /表格方法使用  
public GlobalVari_5(){
init(); this.setTitle("Global Variables");
this.setSize(new Dimension(650, 400));
this.setLocationRelativeTo(null);
this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
this.setVisible(true);
//this.setLayout(null);
this.setResizable(false);
} private void init(){
Vector<String> colHeader = new Vector<String>();
colHeader.add("Variable");
colHeader.add("Value");
colHeader.add("Time"); Vector<Vector<String>> dataVec = new Vector<Vector<String>>(); final JTable table = new JTable(dataVec,colHeader){
private static final long serialVersionUID = 1L; public boolean isCellEditable(int row, int column){
if(column > 1){
return false;
} else {
return true;
}
}
}; //2设置表头行高  
table.getTableHeader().setPreferredSize(new Dimension(0,30));  
//3设置表内容行高  
table.setRowHeight(25);  
//4设置单选模式  
table.getSelectionModel().setSelectionMode(ListSelectionModel.SINGLE_SELECTION);  
//5设置单元格不可拖动  
table.getTableHeader().setReorderingAllowed(false);  
//6设置不可改变列宽  
table.getTableHeader().setResizingAllowed(false);
//7设置列宽  
table.getColumnModel().getColumn(0).setPreferredWidth(95);
table.getColumnModel().getColumn(1).setPreferredWidth(55);  
table.getColumnModel().getColumn(2).setPreferredWidth(30);
//注意索引越界 DefaultTableCellRenderer right = new DefaultTableCellRenderer();
right.setHorizontalAlignment(JLabel.RIGHT);
table.getColumnModel().getColumn(1).setCellRenderer(right); 
table.getColumnModel().getColumn(2).setCellRenderer(right);

final JButton buttonAdd = new JButton("Add");
final JButton buttonDel = new JButton("Delete");
final JButton buttonCls = new JButton("Close");

rowIndex = table.getSelectedRow();  
System.out.println("index:"+rowIndex);  
//监听事件  
table.getSelectionModel().addListSelectionListener(new ListSelectionListener(){  
public void valueChanged(ListSelectionEvent e){
if(e.getValueIsAdjusting()){//连续操作  
rowIndex = table.getSelectedRow();  
if(rowIndex != -1){  
System.out.println("表格行被选中"+rowIndex); 
buttonDel.setEnabled(true); 
select = 1;
}                     
}
}
}); JScrollPane scrollPane = new JScrollPane(); 
scrollPane.setViewportView(table);
//this.add(scrollPane,BorderLayout.WEST);
this.add(scrollPane);
scrollPane.setSize(515, 350);
scrollPane.setLocation(5, 5); buttonAdd.setEnabled(true);
buttonDel.setEnabled(false);
buttonCls.setEnabled(true); JPanel panel = new JPanel();
panel.setSize(10, 350);
panel.setLocation(520, 5);
//this.add(panel, BorderLayout.EAST);
this.add(panel);

panel.setLayout(null);
panel.add(buttonAdd);
buttonAdd.setSize(100, 30);
buttonAdd.setLocation(530, 6);
panel.add(buttonDel);
buttonDel.setSize(100, 30);
buttonDel.setLocation(530, 50);
panel.add(buttonCls);
buttonCls.setSize(100, 30);
buttonCls.setLocation(530, 322); buttonAdd.addMouseListener(new MouseListener(){
public void mouseClicked(MouseEvent e){
DefaultTableModel model = (DefaultTableModel)table.getModel();
int rownum = table.getRowCount() + 1;
model.addRow(new Object[]{"gvar" + rownum, "", new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())});
} public void mousePressed(MouseEvent e){
} public void mouseReleased(MouseEvent e){
} public void mouseEntered(MouseEvent e){
} public void mouseExited(MouseEvent e){
}
}); buttonDel.addMouseListener(new MouseListener(){
public void mouseClicked(MouseEvent e){
if(select == 1){
DefaultTableModel model = (DefaultTableModel)table.getModel();
model.removeRow(rowIndex);
select = 0;
buttonDel.setEnabled(false);
}
} public void mousePressed(MouseEvent e){
} public void mouseReleased(MouseEvent e){
} public void mouseEntered(MouseEvent e){
} public void mouseExited(MouseEvent e){
}
});

buttonCls.addMouseListener(new MouseListener(){
public void mouseClicked(MouseEvent e){
setVisible(false);
} public void mousePressed(MouseEvent e){
} public void mouseReleased(MouseEvent e){
} public void mouseEntered(MouseEvent e){
} public void mouseExited(MouseEvent e){
}
});
}   public static void main(String[] args){
new GlobalVari_5();
}
}

解决方案 »

  1.   

    还有一个小问题,虽然我已经设定了 value列的显示是靠右,但是手动输入的时候,光标和已输入的内容(如果有的话)会移动到左边来。这个有没有办法让在手动输入的时候,value列的内容和光标都还是保持在右边呢?十分感谢!
      

  2.   

    java 高手们, 给点力呀!Thanks!
      

  3.   

    正则写在表格单元的.lostfocus()里!
    手工输入肯定要设置到焦点,失去焦点时就会调用该方法,从而正则检验
    而程序修改时不用设置焦点的,也就不会调用到该方法。
    应该是你想要的吧
      

  4.   

    重写cellreader继承JTextField
    然后在plainDocument对象的insertString方法中验证即可具体你可以google,大致思路就是这样!
      

  5.   

    看看是不是你想要的。
    import java.awt.Dimension;
    import java.awt.event.MouseEvent;
    import java.awt.event.MouseListener;
    import java.text.SimpleDateFormat;
    import java.util.Date;
    import java.util.Vector;import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JOptionPane;
    import javax.swing.JPanel;
    import javax.swing.JScrollPane;
    import javax.swing.JTable;
    import javax.swing.ListSelectionModel;
    import javax.swing.event.ChangeEvent;
    import javax.swing.event.ListSelectionEvent;
    import javax.swing.event.ListSelectionListener;
    import javax.swing.table.DefaultTableCellRenderer;
    import javax.swing.table.DefaultTableModel;public class GlobalVari_5 extends JFrame{
        private static final long serialVersionUID = 1L;
        
        private static double select = 0;
        private static int rowIndex = 0;    //  /表格方法使用  
        public GlobalVari_5(){
            init();        this.setTitle("Global Variables");
            this.setSize(new Dimension(650, 400));
            this.setLocationRelativeTo(null);
            this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
            this.setVisible(true);
            //this.setLayout(null);
            this.setResizable(false);
        }    private void init(){
            Vector<String> colHeader = new Vector<String>();
            colHeader.add("Variable");
            colHeader.add("Value");
            colHeader.add("Time");        Vector<Vector<String>> dataVec = new Vector<Vector<String>>();        final JTable table = new JTable(dataVec,colHeader){
                private static final long serialVersionUID = 1L;            public boolean isCellEditable(int row, int column){
                    if(column > 1){
                        return false;
                    } else {
                        return true;
                    }
                }
                public void editingStopped(ChangeEvent ce) {
    super.editingStopped(ce);
    int row = getSelectedRow();
    int col = getSelectedColumn();
    if (row < 0 || col < 0) {
    return;
    } Object value = getValueAt(row, col);
    System.out.println(row + "," + col + ":" + value);
    // 检查是不是浮点数
    try {
    Double.parseDouble((String) value);
    } catch (Exception e) {
    // 不是浮点
    setValueAt("", row, col);
    JOptionPane.showMessageDialog(this.getParent(), value
    + "不是浮点数!", "错误", JOptionPane.ERROR_MESSAGE);
    }
    } };        //2设置表头行高  
            table.getTableHeader().setPreferredSize(new Dimension(0,30));  
            //3设置表内容行高  
            table.setRowHeight(25);  
            //4设置单选模式  
            table.getSelectionModel().setSelectionMode(ListSelectionModel.SINGLE_SELECTION);  
            //5设置单元格不可拖动  
            table.getTableHeader().setReorderingAllowed(false);  
            //6设置不可改变列宽  
            table.getTableHeader().setResizingAllowed(false);
            //7设置列宽  
            table.getColumnModel().getColumn(0).setPreferredWidth(95);
            table.getColumnModel().getColumn(1).setPreferredWidth(55);  
            table.getColumnModel().getColumn(2).setPreferredWidth(30);    
            //注意索引越界        DefaultTableCellRenderer right = new DefaultTableCellRenderer();
            right.setHorizontalAlignment(JLabel.RIGHT);
            table.getColumnModel().getColumn(1).setCellRenderer(right); 
            table.getColumnModel().getColumn(2).setCellRenderer(right);
                    
            final JButton buttonAdd = new JButton("Add");
            final JButton buttonDel = new JButton("Delete");
            final JButton buttonCls = new JButton("Close");
            
            rowIndex = table.getSelectedRow();  
            System.out.println("index:"+rowIndex);  
            //监听事件  
            table.getSelectionModel().addListSelectionListener(new ListSelectionListener(){  
                public void valueChanged(ListSelectionEvent e){
                    if(e.getValueIsAdjusting()){//连续操作  
                        rowIndex = table.getSelectedRow();  
                        if(rowIndex != -1){  
                            System.out.println("表格行被选中"+rowIndex); 
                            buttonDel.setEnabled(true); 
                            select = 1;
                        }                     
                    }
                }
            });        JScrollPane scrollPane = new JScrollPane(); 
            scrollPane.setViewportView(table);
            //this.add(scrollPane,BorderLayout.WEST);
            this.add(scrollPane);
            scrollPane.setSize(515, 350);
            scrollPane.setLocation(5, 5);        buttonAdd.setEnabled(true);
            buttonDel.setEnabled(false);
            buttonCls.setEnabled(true);        JPanel panel = new JPanel();
            panel.setSize(10, 350);
            panel.setLocation(520, 5);
            //this.add(panel, BorderLayout.EAST);
            this.add(panel);
            
            panel.setLayout(null);
            panel.add(buttonAdd);
            buttonAdd.setSize(100, 30);
            buttonAdd.setLocation(530, 6);
            panel.add(buttonDel);
            buttonDel.setSize(100, 30);
            buttonDel.setLocation(530, 50);
            panel.add(buttonCls);
            buttonCls.setSize(100, 30);
            buttonCls.setLocation(530, 322);                buttonAdd.addMouseListener(new MouseListener(){
                public void mouseClicked(MouseEvent e){
                    DefaultTableModel model = (DefaultTableModel)table.getModel();
                    int rownum = table.getRowCount() + 1;
                    model.addRow(new Object[]{"gvar" + rownum, "", new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())});
                }            public void mousePressed(MouseEvent e){
                }            public void mouseReleased(MouseEvent e){
                }            public void mouseEntered(MouseEvent e){
                }            public void mouseExited(MouseEvent e){
                }
            });        buttonDel.addMouseListener(new MouseListener(){
                public void mouseClicked(MouseEvent e){
                    if(select == 1){
                        DefaultTableModel model = (DefaultTableModel)table.getModel();
                        model.removeRow(rowIndex);
                        select = 0;                    
                        buttonDel.setEnabled(false);
                    }
                }            public void mousePressed(MouseEvent e){
                }            public void mouseReleased(MouseEvent e){
                }            public void mouseEntered(MouseEvent e){
                }            public void mouseExited(MouseEvent e){
                }
            });
            
            buttonCls.addMouseListener(new MouseListener(){
                public void mouseClicked(MouseEvent e){
                    setVisible(false);
                }            public void mousePressed(MouseEvent e){
                }            public void mouseReleased(MouseEvent e){
                }            public void mouseEntered(MouseEvent e){
                }            public void mouseExited(MouseEvent e){
                }
            });
        }      public static void main(String[] args){
            new GlobalVari_5();
        }
    }
      

  6.   

    主要在你的JTable加了这段。public void editingStopped(ChangeEvent ce) {
                    super.editingStopped(ce);
                    int row = getSelectedRow();
                    int col = getSelectedColumn();
                    if (row < 0 || col < 0) {
                        return;
                    }                Object value = getValueAt(row, col);
                    System.out.println(row + "," + col + ":" + value);
                    // 检查是不是浮点数
                    try {
                        Double.parseDouble((String) value);
                    } catch (Exception e) {
                        // 不是浮点
                        setValueAt("", row, col);
                        JOptionPane.showMessageDialog(this.getParent(), value
                                + "不是浮点数!", "错误", JOptionPane.ERROR_MESSAGE);
                    }
                }
      

  7.   

    还有楼主要求value是浮点数,如果不包括整形数的话,验证部分请百度查下,重写。
    注意:正负号。
      

  8.   


    scbb, 这个确实是做到了验证是不是浮点数。不过,我希望能做得更干脆些,用户想要输入字母,特殊字符都直接输不进去。而不是输进去后再判断给出提示。这个可以做到么?
      

  9.   


    这样可以。你看看。import java.awt.Dimension;
    import java.awt.Toolkit;
    import java.awt.event.MouseEvent;
    import java.awt.event.MouseListener;
    import java.text.SimpleDateFormat;
    import java.util.Date;
    import java.util.Vector;import javax.swing.DefaultCellEditor;
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JPanel;
    import javax.swing.JScrollPane;
    import javax.swing.JTable;
    import javax.swing.JTextField;
    import javax.swing.ListSelectionModel;
    import javax.swing.event.ListSelectionEvent;
    import javax.swing.event.ListSelectionListener;
    import javax.swing.table.DefaultTableCellRenderer;
    import javax.swing.table.DefaultTableModel;
    import javax.swing.table.TableColumn;
    import javax.swing.text.AttributeSet;
    import javax.swing.text.BadLocationException;
    import javax.swing.text.PlainDocument;public class GlobalVari_5 extends JFrame{
        private static final long serialVersionUID = 1L;
        
        private static double select = 0;
        private static int rowIndex = 0;    //  /表格方法使用  
        public GlobalVari_5(){
            init();        this.setTitle("Global Variables");
            this.setSize(new Dimension(650, 400));
            this.setLocationRelativeTo(null);
            this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
            this.setVisible(true);
            //this.setLayout(null);
            this.setResizable(false);
        }    private void init(){
            Vector<String> colHeader = new Vector<String>();
            colHeader.add("Variable");
            colHeader.add("Value");
            colHeader.add("Time");        Vector<Vector<String>> dataVec = new Vector<Vector<String>>();        final JTable table = new JTable(dataVec,colHeader){
                private static final long serialVersionUID = 1L;            public boolean isCellEditable(int row, int column){
                    if(column > 1){
                        return false;
                    } else {
                        return true;
                    }
                }
            };
            //把Value列设为只能输入浮点数
            TableColumn column = table.getColumnModel().getColumn(1);
            JTextField textField = new JTextField();
            textField.setDocument(new DoubleDocument());
            column.setCellEditor(new DefaultCellEditor(textField));
                    
            //2设置表头行高  
            table.getTableHeader().setPreferredSize(new Dimension(0,30));  
            //3设置表内容行高  
            table.setRowHeight(25);  
            //4设置单选模式  
            table.getSelectionModel().setSelectionMode(ListSelectionModel.SINGLE_SELECTION);  
            //5设置单元格不可拖动  
            table.getTableHeader().setReorderingAllowed(false);  
            //6设置不可改变列宽  
            table.getTableHeader().setResizingAllowed(false);
            //7设置列宽  
            table.getColumnModel().getColumn(0).setPreferredWidth(95);
            table.getColumnModel().getColumn(1).setPreferredWidth(55);  
            table.getColumnModel().getColumn(2).setPreferredWidth(30);    
            //注意索引越界        DefaultTableCellRenderer right = new DefaultTableCellRenderer();
            right.setHorizontalAlignment(JLabel.RIGHT);
            table.getColumnModel().getColumn(1).setCellRenderer(right); 
            table.getColumnModel().getColumn(2).setCellRenderer(right);
            
            final JButton buttonAdd = new JButton("Add");
            final JButton buttonDel = new JButton("Delete");
            final JButton buttonCls = new JButton("Close");
            
            rowIndex = table.getSelectedRow();  
            System.out.println("index:"+rowIndex);  
            //监听事件  
            table.getSelectionModel().addListSelectionListener(new ListSelectionListener(){  
                public void valueChanged(ListSelectionEvent e){
                    if(e.getValueIsAdjusting()){//连续操作  
                        rowIndex = table.getSelectedRow();  
                        if(rowIndex != -1){  
                            System.out.println("表格行被选中"+rowIndex); 
                            buttonDel.setEnabled(true); 
                            select = 1;
                        }                     
                    }
                }
            });        JScrollPane scrollPane = new JScrollPane(); 
            scrollPane.setViewportView(table);
            //this.add(scrollPane,BorderLayout.WEST);
            this.add(scrollPane);
            scrollPane.setSize(515, 350);
            scrollPane.setLocation(5, 5);        buttonAdd.setEnabled(true);
            buttonDel.setEnabled(false);
            buttonCls.setEnabled(true);        JPanel panel = new JPanel();
            panel.setSize(10, 350);
            panel.setLocation(520, 5);
            //this.add(panel, BorderLayout.EAST);
            this.add(panel);
            
            panel.setLayout(null);
            panel.add(buttonAdd);
            buttonAdd.setSize(100, 30);
            buttonAdd.setLocation(530, 6);
            panel.add(buttonDel);
            buttonDel.setSize(100, 30);
            buttonDel.setLocation(530, 50);
            panel.add(buttonCls);
            buttonCls.setSize(100, 30);
            buttonCls.setLocation(530, 322);                buttonAdd.addMouseListener(new MouseListener(){
                public void mouseClicked(MouseEvent e){
                    DefaultTableModel model = (DefaultTableModel)table.getModel();
                    int rownum = table.getRowCount() + 1;
                    model.addRow(new Object[]{"gvar" + rownum, "", new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())});
                }            public void mousePressed(MouseEvent e){
                }            public void mouseReleased(MouseEvent e){
                }            public void mouseEntered(MouseEvent e){
                }            public void mouseExited(MouseEvent e){
                }
            });        buttonDel.addMouseListener(new MouseListener(){
                public void mouseClicked(MouseEvent e){
                    if(select == 1){
                        DefaultTableModel model = (DefaultTableModel)table.getModel();
                        model.removeRow(rowIndex);
                        select = 0;                    
                        buttonDel.setEnabled(false);
                    }
                }            public void mousePressed(MouseEvent e){
                }            public void mouseReleased(MouseEvent e){
                }            public void mouseEntered(MouseEvent e){
                }            public void mouseExited(MouseEvent e){
                }
            });
            
            buttonCls.addMouseListener(new MouseListener(){
                public void mouseClicked(MouseEvent e){
                    setVisible(false);
                }            public void mousePressed(MouseEvent e){
                }            public void mouseReleased(MouseEvent e){
                }            public void mouseEntered(MouseEvent e){
                }            public void mouseExited(MouseEvent e){
                }
            });
        }      public static void main(String[] args){
            new GlobalVari_5();
        }
        
    class DoubleDocument extends PlainDocument {
    public void insertString(int offset, String string,
    AttributeSet attributeSet) throws BadLocationException {
    try {
    int length = getLength();
    String currentContent = getText(0, length);
    StringBuffer currentBuffer = new StringBuffer(currentContent);
    currentBuffer.insert(offset, string);
    String newValue = currentBuffer.toString();
    Double.parseDouble(newValue);
    } catch (Exception ex) {
    Toolkit.getDefaultToolkit().beep();
    return;
    }
    super.insertString(offset, string, attributeSet);
    }
    }}
      

  10.   


    另外使用了以下方法进行了数字检查,
    由于Jdk api的设计,所以类似下面的字符都可以输入。
    3.14f //表示float数
    12.5D //表示double数
    Double.parseDouble(newValue);
    如果不合符要求,请找网上正则表达式来检查。
      

  11.   

    scbb,你好厉害!!!做到了哎!
    那个,我还想吹毛求疵一下,虽然我已经设定了 value列的显示是靠右,但是手动输入的时候,光标和已输入的内容(如果有的话)会移动到左边来。这个有没有办法让在手动输入的时候,value列的内容和光标都还是保持在右边呢?一百分的感谢!
      

  12.   

            textField.setDocument(new DoubleDocument());
            textField.setHorizontalAlignment(JTextField.RIGHT);// 这句新加一下,试试看。 
            column.setCellEditor(new DefaultCellEditor(textField));
      

  13.   

    scbb,太神了!
    现在 value列好像还可以输入类似 0110 这样的,能在cell 失去焦点的时候把 0110 这样的变成 110 么?
      

  14.   

    scbb,太神了!
    现在 value列好像还可以输入类似 0110 这样的,能在cell 失去焦点的时候把 0110 这样的变成 110 么?同时也把 3d 或 3f 这样的也变成 3 或 3.0?非常感谢!
      

  15.   

    JTable 那段下面这样改下。
    final JTable table = new JTable(dataVec,colHeader){
                private static final long serialVersionUID = 1L;            public boolean isCellEditable(int row, int column){
                    if(column > 1){
                        return false;
                    } else {
                        return true;
                    }
                }
                public void editingStopped(ChangeEvent ce) {
                    super.editingStopped(ce);
                    int row = getSelectedRow();
                    int col = getSelectedColumn();
                    if (row < 0 || col != 1) {
                        return;
                    }                Object value = getValueAt(row, col);
                    // 检查是不是浮点数
                    try {                
                        double tempVal = Double.parseDouble((String) value);
                        setValueAt(BigDecimal.valueOf(tempVal).stripTrailingZeros(), row, col);
                    } catch (Exception e) {
                        // 不是浮点
                        setValueAt("", row, col);
                        //JOptionPane.showMessageDialog(this.getParent(), value
                        //        + "不是浮点数!", "错误", JOptionPane.ERROR_MESSAGE);
                    }
                }
            };
      

  16.   

    我确认一下,现在程序后台应该也是不能把 value列的值修改为 非浮点型的字符串的,对吧。
      

  17.   


    嗯,好像程序里可以修改,不过要是用户手动双击选中了 value列的那个 cell, 再把光标移开,值就会被清空。对吧。
      

  18.   

    好吧,结贴!多谢 scbb!!!