トップ 新規 編集 差分 一覧 ソース 検索 ヘルプ PDF RSS ログイン

Swingの基本:GUI部品のイベント処理(ウィンドウ)

 ウィンドウイベントの処理

ウィンドウの移動やリサイズなどはJFrame自体にComponentListenerを付与する形でその中のcomponentMovedやcomponentResizedメソッドにイベント処理を記述していく。また、フォーカスの取得や消失はWindowFocusListenerで、起動、最小化、終了時イベントはWindowListenerとして実装する。最小化はWindowListenerで記述するが、最大化はComponentReisezedで記述していくようである。

WindowEventの例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
package sample.swing.event;

import java.awt.GridLayout;
import java.awt.event.ComponentAdapter;
import java.awt.event.ComponentEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

import javax.swing.JFrame;
import javax.swing.JLabel;

@SuppressWarnings("serial")
public class WindowEventSample extends JFrame {
    JLabel positionLabel = new JLabel("ウィンドウを移動したり");
    JLabel sizeLabel = new JLabel("大きさを変更してください");
    JLabel focusLabel = new JLabel("フォーカスを他のウィンドウにもっていったり");
    JLabel statusLabel = new JLabel("最大化や最小化");
    private boolean maxFlag = false;
    public WindowEventSample() {
        super("ウィンドウ移動&リサイズイベントサンプル");
        //移動やサイズ変更関係
        addComponentListener(new ComponentAdapter(){
            @Override
            public void componentMoved(ComponentEvent e) {
                positionLabel.setText("ウィンドウ位置 X="+getX()+",Y="+getY());
            }
            @Override
            public void componentResized(ComponentEvent e) {
                sizeLabel.setText("ウィンドウサイズ 幅="+getWidth()+",高さ="+getHeight());
                //最大化はリサイズ時に取得しなくてはならないらしい
                if(getExtendedState()==JFrame.MAXIMIZED_BOTH){
                    statusLabel.setText("最大化されました。");
                    maxFlag = true;
                } else {
                    if(maxFlag){
                        statusLabel.setText("最大化から普通の大きさに戻りました。");
                        maxFlag = false;
                    }
                }
            }
        });
        //フォーカス関係
        addWindowFocusListener(new WindowAdapter(){
            @Override
            public void windowLostFocus(WindowEvent e) {
                focusLabel.setText("フォーカスを失いました。");
            }
            @Override
            public void windowGainedFocus(WindowEvent e) {
                focusLabel.setText("フォーカスを取得しました。");
            }
        });
        //WindowEvent関係
        addWindowListener(new WindowAdapter(){
            @Override
            public void windowDeiconified(WindowEvent e) {
                statusLabel.setText("最小化から復帰しました。");
            }
        });
        setLayout(new GridLayout(4,1));
        add(positionLabel);
        add(sizeLabel);
        add(focusLabel);
        add(statusLabel);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // ×を押したときに終了するように
        pack();
        setVisible(true);
    }
    public static void main(String[] args) {
        new WindowEventSample();
    }
}

 課題

  1. 上記の例でウィンドウをリサイズしたさいに、ウィンドウの縦横比(例えば1:1、4:3など)が一定になるような修正を加えなさい。
WindowEventSample.java

最終更新時間:2008年07月03日 08時58分18秒