【问题标题】:Adjusting individual row height using cursor on JTable使用 JTable 上的光标调整单个行高
【发布时间】:2010-12-08 13:30:49
【问题描述】:

我有一个 JTable,我想在其上使用鼠标光标调整行高(如在 excel 中)。您能否建议我如何完成这项任务。

【问题讨论】:

    标签: java swing


    【解决方案1】:

    很久以前在 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);
            }
        }
    }
    

    【讨论】:

    • 这是一个旧答案,但我可以确认它确实可以正常工作。谢谢。
    【解决方案2】:

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

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

    • MouseMotionListener,可以跟踪鼠标的拖动
    • MouseListener,能够跟踪所有其他鼠标操作

    从这里开始,您必须了解用户何时开始将鼠标拖动到行分隔线上,然后使用正确的方法:setRowHeight(int,int)(针对特定行)或setRowHeight(int)(针对所有行)。

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

    【讨论】:

      猜你喜欢
      • 2010-12-19
      • 2015-07-15
      • 1970-01-01
      • 1970-01-01
      • 2015-01-02
      • 1970-01-01
      • 2015-08-04
      • 2019-01-19
      • 1970-01-01
      相关资源
      最近更新 更多