點我執行範例程式

一般人寫 java 程式不是 frame(application) 就是 applet,兩者總是分開撰寫。其實 JFrame 跟 JApplet 兩者是很相似的。都包含一個 JRootPane,也都是把元件加到 contentPane 裏。所以就可以利用這個特性,做一個 class Main extends JPanel,另外再做一個 class Loader extends JApplet,包含 void main(String[] args)。當透過 java.exe 執行時,就會執行 main 函數;當透過 appletviewer.exe 或 browser 執行時,就會執行 Loader 函數。這樣一來就可以做出可以同時以 applet 及 frame(application) 執行的 JAR。

  1. 製作 JMenuBar,可以使用 JFrame 及 JApplet 的 setJMenuBar,但是 Main Class 必須做一個函數回傳 JMenuBar。也可以直接把 JMenuBar 做在 Loader Class 裏面。或是直接把 JMenuBar 放到 Main Class 裏,但這樣就會跟 JToolBar 共用到同一個位置,比較不好。
  2. 卻得知目前是在 JApplet 亦或是 JFrame,可以利用 JFrame.class == rootPane.getParent().getClass() 判斷。
  3. SwingUtilities.updateComponentTreeUI 可以直接針對 JApplet 及 JFrame 的 JRootPane 執行即可,當然也可以利用 JRootPane.getParent() 取得 JApplet 或 JFrame 來執行。
  4. dispatchEvent 不可以由 JPanel 發送給 JFrame,也就是在 Main Class 裏 JOptionPane.getRootFrame().dispatchEvent(new WindowEvent(JOptionPane.getRootFrame(), WindowEvent.WINDOW_CLOSING)); 有反應,但是 this.dispatchEvent(new WindowEvent(JOptionPane.getRootFrame(), WindowEvent.WINDOW_CLOSING)); 沒作用,原因不明。
  5. 在 JApplet 是不可以 dispatchEvent WindowEvent,因為 browser 才是最外層的 Window。

import java.awt.EventQueue; @SuppressWarnings("serial") public class Loader extends JApplet { /** * Launch the application. */ public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { public void run() { try { JFrame frame = new JFrame(); JOptionPane.setRootFrame(frame); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setContentPane(new Main()); frame.pack(); frame.setVisible(true); } catch (Exception e) { e.printStackTrace(); } } }); } /** * Create the applet. */ public Loader() { this.setContentPane(new Main()); } } import javax.swing.JPanel; import javax.swing.JButton; import java.awt.BorderLayout; import java.awt.Dimension; @SuppressWarnings("serial") public class Main extends JPanel { /** * Create the panel. */ public Main() { setLayout(new BorderLayout(0, 0)); setPreferredSize(new Dimension(400, 300)); JButton button = new JButton("New button"); add(button, BorderLayout.CENTER); } }

台南小新 發表在 痞客邦 PIXNET 留言(0) 人氣()