概述Java Swing – 在JFrame最大化时,在上下文菜单上“移动”鼠标指针
在最大化JFrame时,我遇到了Swing处理鼠标位置的奇怪行为:
当我执行这个非常简单的代码…
public class Test { public static voID main(String[] args) { SwingUtilitIEs.invokelater(new Runnable() { @OverrIDe public voID run() { JFrame frame = new JFrame(); JMenubar menubar = new JMenubar(); JMenu menu = new JMenu(\”file\”); menu.add(new JMenuItem(\”New\”)); menubar.add(menu); frame.setJMenubar(menubar); frame.setSize(200,200); frame.setLocationrelativeTo(null); frame.setVisible(true); } }); } }
…我通常可以点击file (第一次点击 – 按,释放) – > New (第二次点击)。 但是,当我最大化JFrame,并点击file – 上下文菜单立即消失在鼠标释放。 此外,当我按住鼠标button – 以防止失踪 – 我必须进一步移动鼠标以专注于New项目。
更改java符号链接
unix“哪个java”在windows上的等效命令?
用于可执行JAR的C ++ GUI
Java平台中的哪些Java文件在windows和Mac中有所不同?
从Java Applet获取windows Service Pack版本?
红点表示区域(或多或less),在按下file并按住鼠标button之后,必须将鼠标移动到New位置。
在使用“右键单击上下文菜单”时,例如右键单击JFreeChart的图表时,我观察到了相同的行为。
我认为这是JDK的问题,因为我使用Oracle的JDK,但安装OpenJDK后,我有相同的结果。
有人观察到这种奇怪的行为吗? 还是我错过了明显的东西?
我用:
1.7.0_147-icedtea(或java-7-oracle的1.7.0_04)
OpenJDK运行环境(IcedTea7 2.0)(7〜b147-2.0-0ubuntu0.11.10.1)
OpenJDK 64位服务器虚拟机(构build21.0-b17,混合模式)
linux Mint 12(lisa)GNOME 3.2.1
Oracle JDK 8未安装。Subprocess安装的安装后脚本返回了错误退出状态1
当试图安装Matlab编译器运行时JRE错误
从CGI脚本调用Java程序失败
无法安装JDK 7
如何在windows中进行SNMP查询?
是的 – 这是JDK7中的错误,如@nIcE cOw所述。
我已经安装了JDK6,我无法重现此错误。
java version \”1.6.0_23\” OpenJDK Runtime Environment (IcedTea6 1.11pre) (6b23~pre11-0ubuntu1.11.10.2) OpenJDK 64-Bit server VM (build 20.0-b11,mixed mode)
当需要使用Oracle Java 7时(例如使用JavaFX时),也有一个解决方法。 只需将以下代码行添加到您的窗口/框架类:
if (Arrays.asList(\”gnome-shell\”,\”mate\”,\”other…\”).contains(System.getenv(\”DESKtop_SESSION\”))) { try { Class<?> xwm = Class.forname(\”sun.awt.X11.XWM\”); FIEld awt_wmgr = xwm.getDeclaredFIEld(\”awt_wmgr\”); awt_wmgr.setAccessible(true); FIEld other_wm = xwm.getDeclaredFIEld(\”OTHER_WM\”); other_wm.setAccessible(true); if (awt_wmgr.get(null).equals(other_wm.get(null))) { FIEld Metacity_wm = xwm.getDeclaredFIEld(\”MetaCITY_WM\”); Metacity_wm.setAccessible(true); awt_wmgr.set(null,Metacity_wm.get(null)); } } catch (Exception x) { x.printstacktrace(); } }
此代码片段基于Netbeans开发人员的解决方法 。
我想补充problemzebra给出的解决方案。
因为在linux上(使用Cinnamon桌面)任何swing应用程序仍然会发生,即使在Java 6(更新45)
每次移动窗口或重新调整窗口大小时,都会重新出现问题,因此每次窗口更改时都需要重新应用解决方法。 我创建了以下类,并在创建新窗口时使用它:
class linuxWindowFix implements windowstateListner { private final String desktop; private FIEld Metacity_wm; private FIEld awt_wmgr; private boolean applyFix; private static linuxWindowFix instance = new linuxWindowFix(); public static linuxWindowFix getInstance() { return instance; } private linuxWindowFix() { applyFix = false; List<String> linuxDesktops = Arrays.asList(\”gnome-shell\”,\”cinnamon\”); //add more desktop names here. desktop = System.getenv(\”DESKtop_SESSION\”); if (desktop != null && linuxDesktops.contains(desktop.tolowerCase())) { try { Class<?> xwm = Class.forname(\”sun.awt.X11.XWM\”); awt_wmgr = xwm.getDeclaredFIEld(\”awt_wmgr\”); awt_wmgr.setAccessible(true); FIEld other_wm = xwm.getDeclaredFIEld(\”OTHER_WM\”); other_wm.setAccessible(true); if (awt_wmgr.get(null).equals(other_wm.get(null))) { Metacity_wm = xwm.getDeclaredFIEld(\”MetaCITY_WM\”); Metacity_wm.setAccessible(true); applyFix = true; } } catch (Exception ex) { //ignore } } } @OverrIDe public voID windowstateChanged(WindowEvent e) { try { awt_wmgr.set(null,Metacity_wm.get(null)); } catch (Exception ex) { //ignore } } public voID apply(Window w) { if (!applyFix) { return; } w.removewindowstateListner(this); w.addwindowstateListner(this); } }
只需在创建的每个窗口中调用它,它就会按预期工作。
linuxWindowFix.getInstance().apply(myWindow);
总结
以上是内存溢出为你收集整理的Java Swing – 在JFrame最大化时,在上下文菜单上“移动”鼠标指针全部内容,希望文章能够帮你解决Java Swing – 在JFrame最大化时,在上下文菜单上“移动”鼠标指针所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
请登录后查看评论内容