【1回目】Swing演習問題(30問)

2025-08-05

初級問題(9問)

  1. JFrameを作成し、タイトルを「My First Swing App」に設定するコードを書いてください。
  2. 300×200ピクセルのサイズでJFrameを作成するコードを書いてください。
  3. JFrameに「Hello, Swing!」というテキストのJLabelを追加するコードを書いてください。
  4. JButtonを作成し、クリック時にコンソールに「Button clicked!」と表示するコードを書いてください。
  5. JTextFieldを作成し、初期テキストとして「Enter text here」を設定するコードを書いてください。
  6. JFrameのデフォルトクローズ操作を「アプリケーション終了」に設定するコードを書いてください。
  7. JPanelを作成し、背景色を青色に設定するコードを書いてください。
  8. JLabelのテキスト色を赤色に変更するコードを書いてください。
  9. JButtonにツールチップテキスト「Click me!」を設定するコードを書いてください。

中級問題(15問)

  1. JFrameに2つのJButtonを横並びに配置するコードを書いてください(レイアウトマネージャーを使用)。
  2. JPanelを拡張したMyPanelクラスを作成し、背景色を緑色に設定してください。
  3. JTextFieldからテキストを取得し、JLabelに表示するボタンを作成してください。
  4. 3つのJLabelを縦に並べて配置するコードを書いてください(BoxLayoutを使用)。
  5. JFrameの中央にJLabelを配置するコードを書いてください(BorderLayoutを使用)。
  6. 2つのJPanelを作成し、1つは赤色、もう1つは青色に設定して、JFrameに上下に配置してください。
  7. JButtonを無効化(disabled)状態にするコードを書いてください。
  8. JTextFieldに入力された文字数をJLabelにリアルタイムで表示するコードを書いてください。
  9. カスタムJPanelクラスを作成し、その上に円を描画してください。
  10. JFrameにメニューバーと「ファイル」メニューを追加するコードを書いてください。
  11. ボタンクリックでJFrameの背景色をランダムに変更するコードを書いてください。
  12. マウスがJPanel上を移動したときの座標を表示するJLabelを作成してください。
  13. JTextFieldに入力できる文字数を10文字に制限するコードを書いてください。
  14. 2つのJTextFieldの数値を加算し、結果を表示するボタンを作成してください。
  15. JLabelのフォントを「Arial」、スタイルを「太字」、サイズを「20」に設定するコードを書いてください。

上級問題(6問)

  1. ドラッグアンドドロップで移動可能なJLabelを作成してください。
  2. カスタムJPanelクラスで簡単な線画アプリを作成してください(マウスで描画可能)。
  3. JTableを使用して2列3行の表を作成し、JFrameに追加してください。
  4. 内部フレーム(JInternalFrame)を使用して、MDI(マルチドキュメントインターフェース)アプリケーションの基本構造を作成してください。
  5. カスタムレイアウトマネージャーを作成し、コンポーネントを円形に配置してください。
  6. オブザーバーパターンを使用して、データモデルの変更を複数のJLabelに反映させるシステムを作成してください。

Swing演習問題 解答例

初級問題解答

  1. JFrame「My First Swing App」
JFrame frame = new JFrame("My First Swing App"); frame.setVisible(true);
  1. JFrame 300×200ピクセル
JFrame frame = new JFrame();
frame.setSize(300, 200);
frame.setVisible(true);
  1. JLabel「Hello, Swing!」
JFrame frame = new JFrame();
frame.add(new JLabel("Hello, Swing!"));
frame.setVisible(true);
  1. JButton「Button clicked!」
JButton button = new JButton("Click me");
button.addActionListener(e -> System.out.println("Button clicked!"));
  1. JTextField「Enter text here」
JTextField textField = new JTextField("Enter text here");
  1. JFrameのデフォルトクローズ操作
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  1. JPanel背景色を青色に
JPanel panel = new JPanel();
panel.setBackground(Color.BLUE);
  1. JLabelテキスト色を赤色に
JLabel label = new JLabel("Text");
label.setForeground(Color.RED);
  1. JButtonツールチップテキスト「Click me!」
JButton button = new JButton("Button");
button.setToolTipText("Click me!");

中級問題解答

  1. 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);
  1. JPanelを拡張したMyPanelクラス背景色を緑色に
class MyPanel extends JPanel {
    public MyPanel() {
        setBackground(Color.GREEN);
    }
}
  1. JTextFieldからテキストを取得し、JLabelに表示するボタン
JTextField textField = new JTextField(20);
JLabel label = new JLabel();
JButton button = new JButton("Update");
button.addActionListener(e -> label.setText(textField.getText()));
  1. 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"));
  1. JFrameの中央にJLabelを配置(BorderLayoutを使用)
JFrame frame = new JFrame();
frame.setLayout(new BorderLayout());
frame.add(new JLabel("Center"), BorderLayout.CENTER);
frame.setVisible(true);
  1. 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);
  1. JButtonを無効化(disabled)状態
button.setEnabled(false);
  1. 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());
    }
});
  1. カスタムJPanelクラスを作成し、その上に円を描画
class CirclePanel extends JPanel {
    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.drawOval(50, 50, 100, 100);
    }
}
  1. JFrameにメニューバーと「ファイル」メニューを追加
JMenuBar menuBar = new JMenuBar();
JMenu fileMenu = new JMenu("File");
menuBar.add(fileMenu);
frame.setJMenuBar(menuBar);
  1. ボタンクリックでJFrameの背景色をランダムに変更
button.addActionListener(e -> {
    Color randomColor = new Color(
        (int)(Math.random() * 256),
        (int)(Math.random() * 256),
        (int)(Math.random() * 256)
    );
    frame.getContentPane().setBackground(randomColor);
});
  1. マウスがJPanel上を移動したときの座標を表示するJLabel
panel.addMouseMotionListener(new MouseMotionAdapter() {
    public void mouseMoved(MouseEvent e) {
        label.setText("X: " + e.getX() + ", Y: " + e.getY());
    }
});
  1. 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);
        }
    }
});
  1. 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");
    }
});
  1. JLabelのフォントを「Arial」、スタイルを「太字」、サイズを「20」に設定
label.setFont(new Font("Arial", Font.BOLD, 20));

上級問題解答

  1. ドラッグアンドドロップで移動可能な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
        );
    }
});
  1. 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);
        }
    }
}
  1. 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));
  1. 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);
  1. コンポーネントを円形に配置
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);
        }
    }
    
    // 他の必要なメソッドも実装
}
  1. データモデルの変更を複数の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");