初級問題(9問)
- JTableを作成し、3行2列の表を表示するコードを書いてください。
- JListに「Item 1」「Item 2」「Item 3」の要素を追加するコードを書いてください。
- JComboBoxに「Red」「Green」「Blue」の選択肢を追加するコードを書いてください。
- メニューバーを作成し、「File」メニューを追加するコードを書いてください。
- 「File」メニューに「Open」と「Save」のメニュー項目を追加するコードを書いてください。
- JFileChooserを使用してファイルを開くダイアログを表示するコードを書いてください。
- JTableの選択行のインデックスを取得するコードを書いてください。
- JListでマルチ選択を有効にするコードを書いてください。
- JComboBoxの選択変更イベントを検知し、選択項目を表示するコードを書いてください。
中級問題(15問)
- JTableにカラム名「Name」「Age」を設定し、データを3行追加するコードを書いてください。
- JListの選択項目変更時に、選択された項目を表示するJLabelを更新するコードを書いてください。
- JComboBoxの選択項目に応じて、JPanelの背景色を変更するコードを書いてください。
- メニュー項目にアイコンを設定するコードを書いてください。
- 「Edit」メニューを作成し、「Cut」「Copy」「Paste」項目を追加するコードを書いてください。
- JFileChooserで選択したファイルのパスをJLabelに表示するコードを書いてください。
- JTableのセル編集を無効にするコードを書いてください。
- JListにカスタムレンダラーを設定し、項目を色付きで表示するコードを書いてください。
- JComboBoxにカスタムレンダラーを設定するコードを書いてください。
- メニュー項目にショートカットキー(Ctrl+Oなど)を設定するコードを書いてください。
- コンテキストメニュー(右クリックメニュー)を作成するコードを書いてください。
- JFileChooserでディレクトリのみ選択可能にするコードを書いてください。
- JTableに行選択リスナーを追加し、選択行のデータを表示するコードを書いてください。
- JListの項目を動的に追加・削除するボタンを作成してください。
- JComboBoxの項目をファイルから読み込むコードを書いてください。
上級問題(6問)
- JTableにデータモデルクラスを実装し、外部データソースと連携させるコードを書いてください。
- ドラッグ&ドロップでJListの項目を並べ替える機能を実装してください。
- 階層構造のメニュー(サブメニューを含む)を作成するコードを書いてください。
- カスタムファイルフィルタを使用して、JFileChooserで特定の拡張子のファイルのみ表示するコードを書いてください。
- JTableとJListを連動させ、テーブルの選択行に対応するリスト項目を表示するコードを書いてください。
- メニュー項目の有効/無効状態を動的に切り替えるシステムを実装してください。
Swing演習問題 解答例
初級問題解答
- JTableを作成し、3行2列の表を表示
Object[][] data = {{"",""}, {"",""}, {"",""}};
String[] columns = {"Column1", "Column2"};
JTable table = new JTable(data, columns);
- JListに「Item 1」「Item 2」「Item 3」の要素を追加
String[] items = {"Item 1", "Item 2", "Item 3"};
JList list = new JList<>(items);
- JComboBoxに「Red」「Green」「Blue」の選択肢を追加
JComboBox comboBox = new JComboBox<>();
comboBox.addItem("Red");
comboBox.addItem("Green");
comboBox.addItem("Blue");
- メニューバーを作成し、「File」メニューを追加する
JMenuBar menuBar = new JMenuBar();
JMenu fileMenu = new JMenu("File");
menuBar.add(fileMenu);
frame.setJMenuBar(menuBar);
- 「File」メニューに「Open」と「Save」のメニュー項目
JMenuItem openItem = new JMenuItem("Open");
JMenuItem saveItem = new JMenuItem("Save");
fileMenu.add(openItem);
fileMenu.add(saveItem);
- JFileChooserを使用してファイルを開くダイアログを表示
JFileChooser fileChooser = new JFileChooser();
fileChooser.showOpenDialog(frame);
- JTableの選択行のインデックスを取得
int selectedRow = table.getSelectedRow();
- JListでマルチ選択を有効
list.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
- JComboBoxの選択変更イベントを検知し、選択項目を表示
comboBox.addActionListener(e -> {
System.out.println("Selected: " + comboBox.getSelectedItem());
});
中級問題解答
- JTableにカラム名「Name」「Age」を設定し、データを3行追加
Object[][] data = {
{"John", 25},
{"Alice", 30},
{"Bob", 28}
};
String[] columns = {"Name", "Age"};
JTable table = new JTable(data, columns);
- JListの選択項目変更時に、選択された項目を表示するJLabelを更新
list.addListSelectionListener(e -> {
if (!e.getValueIsAdjusting()) {
label.setText("Selected: " + list.getSelectedValue());
}
});
- 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;
}
});
- メニュー項目にアイコンを設定
JMenuItem item = new JMenuItem("Open", new ImageIcon("open.png"));
- 「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);
- JFileChooserで選択したファイルのパスをJLabelに表示する
JFileChooser fileChooser = new JFileChooser();
if (fileChooser.showOpenDialog(frame) == JFileChooser.APPROVE_OPTION) {
label.setText(fileChooser.getSelectedFile().getPath());
}
- JTableのセル編集を無効にする
table.setDefaultEditor(Object.class, null);
- 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;
}
});
- 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;
}
});
- メニュー項目にショートカットキー(Ctrl+Oなど)
openItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_O, InputEvent.CTRL_DOWN_MASK));
- コンテキストメニュー(右クリックメニュー)を作成
JPopupMenu popupMenu = new JPopupMenu();
popupMenu.add(new JMenuItem("Cut"));
popupMenu.add(new JMenuItem("Copy"));
popupMenu.add(new JMenuItem("Paste"));
panel.setComponentPopupMenu(popupMenu);
- JFileChooserでディレクトリのみ選択可能
fileChooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
- JTableに行選択リスナーを追加し、選択行のデータを表示
table.getSelectionModel().addListSelectionListener(e -> {
if (!e.getValueIsAdjusting()) {
int row = table.getSelectedRow();
if (row >= 0) {
System.out.println("Selected: " + table.getValueAt(row, 0));
}
}
});
- 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);
- 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();
}
上級問題解答
- 外部データソースと連携
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));
- ドラッグ&ドロップで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) {
// ドロップ処理の実装
}
});
- 階層構造のメニュー
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);
- JFileChooserで特定の拡張子のファイルのみ表示
JFileChooser fileChooser = new JFileChooser();
fileChooser.setFileFilter(new FileNameExtensionFilter("Image Files", "jpg", "png", "gif"));
- テーブルの選択行に対応するリスト項目を表示
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);
}
}
});
- メニュー項目の有効/無効状態を動的に切り替え
// 状態管理クラス
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()));