標籤:
兩個問題: 1.mysql裡不支援換行,textarea裡的斷行符號傳入後再傳出來就變成了空格。
2.JTable的render預設是繼承jlabel的,不支援換行顯示。為了實現換行,一種方法是新寫個render繼承jtextarea,但是這樣了之後不好設自動調整列寬,行高不能根據斷行符號調整,也調的不準,而且超級卡。。。這種方法代碼可以自己網上搜。下面介紹第二種方法:預設的render不支援換行顯示,我們先實現讓儲存格可以換行。我們在某一個儲存格的value前面加上,末尾加,中間要要換行的地方加
<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;iint 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) {}}
mysql中的斷行符號換行,jtable換行,自動調整行高,列寬 \r \n <br/>