• 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) {
    }
    }
  • 相关阅读:
    codevs 1576 最长严格上升子序列
    codevs 3415 最小和
    codevs 2102 石子归并 2
    洛谷 P1040 加分二叉树
    BZOJ 3038 上帝造题的七分钟二
    codevs 线段树练习ⅠⅡⅢ
    启动Tomcat提示:指定的服务未安装
    poj 1061 青蛙的约会 (扩展欧几里得模板)
    POJ 3449 Geometric Shapes(判断几个不同图形的相交,线段相交判断)
    HDU 5251 矩形面积(二维凸包旋转卡壳最小矩形覆盖问题) --2015年百度之星程序设计大赛
  • 原文地址:https://www.cnblogs.com/swek/p/4338086.html
Copyright © 2020-2023  润新知