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

2025-08-06

初級問題(9問)

  1. JTableを作成し、3行2列の表を表示するコードを書いてください。
  2. JListに「Item 1」「Item 2」「Item 3」の要素を追加するコードを書いてください。
  3. JComboBoxに「Red」「Green」「Blue」の選択肢を追加するコードを書いてください。
  4. メニューバーを作成し、「File」メニューを追加するコードを書いてください。
  5. 「File」メニューに「Open」と「Save」のメニュー項目を追加するコードを書いてください。
  6. JFileChooserを使用してファイルを開くダイアログを表示するコードを書いてください。
  7. JTableの選択行のインデックスを取得するコードを書いてください。
  8. JListでマルチ選択を有効にするコードを書いてください。
  9. JComboBoxの選択変更イベントを検知し、選択項目を表示するコードを書いてください。

中級問題(15問)

  1. JTableにカラム名「Name」「Age」を設定し、データを3行追加するコードを書いてください。
  2. JListの選択項目変更時に、選択された項目を表示するJLabelを更新するコードを書いてください。
  3. JComboBoxの選択項目に応じて、JPanelの背景色を変更するコードを書いてください。
  4. メニュー項目にアイコンを設定するコードを書いてください。
  5. 「Edit」メニューを作成し、「Cut」「Copy」「Paste」項目を追加するコードを書いてください。
  6. JFileChooserで選択したファイルのパスをJLabelに表示するコードを書いてください。
  7. JTableのセル編集を無効にするコードを書いてください。
  8. JListにカスタムレンダラーを設定し、項目を色付きで表示するコードを書いてください。
  9. JComboBoxにカスタムレンダラーを設定するコードを書いてください。
  10. メニュー項目にショートカットキー(Ctrl+Oなど)を設定するコードを書いてください。
  11. コンテキストメニュー(右クリックメニュー)を作成するコードを書いてください。
  12. JFileChooserでディレクトリのみ選択可能にするコードを書いてください。
  13. JTableに行選択リスナーを追加し、選択行のデータを表示するコードを書いてください。
  14. JListの項目を動的に追加・削除するボタンを作成してください。
  15. JComboBoxの項目をファイルから読み込むコードを書いてください。

上級問題(6問)

  1. JTableにデータモデルクラスを実装し、外部データソースと連携させるコードを書いてください。
  2. ドラッグ&ドロップでJListの項目を並べ替える機能を実装してください。
  3. 階層構造のメニュー(サブメニューを含む)を作成するコードを書いてください。
  4. カスタムファイルフィルタを使用して、JFileChooserで特定の拡張子のファイルのみ表示するコードを書いてください。
  5. JTableとJListを連動させ、テーブルの選択行に対応するリスト項目を表示するコードを書いてください。
  6. メニュー項目の有効/無効状態を動的に切り替えるシステムを実装してください。

Swing演習問題 解答例

初級問題解答

  1. JTableを作成し、3行2列の表を表示
Object[][] data = {{"",""}, {"",""}, {"",""}};
String[] columns = {"Column1", "Column2"};
JTable table = new JTable(data, columns);
  1. JListに「Item 1」「Item 2」「Item 3」の要素を追加
String[] items = {"Item 1", "Item 2", "Item 3"};
JList list = new JList<>(items);
  1. JComboBoxに「Red」「Green」「Blue」の選択肢を追加
JComboBox comboBox = new JComboBox<>();
comboBox.addItem("Red");
comboBox.addItem("Green");
comboBox.addItem("Blue");
  1. メニューバーを作成し、「File」メニューを追加する
JMenuBar menuBar = new JMenuBar();
JMenu fileMenu = new JMenu("File");
menuBar.add(fileMenu);
frame.setJMenuBar(menuBar);
  1. 「File」メニューに「Open」と「Save」のメニュー項目
JMenuItem openItem = new JMenuItem("Open");
JMenuItem saveItem = new JMenuItem("Save");
fileMenu.add(openItem);
fileMenu.add(saveItem);
  1. JFileChooserを使用してファイルを開くダイアログを表示
