2011-05-15 155 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