プロ2 > 資料 > 第10章
第10回:実用的なGUIプログラム
目標
- レイアウトマネージャを理解する.
- メニューとタブを理解する.
10.1 レイアウトマネージャ
- レイアウトマネージャはフレームの形に応じて部品を自動的に配置してくれる.
- FlowLayoutは部品を左から順に配置する.
- BorderLayoutはフレームを上下左右および中央に分け,add(部品,場所)により,部品を配置する場所を指定できる.

- GridLayoutに関しては第7回資料(補足:レイアウトマネージャ)を参照.
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class SampleA1 extends JFrame {
Color col = Color.RED;
int xpos = 100, ypos = 100, rad = 15;
public SampleA1() {
JButton b1 = new JButton("Blue");
JButton b2 = new JButton("Green");
JPanel p1 = new JPanel();
p1.add(b1);
p1.add(b2);
JPanel p2 = new JPanel() {
public void paintComponent(Graphics g) {
setOpaque(false);
g.setColor(col);
g.fillOval(xpos - rad, ypos - rad, rad * 2, rad * 2);
}
};
add(p1, BorderLayout.SOUTH);
add(p2);
b1.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
col = Color.BLUE;
repaint();
}
});
b2.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
col = Color.GREEN;
repaint();
}
});
p2.addMouseMotionListener(new MouseMotionAdapter() {
public void mouseDragged(MouseEvent evt) {
xpos = evt.getX();
ypos = evt.getY();
repaint();
}
});
}
public static void main(String args[]) {
JFrame app = new SampleA1();
app.setDefaultCloseOperation(EXIT_ON_CLOSE);
app.setPreferredSize(new Dimension(400, 300));
app.pack();
app.setVisible(true);
}
}
10.2 メニューとタブ
- メニュー(menu)はフレーム上部のメニューバー(menu bar)に並べられた部品で,メニューを選択するとプルダウンメニュー(pull-down menu)が表示され,メニュー項目(menu item)が選択できるようになる.
- タブ(tab)は1つのフレームで複数の画面が切り替えられるようにしたものである.
- requestFocus()を実行することで,フォーカスがパネルに変わり,キー入力を受け付けるようになる.
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class SampleA2 extends JFrame {
int xpos = 100, ypos = 100, rad = 15;
public SampleA2() {
JMenuBar mbar = new JMenuBar();
setJMenuBar(mbar);
JMenu m1 = new JMenu("File");
mbar.add(m1);
JMenuItem i1 = new JMenuItem("Quit");
m1.add(i1);
i1.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
System.exit(0);
}
});
JTabbedPane tabs = new JTabbedPane();
add(tabs);
tabs.add("Red circle", new MyPanel());
tabs.add("Blue circle", new JPanel() {
public void paintComponent(Graphics g) {
setOpaque(false);
g.setColor(Color.BLUE);
g.fillOval(xpos - rad, ypos - rad, rad * 2, rad * 2);
}
});
}
class MyPanel extends JPanel {
public MyPanel() {
addMouseMotionListener(new MouseMotionAdapter() {
public void mouseDragged(MouseEvent evt) {
requestFocus();
xpos = evt.getX();
ypos = evt.getY();
repaint();
}
});
addKeyListener(new KeyAdapter() {
public void keyPressed(KeyEvent evt) {
if (evt.getKeyChar() == '>') {
rad += 5;
}
if (evt.getKeyChar() == '<' && rad > 5) {
rad -= 5;
}
repaint();
}
});
}
public void paintComponent(Graphics g) {
setOpaque(false);
g.setColor(Color.RED);
g.fillOval(xpos - rad, ypos - rad, rad * 2, rad * 2);
}
}
public static void main(String args[]) {
JFrame app = new SampleA2();
app.setDefaultCloseOperation(EXIT_ON_CLOSE);
app.setPreferredSize(new Dimension(400, 300));
app.pack();
app.setVisible(true);
}
}
ykitamura@kwansei.ac.jp