JFileChooser fileChooser = new JFileChooser();
fileChooser.showOpenDialog(frame);
  1. JTableの選択行のインデックスを取得
int selectedRow = table.getSelectedRow();
  1. JListでマルチ選択を有効
list.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
  1. JComboBoxの選択変更イベントを検知し、選択項目を表示
comboBox.addActionListener(e -> {
    System.out.println("Selected: " + comboBox.getSelectedItem());
});

中級問題解答

  1. JTableにカラム名「Name」「Age」を設定し、データを3行追加
Object[][] data = {
    {"John", 25},
    {"Alice", 30},
    {"Bob", 28}
};
String[] columns = {"Name", "Age"};
JTable table = new JTable(data, columns);
  1. JListの選択項目変更時に、選択された項目を表示するJLabelを更新
list.addListSelectionListener(e -> {
    if (!e.getValueIsAdjusting()) {
        label.setText("Selected: " + list.getSelectedValue());
    }
});
  1. JComboBoxの選択項目に応じて、JPanelの背景色を変更
comboBox.addActionListener(e -> {
    String color = (String)comboBox.getSelectedItem();
    switch(color) {
        case "Red": panel.setBackground(Color.RED); break;
        case "Green": panel.setBackground(Color.GREEN); break;
        case "Blue": panel.setBackground(Color.BLUE); break;
    }
});
  1. メニュー項目にアイコンを設定
JMenuItem item = new JMenuItem("Open", new ImageIcon("open.png"));
  1. 「Edit」メニューを作成し、「Cut」「Copy」「Paste」項目を追加
JMenu editMenu = new JMenu("Edit");
JMenuItem cutItem = new JMenuItem("Cut");
JMenuItem copyItem = new JMenuItem("Copy");
JMenuItem pasteItem = new JMenuItem("Paste");
editMenu.add(cutItem);
editMenu.add(copyItem);
editMenu.add(pasteItem);
menuBar.add(editMenu);
  1. JFileChooserで選択したファイルのパスをJLabelに表示する
JFileChooser fileChooser = new JFileChooser();
if (fileChooser.showOpenDialog(frame) == JFileChooser.APPROVE_OPTION) {
    label.setText(fileChooser.getSelectedFile().getPath());
}
  1. JTableのセル編集を無効にする
table.setDefaultEditor(Object.class, null);
  1. JListにカスタムレンダラーを設定し、項目を色付きで表示
list.setCellRenderer(new DefaultListCellRenderer() {
    @Override
    public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
        Component c = super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
        if (index % 2 == 0) {
            c.setBackground(Color.LIGHT_GRAY);
        } else {
            c.setBackground(Color.WHITE);
        }
        return c;
    }
});
  1. JComboBoxにカスタムレンダラーを設定
comboBox.setRenderer(new DefaultListCellRenderer() {
    @Override
    public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
        JLabel label = (JLabel)super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
        label.setIcon(new ImageIcon(value + ".png"));
        return label;
    }
});
  1. メニュー項目にショートカットキー(Ctrl+Oなど)
openItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_O, InputEvent.CTRL_DOWN_MASK));
  1. コンテキストメニュー(右クリックメニュー)を作成
JPopupMenu popupMenu = new JPopupMenu();
popupMenu.add(new JMenuItem("Cut"));
popupMenu.add(new JMenuItem("Copy"));
popupMenu.add(new JMenuItem("Paste"));
panel.setComponentPopupMenu(popupMenu);
  1. JFileChooserでディレクトリのみ選択可能
fileChooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
  1. JTableに行選択リスナーを追加し、選択行のデータを表示
table.getSelectionModel().addListSelectionListener(e -> {
    if (!e.getValueIsAdjusting()) {
        int row = table.getSelectedRow();
        if (row >= 0) {
            System.out.println("Selected: " + table.getValueAt(row, 0));
        }
    }
});
  1. JListの項目を動的に追加・削除する
