2011-05-15 141 views
4

我正在尝试查看JFrame中的JApplet。将JApplet添加到JFrame中

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); 
} 

小程序显示了在窗口,但没有背景(它是透明的),当我点击菜单,列表被覆盖。我该如何做到这一点,以便菜单列表不被覆盖,并且有背景?

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

+0

你为什么要这么做?你想解决什么问题? – 2011-05-15 02:26:48

+0

只是为了方便(我不想从appletviewer或web浏览器启动)。 – LanguagesNamedAfterCofee 2011-05-15 02:33:40

+0

我不知道你的具体要求,但这听起来不太方便。我认为小程序通常不是今天的方式。您可以查看JavaFX或JNLP的替代方案。 http://javafx.com/ http://en.wikipedia.org/wiki/Java_Web_Start – 2011-05-15 02:36:28

回答

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; 
    } 
} 

然后在一个applet使用:

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,让专家组创建菜单栏的有趣方法。不要忘记在applet上设置菜单栏。 – camickr 2011-05-15 03:17:04

+0

@camickr,谢谢。如果我不覆盖JPanel方法,我有时会以相同的方式获得JPanel,并且主类不会扩展 - 全部以组合名义继承。但从实用的角度来看,它有助于在我的IDE中进行编码,因为它只会展示我为该类制作的方法,而不是JPanel的所有方法。 – 2011-05-15 03:21:36

+1

+1您也可以[双方](https://sites.google.com/site/drjohnbmatthews/subway)。 – trashgod 2011-05-15 06:42:38