當我將鼠標懸停在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