Java 使用JTable上的光标调整单个行的高度

Java 使用JTable上的光标调整单个行的高度,java,swing,Java,Swing,我有一个JTable,我想在它上使用鼠标光标调整行高(就像在excel中一样)。你能建议我如何完成这项任务吗。如果JTable本身不支持它,那么你就不走运了,因为这项任务将很难管理 您实际需要做的是编写一个或两个侦听器: 一个能够跟踪鼠标拖动的MouseMotionListener 一个鼠标侦听器,能够跟踪所有其他鼠标动作 从这一点开始,您必须了解用户何时开始在行分隔线上拖动鼠标,然后使用正确的方法:setRowHeight(int,int)(对于特定行)或setRowHeight(int)

我有一个JTable,我想在它上使用鼠标光标调整行高(就像在excel中一样)。你能建议我如何完成这项任务吗。

如果JTable本身不支持它,那么你就不走运了,因为这项任务将很难管理

您实际需要做的是编写一个或两个侦听器:

  • 一个能够跟踪鼠标拖动的
    MouseMotionListener
  • 一个
    鼠标侦听器
    ,能够跟踪所有其他鼠标动作
从这一点开始,您必须了解用户何时开始在行分隔线上拖动鼠标,然后使用正确的方法:
setRowHeight(int,int)
(对于特定行)或
setRowHeight(int)
(对于所有行)


这并不容易,它建议您不要尝试动态操作(鼠标移动时高度会更新)。

很久以前在Sun/Oracle论坛上发现此代码

import javax.swing.*;
import javax.swing.table.*;
import javax.swing.event.MouseInputAdapter;
import java.awt.*;
import java.awt.event.MouseEvent;

public class TableRowResizer extends MouseInputAdapter
{ 
    public static Cursor resizeCursor = Cursor.getPredefinedCursor(Cursor.N_RESIZE_CURSOR); 

    private int mouseYOffset, resizingRow; 
    private Cursor otherCursor = resizeCursor; 
    private JTable table; 

    public TableRowResizer(JTable table){ 
        this.table = table; 
        table.addMouseListener(this); 
        table.addMouseMotionListener(this); 
    } 

    private int getResizingRow(Point p){ 
        return getResizingRow(p, table.rowAtPoint(p)); 
    } 

    private int getResizingRow(Point p, int row){ 
        if(row == -1){ 
            return -1; 
        } 
        int col = table.columnAtPoint(p); 
        if(col==-1) 
            return -1; 
        Rectangle r = table.getCellRect(row, col, true); 
        r.grow(0, -3); 
        if(r.contains(p)) 
            return -1; 

        int midPoint = r.y + r.height / 2; 
        int rowIndex = (p.y < midPoint) ? row - 1 : row; 

        return rowIndex; 
    } 

    public void mousePressed(MouseEvent e){ 
        Point p = e.getPoint(); 

        resizingRow = getResizingRow(p); 
        mouseYOffset = p.y - table.getRowHeight(resizingRow); 
    } 

    private void swapCursor(){ 
        Cursor tmp = table.getCursor(); 
        table.setCursor(otherCursor); 
        otherCursor = tmp; 
    }

    public void mouseMoved(MouseEvent e){
        if((getResizingRow(e.getPoint())>=0)
           != (table.getCursor() == resizeCursor)){
            swapCursor();
        }
    }

    public void mouseDragged(MouseEvent e){
        int mouseY = e.getY();

        if(resizingRow >= 0){
            int newHeight = mouseY - mouseYOffset;
            if(newHeight > 0)
                table.setRowHeight(resizingRow, newHeight);
        }
    }
}
import javax.swing.*;
导入javax.swing.table.*;
导入javax.swing.event.MouseInputAdapter;
导入java.awt.*;
导入java.awt.event.MouseEvent;
公共类TableRowResizer扩展了MouseInputAdapter
{ 
public static Cursor resizeCursor=Cursor.getPredefinedCursor(Cursor.N\u RESIZE\u Cursor);
私有int mouseYOffset,resizinggrow;
私有游标otherCursor=大小游标;
专用JTable表;
公共表RowResizer(JTable表){
this.table=表格;
表.addMouseListener(本);
table.addMouseMotionListener(此);
} 
私有整型getResizingRow(点p){
返回getResizingRow(p,table.rowAtPoint(p));
} 
私有int getResizingRow(点p,int行){
如果(行==-1){
返回-1;
} 
int col=表列点(p);
如果(列==-1)
返回-1;
矩形r=table.getCellRect(行、列、真);
r、 生长(0,-3);
如果(r.包含(p))
返回-1;
int中点=r.y+r.height/2;
int rowIndex=(p.y<中点)?第1行:第2行;
返回行索引;
} 
公共无效鼠标按下(MouseEvent e){
点p=e.getPoint();
resizingRow=getResizingRow(p);
mouseYOffset=p.y-table.getRowHeight(resizinggrow);
} 
私有void swapCursor(){
Cursor tmp=table.getCursor();
table.setCursor(otherCursor);
otherCursor=tmp;
}
public void mouseMoved(MouseEvent e){
如果((getResizingRow(e.getPoint())>=0)
!=(table.getCursor()==resizeCursor)){
swapCursor();
}
}
公共无效鼠标标记(鼠标事件e){
int mouseY=e.getY();
如果(调整大小增长>=0){
int newHeight=mouseY-mouseYOffset;
如果(新高度>0)
表.setRowHeight(resizingRow、newHeight);
}
}
}

这是一个古老的答案,但我可以确认它确实非常有效。非常感谢。