解答例 - 実習課題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); } }