【问题标题】:Adding JApplet into JFrame将小程序添加到 JFrame
【发布时间】:2011-08-25 17:57:39
【问题描述】:

我正在尝试在 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);
}

小程序出现在窗口中,但没有背景(它是透明的),当我单击菜单时,列表被覆盖。如何使菜单列表不被覆盖,并且有背景?

编辑:当我绘制一个白色矩形时,它修复了背景问题,但菜单列表仍然被覆盖。

【问题讨论】:

  • 你为什么要这样做?你想解决什么问题?
  • 只是为了方便(我不想从 appletviewer 或网络浏览器启动)。
  • 我不知道您的确切要求,但对我来说听起来不太方便。我认为小程序通常不是今天要走的路。您可以查看 JavaFX 或 JNLP 以获取替代方案。 javafx.comen.wikipedia.org/wiki/Java_Web_Start
  • 这里发生了许多错误。 JApplet 是一个根容器,因此我相信它是一个重量级容器,不会与您的轻量级容器(例如包含 JPanel)搭配得很好。为什么不装备你的 GUI 来创建 JPanel,然后如果你想将它们作为一个小程序在 JApplet 中使用它们,或者如果你希望它们在一个独立的情况下在 JFrame 中使用它们?
  • faq 中所述,请接受和/或投票给您认为有用的答案。

标签: java swing jframe japplet


【解决方案1】:

我会将我的 GUI 创建用于制作 JPanel,然后在 JApplet 或 JFrame 中根据需要使用 JPanel。例如,

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,让面板创建菜单栏的有趣方法。不要忘记在小程序上设置菜单栏。
  • @camickr,谢谢。如果我没有重写 JPanel 方法,有时我会以相同的方式获取 JPanel,并且让主类不扩展任何内容——所有这些都是以组合优于继承的名义。但在实际方面,它在我的 IDE 中编码时会有所帮助,因为它只会显示我为类创建的方法,而不是 JPanel 的所有方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-28
  • 2013-08-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多