2010-12-08 2 views

ответ

1

Если JTable не поддерживает его изначально, вам не повезло, так как эта задача будет довольно сложной в управлении.

Что вы на самом деле нужно сделать, это написать один или два слушателя:

  • MouseMotionListener, который способен отслеживать перетаскиванием мыши
  • MouseListener, который способен отслеживать все другие действия мыши

Начиная с этого вы должны понимать, когда пользователь начинает перетаскивать курсор мыши на линию разделения строк, а затем использовать правильный метод: setRowHeight(int,int) (для конкретной строки) или setRowHeight(int) (для всех строк).

Это будет непросто, и вам предлагается не пытаться делать это динамически (высота обновляется, когда мышь перемещается).

2

Найдено этот код на форумах ВС/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); 
     } 
    } 
} 
+0

Это старый ответ, но я могу подтвердить, что действительно работает отлично. Спасибо. – 2014-01-07 06:39:50

Смежные вопросы