解答例 - 実習課題2 - 14.テーブル
(実習課題2)
実習課題1のプログラムを改良しなさい。
- テーブルを右クリックするとポップアップメニューを表示する。
- メニュー内容は「列の追加」「行の追加」「行の挿入」。それぞれ対応する動作が実行されるようにする事。
- (ヒント)「JTable」の「getSelectedRow」で選択されている行がわかります。
- (ヒント)「DefaultTableModel」の「insertRow」で行の挿入ができます。
解答例
/**
* JTablePopupmenuFrame.java
* TECHSCORE Javaユーザインタフェース14章 実習課題2
*
* Copyright (c) 2004 Four-Dimensional Data, Inc.
*/
package com.techscore.ui.chapter14.exercise2;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import javax.swing.JFrame;
import javax.swing.JMenuItem;
import javax.swing.JPopupMenu;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;
public class JTablePopupmenuFrame extends JFrame implements MouseListener, ActionListener {
private DefaultTableModel model;
private JTable table;
private JPopupMenu popupMenu;
private JMenuItem addColMenu;
private JMenuItem addRowMenu;
private JMenuItem insertRowMenu;
public JTablePopupmenuFrame() {
super("JTablePopupmenuFrame");
setDefaultCloseOperation(EXIT_ON_CLOSE);
// JTable
model = new DefaultTableModel();
for (int i = 0; i < 7; i++) {
model.addColumn("column" + i);
}
for (int i = 0; i < 5; i++) {
String[] data = new String[model.getColumnCount()];
for (int j = 0; j < data.length; j++) {
data[j] = String.valueOf(j + i * model.getColumnCount());
}
model.addRow(data);
}
table = new JTable(model);
table.addMouseListener(this);
JScrollPane scroll = new JScrollPane(table);
scroll.setPreferredSize(new Dimension(500, 200));
getContentPane().add(scroll);
//JPopupMenu
popupMenu = new JPopupMenu();
addColMenu = new JMenuItem("Add Column");
addRowMenu = new JMenuItem("Add Row");
insertRowMenu = new JMenuItem("Insert Row");
addColMenu.addActionListener(this);
addRowMenu.addActionListener(this);
insertRowMenu.addActionListener(this);
popupMenu.add(addColMenu);
popupMenu.add(addRowMenu);
popupMenu.add(insertRowMenu);
pack();
}
public void mouseClicked(MouseEvent event) {
if (event.isMetaDown()) {
// 行が選択されていない場合はInsert Rowメニューを不可にする
if (table.getSelectedRow() == -1) {
insertRowMenu.setEnabled(false);
} else {
insertRowMenu.setEnabled(true);
}
//JPopupMenuを表示
popupMenu.show(this, event.getX(), event.getY());
}
}
public void mouseEntered(MouseEvent event) {}
public void mouseExited(MouseEvent event) {}
public void mousePressed(MouseEvent event) {}
public void mouseReleased(MouseEvent event) {}
public void actionPerformed(ActionEvent event) {
if (event.getSource() == addColMenu) {
model.addColumn("Others");
return;
}
if (event.getSource() == addRowMenu) {
String[] data = new String[model.getColumnCount()];
for (int i = 0; i < data.length; i++) {
data[i] = "Add";
}
model.addRow(data);
return;
}
if (event.getSource() == insertRowMenu) {
String[] data = new String[model.getColumnCount()];
for (int i = 0; i < data.length; i++) {
data[i] = "Insert";
}
model.insertRow(table.getSelectedRow(), data);
}
}
public static void main(String args[]) {
new JTablePopupmenuFrame().setVisible(true);
}
}

