您的位置:首页 > 数据库 > MySQL

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

2015-03-14 19:28 519 查看
两个问题: 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;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) {
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: