【问题标题】:Swing JMenu acting strangeSwing JMenu 行为怪异
【发布时间】:2013-08-28 15:01:28
【问题描述】:

我最近开始用swing(使用eclipse WindowBuilder)在java中制作一个类似扫雷的游戏,在应用程序中有一个普通的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。那么有什么办法可以解决这个问题吗?

【问题讨论】:

  • 能否展示JFrame的创建和设置代码?
  • 为了尽快获得更好的帮助,请发布SSCCE(而不是更多的“点点滴滴”)。顺便说一句,SSCCE 是否包含任何 AWT 组件?会不会涉及自定义渲染?
  • 我认为不相关,但最好将swing代码放在Event Dispatch Thread中,例如in this HelloWorldSwing
  • 您编辑的代码在我的 Mac 上运行良好;尝试重建您的项目。使用jfr.pack() 而不是setMinimumSize(),并听从Istao 的建议
  • 在 Debian 6 上运行良好。您是否尝试从命令行运行它,即不使用 Eclipse?

标签: java swing user-interface


【解决方案1】:

很遗憾,it's an java issue with Cinnamon。你无法避免它,除非你

  • 切换到 SWT(参见 Eclipse 本身,它工作正常),
  • 切换到另一个操作系统(他们不运行 Cinnamon),
  • 切换到另一个窗口管理器。
  • 可能(但不太可能)另一个 JVM 没有此问题(例如,另一个 OpenJDK 甚至 Oracle JVM 等)。

关键是(afaik)Java 应该区分在 linux 中运行的大量窗口管理器只识别其中的一些 - 在这个特定问题中不是 Cinnamon。

更可悲的是:问题似乎也出现在 Mate 上。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-05-25
    • 1970-01-01
    • 1970-01-01
    • 2012-07-26
    • 1970-01-01
    • 2021-06-01
    • 2019-11-03
    相关资源
    最近更新 更多