Java Swing– 在JFrame最大化时,在上下文菜单上“移动”鼠标指针

Java Swing– 在JFrame最大化时,在上下文菜单上“移动”鼠标指针,第1张

概述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最大化时,在上下文菜单上“移动”鼠标指针所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1155915.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-01
下一篇 2022-06-01

发表评论

登录后才能评论

评论列表(0条)

保存