Swing JMenu表现异常

3
我最近开始使用Java和Swing(使用Eclipse WindowBuilder)制作了一个类似扫雷的游戏,并在应用程序中有一个普通的JFrame,其中包含一个选项卡式的JMenu。它一切正常,直到调整窗口大小。然后,当我单击菜单以显示它时,它只会显示到我释放鼠标按钮为止,然后它就会消失,就好像我单击了其他地方一样。但是当我使用键盘快捷键访问菜单时,它可以正常工作。有人知道问题可能出在哪里吗?
菜单代码:
    JMenu mnHelp = new JMenu( "Help" );
    mnHelp.setMnemonic( 'h' );
    menuBar.add( mnHelp );

    JMenuItem mntmControls = new JMenuItem( "Controls" );
    mntmControls.setMnemonic( 'c' );
    mntmControls.setIcon( new ImageIcon( Main.class
            .getResource( "/org/img/menu-help.png" ) ) );
    mnHelp.add( mntmControls );

    JSeparator separator_1 = new JSeparator();
    mnHelp.add( separator_1 );

    JMenuItem mntmAbout = new JMenuItem( "About" );
    mntmAbout.setMnemonic( 'g' );
    mntmAbout.setIcon( new ImageIcon( Main.class
            .getResource( "/org/img/menu-about.png" ) ) );
    mnHelp.add( mntmAbout );

编辑:

我进行了一些实验,结果发现这不是由我的程序引起的问题,而是由Java或Eclipse引起的,因为即使像下面我要粘贴代码的那样简单的程序也有同样的问题:

`

package testpack;

import java.awt.Dimension;
import javax.swing.*;

public class Main {

    public static void main( String[] args ) {
        JFrame jfr = new JFrame( "" );
        jfr.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
        JMenuBar jmb = new JMenuBar();
        JMenu jm = new JMenu( "Hello" );
        JMenuItem jmi = new JMenuItem( "Hi" );
        jm.add( jmi );
        jmb.add( jm );
        jfr.setJMenuBar( jmb );
        jfr.setMinimumSize( new Dimension( 400, 400 ) );
        jfr.setVisible( true );
    }
}

我使用的是Mint Cinnamon 13和Eclipse 4.2。那么我能做些什么来解决这个问题吗?

1
为了更快地获得更好的帮助,请发布一个[SSCCE](http://sscce.org/)(而不是更多的“碎片”)。另外,那个SSCCE是否包括任何AWT组件?它会涉及自定义渲染吗? - Andrew Thompson
3
我认为这与此无关,但最好将摆动代码放在事件分派线程中,例如在此HelloWorldSwing示例中 - Istao
是的,我知道,在原始程序中我已经这样做了。 - Zvonimir
1
你编辑过的代码在我的 Mac 上运行良好;尝试重新构建你的项目。使用 jfr.pack() 替代 setMinimumSize(),并遵循 Istao 的建议。 - trashgod
1
在Debian 6上运行良好。你尝试过从命令行运行它吗,也就是不使用Eclipse吗? - tobias_k
显示剩余2条评论
1个回答

0

很遗憾,这是一个与Cinnamon有关的Java问题。除非你

  • 切换到SWT(参见Eclipse本身,它可以正常工作),
  • 切换到另一个操作系统(它们不运行Cinnamon),
  • 切换到另一个窗口管理器。
  • 虽然不太可能,但可能是另一个JVM没有这个问题(例如另一个OpenJDK或甚至Oracle JVM或类似产品)。

问题在于(据我所知)Java应该区分在Linux上运行的许多窗口管理器,但只识别其中一些 - 在这个特定问题中不包括Cinnamon。

更令人沮丧的是:这个问题似乎也出现在Mate上。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接