初級問題(9問)
- JFrameを作成し、タイトルを「My First Swing App」に設定するコードを書いてください。
- 300×200ピクセルのサイズでJFrameを作成するコードを書いてください。
- JFrameに「Hello, Swing!」というテキストのJLabelを追加するコードを書いてください。
- JButtonを作成し、クリック時にコンソールに「Button clicked!」と表示するコードを書いてください。
- JTextFieldを作成し、初期テキストとして「Enter text here」を設定するコードを書いてください。
- JFrameのデフォルトクローズ操作を「アプリケーション終了」に設定するコードを書いてください。
- JPanelを作成し、背景色を青色に設定するコードを書いてください。
- JLabelのテキスト色を赤色に変更するコードを書いてください。
- JButtonにツールチップテキスト「Click me!」を設定するコードを書いてください。
中級問題(15問)
- JFrameに2つのJButtonを横並びに配置するコードを書いてください(レイアウトマネージャーを使用)。
- JPanelを拡張したMyPanelクラスを作成し、背景色を緑色に設定してください。
- JTextFieldからテキストを取得し、JLabelに表示するボタンを作成してください。
- 3つのJLabelを縦に並べて配置するコードを書いてください(BoxLayoutを使用)。
- JFrameの中央にJLabelを配置するコードを書いてください(BorderLayoutを使用)。
- 2つのJPanelを作成し、1つは赤色、もう1つは青色に設定して、JFrameに上下に配置してください。
- JButtonを無効化(disabled)状態にするコードを書いてください。
- JTextFieldに入力された文字数をJLabelにリアルタイムで表示するコードを書いてください。
- カスタムJPanelクラスを作成し、その上に円を描画してください。
- JFrameにメニューバーと「ファイル」メニューを追加するコードを書いてください。
- ボタンクリックでJFrameの背景色をランダムに変更するコードを書いてください。
- マウスがJPanel上を移動したときの座標を表示するJLabelを作成してください。
- JTextFieldに入力できる文字数を10文字に制限するコードを書いてください。
- 2つのJTextFieldの数値を加算し、結果を表示するボタンを作成してください。
- JLabelのフォントを「Arial」、スタイルを「太字」、サイズを「20」に設定するコードを書いてください。
上級問題(6問)
- ドラッグアンドドロップで移動可能なJLabelを作成してください。
- カスタムJPanelクラスで簡単な線画アプリを作成してください(マウスで描画可能)。
- JTableを使用して2列3行の表を作成し、JFrameに追加してください。
- 内部フレーム(JInternalFrame)を使用して、MDI(マルチドキュメントインターフェース)アプリケーションの基本構造を作成してください。
- カスタムレイアウトマネージャーを作成し、コンポーネントを円形に配置してください。
- オブザーバーパターンを使用して、データモデルの変更を複数のJLabelに反映させるシステムを作成してください。
Swing演習問題 解答例
初級問題解答
- JFrame「My First Swing App」
JFrame frame = new JFrame("My First Swing App"); frame.setVisible(true);
- JFrame 300×200ピクセル
JFrame frame = new JFrame();
frame.setSize(300, 200);
frame.setVisible(true);
- JLabel「Hello, Swing!」
JFrame frame = new JFrame();
frame.add(new JLabel("Hello, Swing!"));
frame.setVisible(true);
- JButton「Button clicked!」
JButton button = new JButton("Click me");
button.addActionListener(e -> System.out.println("Button clicked!"));
- JTextField「Enter text here」
JTextField textField = new JTextField("Enter text here");
- JFrameのデフォルトクローズ操作
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
- JPanel背景色を青色に
JPanel panel = new JPanel();
panel.setBackground(Color.BLUE);
- JLabelテキスト色を赤色に
JLabel label = new JLabel("Text");
label.setForeground(Color.RED);
- JButtonツールチップテキスト「Click me!」
JButton button = new JButton("Button");
button.setToolTipText("Click me!");
中級問題解答
- JFrameに2つのJButtonを横並びに配置
JFrame frame = new JFrame();
frame.setLayout(new FlowLayout());
frame.add(new JButton("Button 1"));
frame.add(new JButton("Button 2"));
frame.setVisible(true);
- JPanelを拡張したMyPanelクラス背景色を緑色に
class MyPanel extends JPanel {
public MyPanel() {
setBackground(Color.GREEN);
}
}
- JTextFieldからテキストを取得し、JLabelに表示するボタン
JTextField textField = new JTextField(20);
JLabel label = new JLabel();
JButton button = new JButton("Update");
button.addActionListener(e -> label.setText(textField.getText()));
- 3つのJLabelを縦に並べて配置(BoxLayoutを使用)
JPanel panel = new JPanel();
panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
panel.add(new JLabel("Label 1"));
panel.add(new JLabel("Label 2"));
panel.add(new JLabel("Label 3"));
- JFrameの中央にJLabelを配置(BorderLayoutを使用)
JFrame frame = new JFrame();
frame.setLayout(new BorderLayout());
frame.add(new JLabel("Center"), BorderLayout.CENTER);
frame.setVisible(true);
- 2つのJPanelを作成し、1つは赤色、もう1つは青色に
JPanel redPanel = new JPanel();
redPanel.setBackground(Color.RED);
JPanel bluePanel = new JPanel();
bluePanel.setBackground(Color.BLUE);
JFrame frame = new JFrame();
frame.setLayout(new GridLayout(2, 1));
frame.add(redPanel);
frame.add(bluePanel);
frame.setVisible(true);
- JButtonを無効化(disabled)状態
button.setEnabled(false);
- JTextFieldに入力された文字数をJLabelに
textField.getDocument().addDocumentListener(new DocumentListener() {
public void changedUpdate(DocumentEvent e) { update(); }
public void removeUpdate(DocumentEvent e) { update(); }
public void insertUpdate(DocumentEvent e) { update(); }
private void update() {
label.setText("Length: " + textField.getText().length());
}
});
- カスタムJPanelクラスを作成し、その上に円を描画
class CirclePanel extends JPanel {
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawOval(50, 50, 100, 100);
}
}
- JFrameにメニューバーと「ファイル」メニューを追加
JMenuBar menuBar = new JMenuBar();
JMenu fileMenu = new JMenu("File");
menuBar.add(fileMenu);
frame.setJMenuBar(menuBar);
- ボタンクリックでJFrameの背景色をランダムに変更
button.addActionListener(e -> {
Color randomColor = new Color(
(int)(Math.random() * 256),
(int)(Math.random() * 256),
(int)(Math.random() * 256)
);
frame.getContentPane().setBackground(randomColor);
});
- マウスがJPanel上を移動したときの座標を表示するJLabel
panel.addMouseMotionListener(new MouseMotionAdapter() {
public void mouseMoved(MouseEvent e) {
label.setText("X: " + e.getX() + ", Y: " + e.getY());
}
});
- JTextFieldに入力できる文字数を10文字に制限する
textField.setDocument(new PlainDocument() {
@Override
public void insertString(int offs, String str, AttributeSet a)
throws BadLocationException {
if (getLength() + str.length() <= 10) {
super.insertString(offs, str, a);
}
}
});
- JTextFieldの数値を加算し、結果を表示するボタン
button.addActionListener(e -> {
try {
double num1 = Double.parseDouble(textField1.getText());
double num2 = Double.parseDouble(textField2.getText());
resultLabel.setText("Result: " + (num1 + num2));
} catch (NumberFormatException ex) {
resultLabel.setText("Invalid input");
}
});
- JLabelのフォントを「Arial」、スタイルを「太字」、サイズを「20」に設定
label.setFont(new Font("Arial", Font.BOLD, 20));
上級問題解答
- ドラッグアンドドロップで移動可能なJLabel
label.addMouseListener(new MouseAdapter() {
public void mousePressed(MouseEvent e) {
// ドラッグ開始処理
}
public void mouseReleased(MouseEvent e) {
// ドラッグ終了処理
}
});
label.addMouseMotionListener(new MouseMotionAdapter() {
public void mouseDragged(MouseEvent e) {
// ラベルの位置を更新
label.setLocation(
label.getX() + e.getX() - label.getWidth()/2,
label.getY() + e.getY() - label.getHeight()/2
);
}
});
- JPanelクラスで簡単な線画アプリ
class DrawingPanel extends JPanel {
private List points = new ArrayList<>();
public DrawingPanel() {
addMouseListener(new MouseAdapter() {
public void mousePressed(MouseEvent e) {
points.add(e.getPoint());
repaint();
}
});
addMouseMotionListener(new MouseMotionAdapter() {
public void mouseDragged(MouseEvent e) {
points.add(e.getPoint());
repaint();
}
});
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2 = (Graphics2D)g;
g2.setStroke(new BasicStroke(3));
for (int i = 1; i < points.size(); i++) {
Point p1 = points.get(i-1);
Point p2 = points.get(i);
g2.drawLine(p1.x, p1.y, p2.x, p2.y);
}
}
}
- JTableを使用して2列3行の表を作成
Object[][] data = {
{"1", "Alice"},
{"2", "Bob"},
{"3", "Charlie"}
};
String[] columnNames = {"ID", "Name"};
JTable table = new JTable(data, columnNames);
frame.add(new JScrollPane(table));
- JInternalFrame MDI(マルチドキュメントインターフェース)アプリケーション
JDesktopPane desktop = new JDesktopPane();
frame.setContentPane(desktop);
JInternalFrame internalFrame = new JInternalFrame("Document", true, true, true, true);
internalFrame.setSize(300, 200);
internalFrame.setVisible(true);
desktop.add(internalFrame);
- コンポーネントを円形に配置
class CircleLayout implements LayoutManager {
@Override
public void layoutContainer(Container parent) {
int radius = Math.min(parent.getWidth(), parent.getHeight()) / 3;
Point center = new Point(parent.getWidth()/2, parent.getHeight()/2);
double angle = 2 * Math.PI / parent.getComponentCount();
for (int i = 0; i < parent.getComponentCount(); i++) {
Component c = parent.getComponent(i);
int x = (int)(center.x + radius * Math.cos(i * angle) - c.getWidth()/2);
int y = (int)(center.y + radius * Math.sin(i * angle) - c.getHeight()/2);
c.setBounds(x, y, c.getPreferredSize().width, c.getPreferredSize().height);
}
}
// 他の必要なメソッドも実装
}
- データモデルの変更を複数のJLabelに反映
class ObservableModel {
private String data;
private List> listeners = new ArrayList<>();
public void setData(String data) {
this.data = data;
notifyListeners();
}
public void addListener(Consumer listener) {
listeners.add(listener);
}
private void notifyListeners() {
for (Consumer listener : listeners) {
listener.accept(data);
}
}
}
// 使用例
ObservableModel model = new ObservableModel();
JLabel label1 = new JLabel();
JLabel label2 = new JLabel();
model.addListener(text -> {
label1.setText(text);
label2.setText(text.toUpperCase());
});
model.setData("Hello");