【问题标题】:JMenu appearing behind JFrameJMenu 出现在 JFrame 后面
【发布时间】:2015-03-30 08:08:46
【问题描述】:

我正在 Eclipse IDE 中制作 Java Applet。我有一个 JMenu 和一个 JFrame。出于某种原因,菜单出现在 JFrame 后面..

像这样:

这里是它的名字:

public Main() throws Exception{

    JFrame i = new JFrame("My Applet");
    JLabel label = new JLabel();

    ImageIcon icon = new ImageIcon(new URL(
               "loader.gif"));
    icon.setImageObserver(null);
    label.setIcon(icon);
    i.setBackground(Color.BLACK);


    JMenuBar menuBar = new JMenuBar();

    i.setJMenuBar(menuBar);

    JMenu accountMenu = new JMenu("Account");
    JMenu toolsMenu = new JMenu("Tools");
    JMenu optionsMenu = new JMenu("Options");

    menuBar.add(accountMenu);
    menuBar.add(toolsMenu);
    menuBar.add(optionsMenu);

    JMenuItem accountdetAction = new JMenuItem("Account Details");
    JMenuItem exitAction = new JMenuItem("Exit");

    accountMenu.add(accountdetAction);


    optionsMenu.addSeparator();
    optionsMenu.add(exitAction);

    ButtonGroup bg = new ButtonGroup();

    accountdetAction.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent arg0) {
            System.out.println("test");
        }
    });

    i.add(label);
    i.pack();
    i.setVisible(true);


    String str = getPageSource(new URL("my url link goes here"));
    Pattern pattern = Pattern.compile("gamep\\w+");
    Matcher match = pattern.matcher(str);
    if (match.find()){
         Main stub = new Main(Pattern.compile("<param name=\"([^\\s]+)\"\\s+value=\"([^>]*)\">"), str);
         Download("my url link goes here", match.group(0)+ "jar");
         stub.setCodeBase(new URL("my url link goes here" + match.group(0)+ ".jar"));
         stub.setDocumentBase(new URL("my url link goes here" + match.group(0)+ "jar"));
         stub.getParameter (parameters.get("java_arguments"));
         URLClassLoader classLoader = new URLClassLoader(new URL[]{ new URL("file:thejar.jar")});
         Applet applet = (Applet) classLoader.loadClass ("client").newInstance();
         applet.setStub(stub);
         applet.setPreferredSize(new Dimension(1000, 500));
         applet.init();
         applet.start();

         i.setJMenuBar(menuBar);


         i.add(applet);
         i.pack();
         i.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
         label.setVisible(false);


    }
}

我也尝试在 if 语句中调用菜单,但不起作用。有没有办法强制它在上面?我听说使用 JPanel 可以工作,但我不知道如何工作...

提前感谢您的任何建议:)

【问题讨论】:

  • 不是您的问题的答案,只是附注:您确定要使用小程序吗?这项技术“几乎死了”。在 2015 年仍然使用小程序的唯一原因 - 如果您的项目已经在使用它们;并且没有办法避免它们。在任何其他情况下......忘记它们。
  • 那我应该用什么? Java Applet 和 Application 有很大区别吗?
  • 小程序的主要目的是启用“Web 浏览器中的 Java 应用程序”。如果您的唯一目的是创建一个具有图形用户前端的 Java 应用程序;然后就去买一个 JFrame(见这里docs.oracle.com/javase/tutorial/uiswing/components/frame.html)。小程序和“普通”应用程序之间的主要区别只是可以在浏览器中运行小程序这一事实。如果你不需要它,你就不需要小程序。
  • 我已经在使用 JFrame - 请参阅我的代码。但它把我的 JMenu 推到了后面。 编辑:我不在乎它是否在浏览器中运行。这只是一个教育项目。

标签: java eclipse applet jframe jmenu


【解决方案1】:

举个例子,你可以试试这个

import javax.swing.JApplet;
import javax.swing.JFrame;
import javax.swing.JMenuBar;
import javax.swing.JMenu;
import javax.swing.JMenuItem;

import java.awt.Graphics;

public final class PullingAppletExample{
    private JFrame mainWindow = null;   
    private JMenuBar menuContainer = null;
    private JMenu    menu1 = null; 
    private JMenu    menu2 = null;
    private JMenuItem mnuItem1 = null;
    private JMenuItem mnuItem2 = null;
    private JMenuItem mnuItem3 = null;
    private JMenuItem mnuItem4 = null;

    public PullingAppletExample(){

        menu1 = new JMenu("Menu #1");
        menu2 = new JMenu("Menu #2");
        mnuItem1 = new JMenuItem("Item #1");
        mnuItem2 = new JMenuItem("Item #2");
        mnuItem3 = new JMenuItem("Item #3");
        mnuItem4 = new JMenuItem("Item #4");

        menu1.add(mnuItem1);
        menu1.add(mnuItem2);
        menu1.add(mnuItem3);

        menu2.add(mnuItem4);

        menuContainer = new JMenuBar();
        menuContainer.add(menu1);
        menuContainer.add(menu2);

        mainWindow = new JFrame();
        mainWindow.setTitle("Applet Inside JFrame");
        mainWindow.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        mainWindow.setBounds(100,100,500,500);
        mainWindow.setJMenuBar(menuContainer);
        mainWindow.setVisible(true);
        mainWindow.setContentPane(new CustomApplet());

    }
    private class CustomApplet extends JApplet{
        @Override
        public void init(){
            repaint();
        }
        @Override
        public void paint(Graphics g){
            g.drawString("Hello World",100,50);
        }
    }

    public static void main(String[] args) {
        new PullingAppletExample();
    }
}

【讨论】:

  • 您的 setContentPane 解决方案效果很好!谢谢大家!
【解决方案2】:

我认为这不是一个好的实现。为什么要在 JFrame 中添加一个小程序?可能 JavaFX 会是一个更好的解决方案。 :)

【讨论】:

  • 我正在从网上提取一个小程序。
  • 所以,你想显示小程序。好的。试试 i.setContentPane(applet);而不是 i.add(applet);在你的代码中:)
  • 我认为你的代码中真正的问题是,因为 Applet 是一个重量级容器,而 JMenu 是一个轻量级的摇摆容器,重量级容器在轻量级容器之上渲染。试试我刚才说的,让我知道。 :)
猜你喜欢
  • 1970-01-01
  • 2012-09-14
  • 1970-01-01
  • 1970-01-01
  • 2014-06-21
  • 1970-01-01
  • 2012-07-20
  • 2013-07-30
  • 1970-01-01
相关资源
最近更新 更多