将小程序添加到 JFrame

Posted

技术标签:

【中文标题】将小程序添加到 JFrame【英文标题】:Adding JApplet into 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 中所述,请接受和/或投票给您认为有用的答案。 【参考方案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 的所有方法。

以上是关于将小程序添加到 JFrame的主要内容,如果未能解决你的问题,请参考以下文章

更改通知提供程序以将小部件添加到收藏屏幕

将小部件名称与小部件一起添加到主屏幕

在颤动中动态地将小部件添加到列的子项

无法将小部件 ID 传递给配置活动

无法将小程序(.cap 文件)下载到智能卡中:SW 6D 00(无效指令)

如何有条件地将小部件添加到列表中?