当我将鼠标悬停在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
容器。在这种情况下,当我将鼠标悬停在分隔线上时,光标保持不变。
下面是我写的一些测试代码,用于模拟上述场景。
案例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);
}
}
输出:按预期工作。的IntelliJ插件
注:分频器
案例02上方盘旋当光标变为这是一个的IntelliJ插件项目,其中toolWindow
扩展在plugin.xml文件中指定。在IDE中打开工具窗口时,基本上会执行createToolWindowContent
方法。视图和任何进一步的用户交互都在这里处理。
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'方法,但当顶层容器不是JFrame或JWindow时,'setCursor'方法似乎不起作用。 – fsociety
不知道你从Win7发布的问题,为了更好的帮助,尽快发布一个SSCCE/MCVE,因为通过从mouseExited调用Cursor.DEFAULT_CURSOR所有游标(在Win10中,Java8)正确绘制(DEFAULT_CURSOR对于所有Rectangle in ContentPane,如果我是hover_over它的边界,它会更改为E_RESIZE_CURSOR),但对于您的问题真的不知道,因为这种funcionality在WInXP/Win7,Win8和WIn10中工作得相当正确 – mKorbel
您发布的代码正常工作。问题出在我的intellij工具窗口插件上。出于某种原因,当我将具有'JSplitPane'的'JPanel'添加到'ToolWindow'容器时'setCursor'方法不起作用。我想出了一个让它工作的方法。看到我的答案 – fsociety