MDI型アプリを作る方法について先日書きました。
参考: MDI型のJavaアプリを作る JDesktopPaneとJInternalFrameがキモ
このようなアプリを作ったら、子画面の最大化や最小化、閉じる操作をしたいですよね。
でも、このままではそのような操作ができません。
そこで今回は、前回のコードに子画面の最大化、最小化、閉じるという機能を追加します。
子画面 (JInternalFrame)で最大化、最小化、閉じる
JInternalFrameで子画面を作って、あるプロパティを設定するだけで「最大化」、「最小化」、「閉じる」機能を追加できます。
それらの機能を追加するとこんな感じになります。
Frame1は「最大化」「最小化」「閉じる」機能をONにしています。
これらはそれぞれ任意にON/OFFができます。
この例では、Frame1は全部ONです。
ボタンに色がついていますよね。
Frame2は同機能をOFFにしています。
もうちょっというと、何も設定していません。
ボタンに色がついていないです。
押しても何も起こりません。
「最大化」「最小化」「閉じる」操作をする
では、Frame1で「最大化」「最小化」「閉じる」操作をしてみましょう。
左上のこのボタンから操作します。
Macの場合は、左から「閉じる」「最小化」「最大化」ですね。
子画面の「最大化」
まずは右のボタン「最大化」を押すと・・・
こんな感じで、親画面いっぱいに広がります。
子画面の「最小化」
続いて真ん中のボタン「最小化」を押すと・・・
下の方に格納されましたね。
「最小化」というか、「アイコン化」ですね。
子画面を「閉じる」
一番左のボタン「閉じる」を押すと・・・
子画面はなくなっちゃいました。
こんな機能を実装します。
子画面に「最大化」「最小化」「閉じる」機能を追加
早速ソースコードを見て行きましょう。
ほぼ前回のままです。
違うのは52〜54行目。
package jp.beourselves.open.sample.jdesktop; import java.awt.BorderLayout; import java.awt.EventQueue; import javax.swing.JDesktopPane; import javax.swing.JFrame; import javax.swing.JInternalFrame; import javax.swing.JLabel; import javax.swing.SwingConstants; public class JDesktopPaneSample2 { private JFrame frmMdi; /** * Launch the application. */ public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { public void run() { try { JDesktopPaneSample2 window = new JDesktopPaneSample2(); window.frmMdi.setVisible(true); } catch (Exception e) { e.printStackTrace(); } } }); } /** * Create the application. */ public JDesktopPaneSample2() { initialize(); } /** * Initialize the contents of the frame. */ private void initialize() { frmMdi = new JFrame(); frmMdi.setTitle("MDI型アプリ サンプル"); frmMdi.setBounds(100, 100, 450, 400); frmMdi.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); JDesktopPane desktopPane = new JDesktopPane(); frmMdi.getContentPane().add(desktopPane, BorderLayout.CENTER); JInternalFrame frame1 = new JInternalFrame("Frame1"); frame1.setMaximizable(true); frame1.setIconifiable(true); frame1.setClosable(true); frame1.setBounds(0, 0, 200, 300); desktopPane.add(frame1); JLabel lblHelloJdesktoppane = new JLabel("Hello, JDesktopPane!"); lblHelloJdesktoppane.setHorizontalAlignment(SwingConstants.CENTER); frame1.getContentPane().add(lblHelloJdesktoppane, BorderLayout.CENTER); JInternalFrame frame2 = new JInternalFrame("Frame2"); frame2.setBounds(200, 0, 200, 200); desktopPane.add(frame2); JLabel lblHelloJinternalframe = new JLabel("Hello, JInternalFrame"); lblHelloJinternalframe.setHorizontalAlignment(SwingConstants.CENTER); frame2.getContentPane().add(lblHelloJinternalframe, BorderLayout.CENTER); frame2.setVisible(true); frame1.setVisible(true); } }
こんなコードがありますね (52〜54行目)
frame1.setMaximizable(true); frame1.setIconifiable(true); frame1.setClosable(true);
それぞれ、frame1に対してプロパティをセットしています。
最大化: setMaximizable(true)
「最大化」の機能を追加するなら、
setMaximizable(true)
を設定します。
これだけ。
最小化: setIconifiable(true)
「最小化」の機能を追加するなら、
setIconifiable(true)
を設定します。
閉じる: setClosable(true)
「閉じる」機能を追加するなら、
setClosable(true)
を設定します。
以上です。
おわりに
それぞれプロパティをセットするだけです。
何もしなければ、設定しなかった機能が作動しないだけ。
「最大化」「最小化」「閉じる」機能を追加するのは、超簡単でしたね!
ちなみに、JFrameを作るときにコンストラクタで指定することもできます。
JInternalFrame frame1 = new JInternalFrame("Frame1", true, true, true, true, true);
と、引数にそれぞれ
- 「子画面のタイトル」
- 「子画面のサイズ変更を許可」
- 「閉じることができる」
- 「最大化できる」
- 「最小化できる」
という指定をします。
これでtrueじゃなくてfalseを設定すると、その機能が使えなくなります。
さて、次回は「閉じる」ときに何かしらの処理をするようにしてみましょう。
元大手電機メーカのシステムエンジニア。
詳しくはこのサイトについての「サイト管理者について」をご覧ください。