两个问题: 1.mysql里不支持换行,textarea里的回车传入后再传出来就变成了空格。

2.JTable的render默认是继承jlabel的,不支持换行显示。


<br>


,然后那个单元格里面的内容就可以换行了。但是发现单元格没有调整行高,导致两行字都只能看到一半。这时候,我们可以自己写个鼠标事件,让jtable可以通过鼠标拖拽调整行高,同时也可以写个方法,自动计算单元格value中

<br>


出现的次数,然后通过table.setRowHeight((次数+1)*17)实现自动调整行高。


下面是具体的实现代码:


最好的方法是数据库里存的是正确的内容,等java查询并把结果放到tablemodel中时,把里面的回车符替换为
,并在两头加html标签。但是jtextarea里的内容gettext传入数据库后,在数据库中显示为空格,具体代码为"\r ",\r在java中也是转义了的,如果等我们从数据库查询出来了再替换就只能替换空格了,这样会把正常的空格也当成回车。所以我认为最好的方法是在数据库里就把回车替换成
,textarea传入到sql中的回车被sql用char(10)替换了,所以,我们在每次执行查询的时候,对数据库执行一次UPDATE table_name SET column_name = REPLACE(column_name, CHAR(10), '
'),接着把查询结果赋给tablemodel的循环中,if (column==会出现回车的列),则在首尾加html标签。


public String parseToWrap(String str) 
  
 
  

    { 
  
 
  

    StringBuffer sb = new StringBuffer(); 
  
 
  

    sb.append(""); 
  
 
  

    sb.append(str); 
  
 
  

    //sb.append(str.replaceAll("\", " 
   
")); 
   
  

    sb.append(""); 
  
 
  

    return sb.toString(); 
  
 
  

    }


按以上做了后,在jtable里绑定tablemodellistener,修改单元格内容后上传时会出现上传了html标签,需要在上传时检测html标签,有的话删除再上传(我的表只有13-15列加过,所以只检测13-15行):


public void tableChanged(TableModelEvent e) { 
  
 
  

    int row = e.getFirstRow();   
  
 
  

           int column = e.getColumn();   
  
 
  

           TableModel model = (TableModel)e.getSource();   
  
 
  

           String columnName = model.getColumnName(column);   
  
 
  

           String data =(String) model.getValueAt(row, column); 
  
 
  

           if (column==13||column==14||column==15){ 
  
 
  

    String str2 = ""; 
  
 
  

    int total = 0; 
  
 
  

    for (String tmp = data; tmp != null&&tmp.length()>=str2.length();){ 
  
 
  

     if(tmp.indexOf(str2) == 0){ 
  
 
  

       total ++; 
  
 
  

     } 
  
 
  

     tmp = tmp.substring(1); 
  
 
  

           } 
  
 
  

    if(total!=0){ 
  
 
  

    data.substring(6, data.length()-7); 
  
 
  

    } 
  
 
  

    } 
  
 
  

           Object num =model.getValueAt(row, 0); 
  
 
  

           try{ 
  
 
  

            if(column==1 && !isDateStringValid(data)){ 
  
 
  

            JOptionPane.showMessageDialog(null,"日期格式错误"); 
  
 
  

            } 
  
 
  

            else if(column==19){ 
  
 
  

            JOptionPane.showMessageDialog(null,"请在配置中修改附件"); 
  
 
  

            }else{ 
  
 
  

            stmt.executeUpdate("update exception set "+columnName+"= '"+data+"' where NO ="+num ); 
  
 
  

            } 
  
 
  

            }catch (Exception upe) { 
  
 
  

    upe.printStackTrace(); 
  
 
  

    JOptionPane.showMessageDialog(null,"没有权限"); 
  
 
  

    } 
  
 
  

    } 
  
 
  

    }


检测
的个数实现自动调整行高(我的表只有13-15列会出现回车,所以不用从0开始循环):


public void autoHeight(JTable table){ 
  
 
  

    TableModel model=table.getModel(); 
  
 
  

    for(int i=0;i 
  
 
  

    int height=17; 
  
 
  

    for (int j=13;j<16;j++){ 
  
 
  

    String str1 =(String) model.getValueAt(i, j); 
  
 
  

    String str2 = " 
  
 
  

    int total = 1; 
  
 
  

    for (String tmp = str1; tmp != null&&tmp.length()>=str2.length();){ 
  
 
  

     if(tmp.indexOf(str2) == 0){ 
  
 
  

       total ++; 
  
 
  

     } 
  
 
  

     tmp = tmp.substring(1); 
  
 
  

    } 
  
 
  

    height=Math.max(height, 17*total); 
  
 
  

    } 
  
 
  

    table.setRowHeight(i, height); 
  
 
  

    } 
  
 
  

    }