JButton addButton = new JButton("Add");
JButton removeButton = new JButton("Remove");
DefaultListModel model = new DefaultListModel<>();

addButton.addActionListener(e -> model.addElement("Item " + (model.size()+1)));
removeButton.addActionListener(e -> {
    if (!list.isSelectionEmpty()) {
        model.remove(list.getSelectedIndex());
    }
});

list.setModel(model);
  1. JComboBoxの項目をファイルから読み込む
try (BufferedReader reader = new BufferedReader(new FileReader("items.txt"))) {
    String line;
    while ((line = reader.readLine()) != null) {
        comboBox.addItem(line);
    }
} catch (IOException e) {
    e.printStackTrace();
}

上級問題解答

  1. 外部データソースと連携
class MyTableModel extends AbstractTableModel {
    private List data;
    private String[] columns = {"Name", "Age"};
    
    public MyTableModel(List data) {
        this.data = data;
    }
    
    @Override
    public int getRowCount() { return data.size(); }
    
    @Override
    public int getColumnCount() { return columns.length; }
    
    @Override
    public Object getValueAt(int row, int col) {
        Person p = data.get(row);
        return col == 0 ? p.getName() : p.getAge();
    }
    
    @Override
    public String getColumnName(int col) {
        return columns[col];
    }
}

// 使用例
List people = getPeopleFromDatabase();
JTable table = new JTable(new MyTableModel(people));
  1. ドラッグ&ドロップでJListの項目を並べ替える
list.setDragEnabled(true);
list.setDropMode(DropMode.INSERT);
list.setTransferHandler(new TransferHandler() {
    @Override
    public boolean canImport(TransferSupport support) {
        return support.isDataFlavorSupported(DataFlavor.stringFlavor);
    }

    @Override
    public boolean importData(TransferSupport support) {
        // ドロップ処理の実装
    }
});
  1. 階層構造のメニュー
JMenuBar menuBar = new JMenuBar();
JMenu fileMenu = new JMenu("File");
JMenu recentMenu = new JMenu("Recent");
JMenuItem openItem = new JMenuItem("Open");
JMenuItem exitItem = new JMenuItem("Exit");

fileMenu.add(openItem);
fileMenu.add(recentMenu);
fileMenu.addSeparator();
fileMenu.add(exitItem);

// 最近使ったファイルをサブメニューに追加
for (String file : recentFiles) {
    recentMenu.add(new JMenuItem(file));
}

menuBar.add(fileMenu);
frame.setJMenuBar(menuBar);
  1. JFileChooserで特定の拡張子のファイルのみ表示
JFileChooser fileChooser = new JFileChooser();
fileChooser.setFileFilter(new FileNameExtensionFilter("Image Files", "jpg", "png", "gif"));
  1. テーブルの選択行に対応するリスト項目を表示
table.getSelectionModel().addListSelectionListener(e -> {
    if (!e.getValueIsAdjusting()) {
        int row = table.getSelectedRow();
        if (row >= 0) {
            DefaultListModel model = new DefaultListModel<>();
            // テーブル行からリストデータを生成
            for (int i = 0; i < table.getColumnCount(); i++) {
                model.addElement(table.getValueAt(row, i).toString());
            }
            list.setModel(model);
        }
    }
});
  1. メニュー項目の有効/無効状態を動的に切り替え
// 状態管理クラス
class AppState {
    private boolean editMode = false;
    private List> listeners = new ArrayList<>();
    
    public void setEditMode(boolean mode) {
        editMode = mode;
        listeners.forEach(l -> l.accept(mode));
    }
    
    public void addListener(Consumer listener) {
        listeners.add(listener);
    }
}

// メニュー項目の状態更新
AppState state = new AppState();
state.addListener(editMode -> {
    cutItem.setEnabled(editMode);
    copyItem.setEnabled(editMode);
    pasteItem.setEnabled(editMode);
});

// 編集モード切り替え
JToggleButton editToggle = new JToggleButton("Edit Mode");
editToggle.addActionListener(e -> state.setEditMode(editToggle.isSelected()));