Регулировка высоты отдельных строк с помощью курсора на JTable - PullRequest
2 голосов
/ 08 декабря 2010

У меня есть JTable, на котором я хочу настроить высоту строки с помощью курсора мыши (как в Excel). Не могли бы вы подсказать, как мне решить эту задачу?

Ответы [ 2 ]

2 голосов
/ 08 декабря 2010

Нашёл этот код на форумах 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);
        }
    }
}
1 голос
/ 08 декабря 2010

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

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...