检测单行字符数,实现自动调整列宽:



public void FitTableColumns(JTable myTable) 
  
 
  

    { 
  
 
  

       JTableHeader header = myTable.getTableHeader(); 
  
 
  

       int rowCount = myTable.getRowCount(); 
  
 
  

       Enumeration columns = myTable.getColumnModel().getColumns(); 
  
 
  

       while(columns.hasMoreElements()) 
  
 
  

       { 
  
 
  

        TableColumn column = (TableColumn)columns.nextElement(); 
  
 
  

           int col = header.getColumnModel().getColumnIndex(column.getIdentifier()); 
  
 
  

           int width = (int)myTable.getTableHeader().getDefaultRenderer().getTableCellRendererComponent(myTable, column.getIdentifier(), false, false, -1, col).getPreferredSize().getWidth();                
  
 
  

           for(int row = 0; row 
  
 
  

            { 
  
 
  

            int preferedWidth = (int)myTable.getCellRenderer(row, col).getTableCellRendererComponent(myTable, 
  
 
  

                myTable.getValueAt(row, col), false, false, row, col).getPreferredSize().getWidth(); 
  
 
  

                width = Math.max(width, preferedWidth); 
  
 
  

            } 
  
 
  

            header.setResizingColumn(column); // 此行很重要 
  
 
  

            column.setWidth(width+myTable.getIntercellSpacing().width); 
  
 
  

        } 
  
 
  

    }


为表格绑定鼠标事件,可以手动调整行高:


table.addMouseListener(listener); 
  
 
  

    table.addMouseMotionListener(listener); 
  
 
 

    class MouseAdapterListener extends java.awt.event.MouseMotionAdapter 
  
 
  

        implements MouseListener { 
  
 
  

    int oldY = 0; 
  
 
  

    int newY = 0; 
  
 
  

    int row = 0; 
  
 
  

    int oldHeight = 0; 
  
 
  

    boolean drag = false; 
  
 
  

    int increase = 0; 
  
 

    public MouseAdapterListener() { 
  
 
  
  

    } 
  
 
  

    public void mouseMoved(MouseEvent e) { 
  
 
  

        int onRow = table.rowAtPoint(e.getPoint()); 
  
 
        int height = 0; 
  
 
  

        for (int i = 0; i <= onRow; i++) { 
  
 
  

            height = height + table.getRowHeight(i); 
  
 
  

        } 
  

        if (height - e.getY() < 3) { 
  
 
  

            drag = true; 
  
 
  

            table.setCursor(new Cursor(Cursor.N_RESIZE_CURSOR)); 
  
 
  

        } else { 
  
 
  

            drag = false; 
  
 
  

            table.setCursor(new Cursor(Cursor.DEFAULT_CURSOR)); 
  
 
  

        } 
  
 

    } 
  

    public void mouseDragged(MouseEvent e) { 
  
 
  

        if (drag) { 
  
 
  

            int value = oldHeight + e.getY() - oldY; 
  
 
  

            if (value < 30) 
  
 
  

                table.setRowHeight(row, 17); 
  
 
  

            else                      
  
 
  

                table.setRowHeight(row, oldHeight + e.getY() - oldY); 
  
  

            table.setRowSelectionInterval(row, row);                 
  
 

        } 
  

    } 
  
 
  

    public void mousePressed(MouseEvent e) { 
  
 
  

        oldY = e.getY(); 
  
 
  

        row = table.rowAtPoint(e.getPoint()); 
  
 
  

        oldHeight = table.getRowHeight(row); 
  
 
  

        table.setRowSelectionInterval(row, row); 
  
 
  

    } 
  
  

    public void mouseReleased(MouseEvent e) { 
  
 
  

        newY = e.getY(); 
  
 
  

        table.setCursor(new Cursor(Cursor.DEFAULT_CURSOR)); 
  
 
  

    } 
  
 
  

    public void mouseClicked(MouseEvent e) { 
  
 
  

    } 
  
 

    public void mouseEntered(MouseEvent e) { 
  
 
  

    } 
  
  

    public void mouseExited(MouseEvent e) { 
  
 

    } 
  
 
  

    }