Как обнаружить щелчок на границе строки JTable? - PullRequest
3 голосов
/ 04 февраля 2012

У меня есть JTable в моем приложении. У меня есть настраиваемая настройка рендерера в таблице (JTextArea, с включенным переносом строк), которая позволяет многострочное содержимое. Предполагается, что в некоторых случаях содержимое ячеек JTable выходит за границы ячейки. Я хочу сделать следующее:

Вместо того чтобы заставлять пользователя перетаскивать границу строки для изменения размера ячейки, я хочу, чтобы пользователь мог дважды щелкнуть границу строки, поэтому при обнаружении этого я могу автоматически изменять высоту ячейки (высоту строка), чтобы показать все содержимое ячейки.

Мой вопрос: как лучше всего обнаружить двойной щелчок на границе строки? Я заставил это работать, настроив MouseListener на JTable с помощью метода mouseClicked, который выглядит следующим образом:

public class MouseButtonInputListener extends MouseInputAdapter
{
    private JTable fTable;

    public MouseButtonInputListener(JTable parentTable)
    {
       fTable = parentTable;
    } 

    @Override
    public void mouseClicked(MouseEvent e)
    {

        // Some pre-processing here...

        if(e.getClickCount() == 2 && 
           fTable.getCursor().getType() == Cursor.N_RESIZE_CURSOR)
        {
            // Auto-adjust row height to fit contents...            
        }

    }
}

Хотя это работает, я не очень доволен строкой:

fTable.getCursor().getType() == Cursor.N_RESIZE_CURSOR

Любые предложения о лучшем способе сделать это? Надежный ли это подход на всех платформах?

1 Ответ

2 голосов
/ 08 февраля 2012

После некоторых поисков в Интернете я обнаружил следующую страницу:

http://java.sun.com/products/jlf/ed2/book/HIG.Behavior.html

среди прочего, он определяет поведение курсора мыши при различных обстоятельствах.Согласно разделу «Обратная связь с указателем», курсор переключается между N_RESIZE_CURSOR и S_RESIZE_CURSOR в зависимости от того, находится ли верхняя или нижняя граница компонента, над которым находится указатель мыши.Интересно отметить, что на 2 из 3 платформ (Mac и Windows) эти курсоры абсолютно одинаковы.В любом случае из этого следует, что мой код должен иметь следующий вид:

@Override
public void mouseClicked(MouseEvent e)
{
    // Some pre-processing here. Determine row at mouse click location
    int cursorType = fTable.getCursor().getType();
    if(e.getClickCount == 2 && 
      (cursorType == Cursor.N_RESIZE_CURSOR || cursorType == CURSOR.S_RESIZE_CURSOR))
    {
        // Resize row appropriately.
    }
}

Это будет работать на всех платформах.Спасибо всем за комментарии и комментарии.

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