目次へ

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

}

↑このページの先頭へ

こちらもチェック!

PR
  • XMLDB.jp
  • シナジーマーケティング研究開発グループブログ