mysql中的回车换行,jtable换行,自动调整行高,列宽     <br/>

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

2.JTable的render默认是继承jlabel的,不支持换行显示。
为了实现换行,一种方法是新写个render继承jtextarea,但是这样了之后不好设自动调整列宽,行高不能根据回车调整,也调的不准,而且超级卡。。。这种方法代码可以自己网上搜。
下面介绍第二种方法:默认的render不支持换行显示,我们先实现让单元格可以换行。我们在某一个单元格的value前面加上,末尾加,中间要要换行的地方加
<br>

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

出现的次数,然后通过table.setRowHeight((次数+1)*17)实现自动调整行高。
下面是具体的实现代码:
最好的方法是数据库里存的是正确的内容,等java查询并把结果放到tablemodel中时,把里面的回车符替换为
,并在两头加html标签。但是jtextarea里的内容gettext传入数据库后,在数据库中显示为空格,具体代码为" ", 在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) {
}
}
原文地址:https://www.cnblogs.com/swek/p/4338086.html