Мне нужно, чтобы мой курсор менялся, когда я наводил указатель на делитель JSplitPane
. Это чисто для удобства использования. Я обнаружил два метода для этого. Код показано нижеИзмените курсор при зависании над разделителем JSplitPane
Метод 01
BasicSplitPaneUI basicSplitPaneUI = (BasicSplitPaneUI)splitPane.getUI();
BasicSplitPaneDivider divider = basicSplitPaneUI.getDivider();
divider.setCursor(new Cursor(Cursor.E_RESIZE_CURSOR));
Метод 02
Component divider = splitPane.getComponent(2);
divider.setCursor(new Cursor(Cursor.E_RESIZE_CURSOR));
Моя проблема в том, как эти методы работают как ожидается, если верхний контейнер из JSplitPane
является JFrame
или JWindow
. Чтобы проверить, я написал небольшой фрагмент кода, где JSplitPane
добавлен к JPanel
, который затем добавляется к JFrame
. Курсор изменяется, как ожидается, при зависании над разделителем.
Но я занимаюсь разработкой Tool Window
плагин для IntelliJ и там, JSplitPane
(содержится в JPanel
) добавляют к ToolWindow
контейнера. В этом случае курсор остается тем же, когда я навешиваю над разделителем.
Ниже приведен некоторый тестовый код, который я написал для имитации вышеуказанных сценариев.
Case 01
public class Main {
public static void main(String args[]){
JFrame f = new JFrame();
f.setLayout(new BorderLayout());
//PanelWithSplitPane extends JPanel. Builds the JSplitPane
PanelWithSplitPane viewer = new PanelWithSplitPane();
f.add(viewer, BorderLayout.CENTER);
f.pack();
f.setVisible(true);
}
}
Выход: Работает, как ожидалось. Курсор меняется, когда завис над разделителем
Case 02: Intellij плагин
Примечание: Это проект IntelliJ плагин, где расширение toolWindow
задается в файле plugin.xml. В основном метод createToolWindowContent
выполняется, когда окно инструмента открывается в среде IDE. Отсюда и просмотр и любое последующее взаимодействие с пользователем.
public class TestPane implements ToolWindowFactory {
//this method gets called when the toolWindow is opened in the IDE
@Override
public void createToolWindowContent(Project project, ToolWindow toolWindow) {
PanelWithSplitPane viewer = new PanelWithSplitPane();
toolWindow.getComponent().add(panel);
}
}
выход: не работает должным образом.Курсор остается тем же самым, когда завис над разделителем
код PanelWithSplitPane
public class PanelWithSplitPane extends JPanel {
public PanelWithSplitPane() {
this.setLayout(new BorderLayout());
JSplitPane splitPane = new javax.swing.JSplitPane();
splitPane.setBorder(null);
splitPane.setDividerLocation(1300);
splitPane.setDividerSize(6);
splitPane.setContinuousLayout(true);
splitPane.setOneTouchExpandable(true);
BasicSplitPaneUI basicSplitPaneUI = (BasicSplitPaneUI)splitPane.getUI();
BasicSplitPaneDivider divider = basicSplitPaneUI.getDivider();
divider.setCursor(new Cursor(Cursor.HAND_CURSOR));
this.add(splitPane);
}
}
Спасибо за ваш ответ. Но это тоже не работает. Оба метода «mouseEntered» и «mouseExited» вызываются правильно, но метод 'setCursor', похоже, не работает, когда контейнер верхнего уровня не является JFrame или JWindow. – fsociety
не знаю о вашей проблеме из Win7, для лучшей помощи скорее опубликуйте SSCCE/MCVE, короткий, исполняемый, скомпилируемый, потому что, вызывая Cursor.DEFAULT_CURSOR из mouseExited, все курсоры (в Win10, Java8) правильно окрашены (DEFAULT_CURSOR для всех Rectangle in ContentPane, и он изменяется на E_RESIZE_CURSOR, если я нахожусь на его границах), на самом деле не знаю о вашей проблеме, потому что эта функциональность работает в WInXP/Win7, Win8 и WIn10 совершенно правильно – mKorbel
Код, который вы публикуете, отлично работает. Проблема заключается в моем плагине окна intellij. По какой-то причине метод 'setCursor' не работает, когда я добавляю' JPanel' с 'JSplitPane' в контейнер' ToolWindow'. Я понял, как заставить его работать. см. мой ответ – fsociety