Skip to content
Code Blue プログラミング学習ノート
Java/Swing

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

初級問題(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()));