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を設定すると、その機能が使えなくなります。
さて、次回は「閉じる」ときに何かしらの処理をするようにしてみましょう。
元大手電機メーカのシステムエンジニア。
詳しくはこのサイトについての「サイト管理者について」をご覧ください。
