Изменить курсор размера заголовка JTable

Так что я знаю, что вы можете изменить курсор для заголовка jtable следующим образом:

jTable.getTableHeader().setCursor(MyClient.greenResizeHorizontal);

Как вы можете изменить горизонтальный курсор изменения размера между заголовками столбцов?

-РЕДАКТИРОВАТЬ-

За @MadProgrammer я пытался возиться с делегатом пользовательского интерфейса и смог изменить курсор так же, как и выше. До сих пор не знаю, как изменить часть изменения размера. Мысли кто-нибудь?

jtable.getTableHeader().setUI(new BasicTableHeaderUI(){
    JTableHeader header;

    public void installUI(JComponent c) {
        header = (JTableHeader) c;
        header.setCursor(MyClient.greenResizeHorizontal);

        super.installUI(c);
    }
});

1 ответ

Решение

К сожалению, нет "хорошего" способа изменить этот курсор.BasicTableHeaderUI использует курсор изменения размера по умолчанию и содержит закрытое статическое поле с именем "resizeCursor" для этого. Также Swing UIManager не предоставляет никаких свойств, которые позволили бы изменить курсор (см. http://thebadprogrammer.com/swing-uimanager-keys/).

Единственный способ, который я нашел, - изменить значение этого поля с помощью отражения (я использую курсор в виде руки, любой другой может быть здесь):

table.getTableHeader().setUI(new BasicTableHeaderUI(){
    public void installUI(JComponent c) {
        try {
            final Field f = getClass().getSuperclass().getDeclaredField("resizeCursor");
            f.setAccessible(true);
            f.set(null, Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
        } catch (ReflectiveOperationException | SecurityException | IllegalArgumentException e) {
            e.printStackTrace();
        }
        super.installUI(c);
    }
});

Но это глупо, и - поскольку он использует приватные вещи - он может перестать работать с любым обновлением Java, и - AFAIR - не будет работать, если jar с вашим приложением подписан ( https://docs.oracle.com/javase/tutorial/deployment/jar/signing.html).

Другие вопросы по тегам