将JApplet添加到JFrame中

5

我正在尝试在JFrame中查看一个JApplet。

Class: Paint
public void paint(Graphics g) {
  g.drawString("hi", 50, 50);
}

public static void main(String args[]) {
  JFrame frame = new JFrame("test");
  frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  frame.setJMenuBar(methodThatReturnsJMenuBar());

  JPanel panel = new JPanel(new BorderLayout());
  frame.add(panel);

  JApplet applet = new Paint();
  panel.add(applet, BorderLayout.CENTER);
  applet.init();
  frame.pack();

  frame.setVisible(true);
}

该小程序在窗口中显示,但没有背景(透明),当我点击菜单时,列表被覆盖。如何使菜单列表不被覆盖,并有一个背景?
编辑:当我绘制一个白色矩形时,它解决了背景问题,但是菜单列表仍然被覆盖。

你为什么要这样做?你试图解决什么问题? - Greg Mattes
只是为了方便起见(我不想从appletviewer或者web浏览器中启动)。 - LanguagesNamedAfterCofee
我不知道你的具体要求,但对我来说这听起来并不是特别方便。我认为小程序通常不是今天的首选。你可以考虑JavaFX或JNLP作为替代方案。http://javafx.com/http://en.wikipedia.org/wiki/Java_Web_Start - Greg Mattes
3
这里出现了很多问题。JApplet是一个根容器,因此我认为它是重量级容器,不会与轻量级容器(如包含JPanel的容器)很好地协同工作。如果你想将GUI设计为applet,为什么不创建JPanels并在JApplet中使用它们,或者如果你想要独立的应用程序,则在JFrame中使用它们呢? - Hovercraft Full Of Eels
1
请根据常见问题解答中提到的,接受并/或投票支持您认为有用的答案。 - trashgod
1个回答

6
我会将GUI的创建集中在制作JPanel上,然后根据需要使用该JPanel,在JApplet或JFrame中进行。例如:
import java.awt.*;
import javax.swing.*;

public class MyPanel extends JPanel {
   private static final Dimension PREF_SIZE = new Dimension(400, 300);

   @Override
   protected void paintComponent(Graphics g) {
      super.paintComponent(g);
      g.drawString("hi", 50, 50);
   }

   @Override
   public Dimension getPreferredSize() {
      return PREF_SIZE;
   }

   public JMenuBar methodThatReturnsJMenuBar() {
      JMenu menu = new JMenu("Menu");
      JMenuBar menuBar = new JMenuBar();
      menuBar.add(menu);
      return menuBar;
   }
}

然后在小程序中使用:

import javax.swing.JApplet;

public class MyApplet extends JApplet {
   public void init() {
      try {
         javax.swing.SwingUtilities.invokeAndWait(new Runnable() {
            public void run() {
               createGUI();
            }
         });
      } catch (Exception e) {
         System.err.println("createGUI didn't successfully complete");
      }
   }

   private void createGUI() {
      getContentPane().add(new MyPanel());
   }
}

或者在JFrame中:

import javax.swing.JFrame;

public class MyStandAlone {
   private static void createAndShowUI() {
      MyPanel myPanel = new MyPanel();
      JFrame frame = new JFrame("MyPanel");
      frame.getContentPane().add(myPanel);
      frame.setJMenuBar(myPanel.methodThatReturnsJMenuBar());
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.pack();
      frame.setLocationRelativeTo(null);
      frame.setVisible(true);
   }

   public static void main(String[] args) {
      java.awt.EventQueue.invokeLater(new Runnable() {
         public void run() {
            createAndShowUI();
         }
      });
   }
}

1
+1,有趣的方法是让面板创建菜单栏。别忘了在小程序上设置菜单栏。 - camickr
@camickr,谢谢。如果我没有覆盖JPanel方法,有时我会以相同的方式获取JPanel,并使主类不扩展任何内容——这就是组合优于继承的原因。但从实际角度来看,在我的IDE中编码时,它有所帮助,因为它只会呈现我为该类创建的方法,而不是JPanel的所有方法。 - Hovercraft Full Of Eels

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