JTableのイベント取得方法

このQ&Aのポイント
  • JTableのイベント取得方法とは?セルが編集されたときのイベントの取得方法について解説します。
  • JTableのイベント取得方法についてアドバイスをお探しですか?この記事ではセルが編集されたときのイベントの取得方法について詳しく説明します。
  • JTableのイベント取得方法についてお困りですか?この記事ではセルが編集されたときのイベントの取得方法について解説します。
回答を見る
  • ベストアンサー

JTableのイベント取得方法

お世話になります JTableにDBからの検索結果を表示させて、そのセルを編集したときに編集したセルに対してアップデート等の処理を行いたいのですが、セルが編集されたときのイベントを取得したいのですがうまくいきません。 具体的なソース等のアドバイスよろしくお願いします。 ---ソース--- TableEditListener lisner = new TableEditListener() tableModel = new AbstractTableModel(vecResult,clmName); tableModel.addTableModelListener(lisner); table = new JTable(tableModel); 内部クラス class TableEditListener implements javax.swing.event.TableModelListener{  public TableEditListener(){ } public void tableChanged(TableModelEvent e){ System.out.println("セルの編集をしました。"); } } 現在以上のようなソースになっています。 よろしくお願いします。

noname#1752
noname#1752
  • Java
  • 回答数2
  • ありがとう数4

質問者が選んだベストアンサー

  • ベストアンサー
  • ct27
  • ベストアンサー率62% (48/77)
回答No.2

aotakatakaさんはJTable自身のイベントとCellEditorのイベントを混同して しまっているのかもしれませんね。editingStoppedはCellEditorのイベントです。 /** * 内部テーブルクラス */ class ETable extends JTable{ public ETable( TableModel tableModel ){ super( tableModel ); DefaultTableColumnModel colModel = (DefaultTableColumnModel)getColumnModel(); //0番目のカラムを取得する TableColumn col0 = colModel.getColumn( 0 ); //0番目のカラムにMyCellEditorをセットする col0.setCellEditor( new MyCellEditor( new JTextField() ) ); } } /** * CellEditor */ class MyCellEditor extends DefaultCellEditor{ MyCellEditor( JTextField tf ){ super( tf ); setClickCountToStart( 1 ); //MyEditorListenerを追加 addCellEditorListener( new MyEditorListener() ); } } /** * CellEditorListener */ class MyEditorListener implements CellEditorListener{ //セルの編集が終わった時 public void editingStopped( ChangeEvent e ){ } public void editingCanceled( ChangeEvent e ){ } } >MyEditorListenerをどのようにJTableに組み込んでいいのかわからず困っています。  MyEditorListenerをJTableに組み込むのではなく、MyEditorListener  を追加したMyCellEditorをJTableに組み込むというのが正解です。  CellEditorやここでは関係ありませんがCellRendererなどは覚えてしまうと  非常に便利なクラスです。是非頑張ってください。  また不明点がありましたら補足を下さい。

noname#1752
質問者

お礼

内部テーブルクラスを以下のように修正して イベントを取得することができました!! /** * 内部テーブルクラス */ class ETable extends JTable{ public ETable( TableModel tableModel ){ super( tableModel ); // DefaultTableColumnModel colModel = (DefaultTableColumnModel)getColumnModel(); DefaultTableColumnModel colModel = (DefaultTableColumnModel)getColumnModel(); //0番目のカラムを取得する for (int i=0;i<tableModel.getColumnCount();i++){ TableColumn col0 = colModel.getColumn( i ); //0番目のカラムにMyCellEditorをセットする col0.setCellEditor( new MyCellEditor( new JTextField() ) ); } } public ETable( Vector rowList, Vector clmnList ){ super(rowList,clmnList); // DefaultTableColumnModel colModel = (DefaultTableColumnModel)getColumnModel(); DefaultTableColumnModel colModel = (DefaultTableColumnModel)getColumnModel(); //0番目のカラムを取得する for (int i=0;i<clmnList.size();i++){ TableColumn col0 = colModel.getColumn( i ); //0番目のカラムにMyCellEditorをセットする col0.setCellEditor( new MyCellEditor( new JTextField() ) ); } } } ありがとうございました。 とても勉強になりました。

その他の回答 (1)

  • ct27
  • ベストアンサー率62% (48/77)
回答No.1

TableCellEditorを使用せずに編集されたときのイベントをとるのは出来ない かもしれませんが、編集が始まった時(正しくはカラムをクリックした時)の イベントはとることができます。 /** * 内部テーブルクラス */ class MyTable extends JTable{ public MyTable( TableModel tableModel ){ super( tableModel ); } //カラムをクリックしたときにこのメソッドが内部的に呼ばれるので処理をここに記述する public void valueChanged( ListSelectionEvent e ){ super.valueChanged( e ); //System.out.println("valueChanged"); } } TableCellEditorを使用するならもっと細かくイベントをとることができます。 編集終了のタイミングをとる場合はCellEditorListenerをimplementsした クラスを使用するとよいと思います。 /** * CellEditor */ class MyCellEditor extends DefaultCellEditor{ MyCellEditor( JTextField tf ){ super( tf ); setClickCountToStart( 1 ); //リスナー追加 addCellEditorListener( new MyEditorListener() ); } } /** * CellEditorListener */ class MyEditorListener implements CellEditorListener{ //セルの編集が終わった時 public void editingStopped( ChangeEvent e ){ //やりたいことをここに記述する } public void editingCanceled( ChangeEvent e ){ } } JTable周辺の詳細はSUNが提供しているJavadocをご覧いただくか参考URL を参照して下さい。わかりにくい部分がれば補足を下さい。

参考URL:
http://java-house.etl.go.jp/ml/
noname#1752
質問者

補足

MyEditorListener をAbstractTableModelいaddListener するということでしょうか? いまいち MyEditorListenerをどのようにJTableに組み込んでいいのかわからず困っています。 editingStoppedメソッドに処理を書くことはわかるのですが… 再度、助言お願いします。

関連するQ&A

  • SwingのJTableについて

    swingなのですが下記のプログラムで実現できない点があります。 1.isCellEditableメソッドを使ってセルを編集可能にしたのですが 編集した文字が消えてしまいます。 2.また、ボタンを配置してボタンを押下時に編集したセルの   行のデータをコンソールに表示したいのですがどうすればいいかわかりません。 3.画面レイアウトがsetLocation(x, y)した位置に表示されません。 import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.Vector; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.table.AbstractTableModel; import javax.swing.table.TableModel; public class JTableSample4 implements ActionListener { static Vector<String>[] data = new Vector[3]; static JFrame frame; public static void main(String[] args) { frame = new JFrame(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setLayout(null); JPanel panel1 = new JPanel(); // セルのデータ作成 for (int i = 0; i < 3; i++) { data[i] = new Vector<String>(); } // data[0]に名前、data[1]に住所、data[2]に電話番号 data[0].addElement("鈴木一郎"); data[1].addElement("東京都"); data[2].addElement("xxxxxxxxxx"); data[0].addElement("佐藤花子"); data[1].addElement("千葉県"); data[2].addElement("yyyyyyyyyy"); data[0].addElement("田中浩二"); data[1].addElement("埼玉県"); data[2].addElement("zzzzzzzzzz"); data[0].addElement("小川伸介"); data[1].addElement("新潟県"); data[2].addElement("aaaaaaa"); data[0].addElement("佐藤和也"); data[1].addElement("群馬県"); data[2].addElement("bbbbbbb"); data[0].addElement("渡辺悟"); data[1].addElement("愛知県"); data[2].addElement("ccccccc"); data[0].addElement("橋本智也"); data[1].addElement("愛媛県"); data[2].addElement("ddddddd"); data[0].addElement("永井祐二"); data[1].addElement("栃木県"); data[2].addElement("eeeeeee"); data[0].addElement("細貝昭二"); data[1].addElement("福岡県"); data[2].addElement("fffffff"); data[0].addElement("堀野友光"); data[1].addElement("長野県"); data[2].addElement("gggggggg"); // テーブル作成 TableModel tableModel = new AbstractTableModel() { // 行数 public int getRowCount() { return 10; } // 列数 public int getColumnCount() { return 3; } // row行column列の値をセット public Object getValueAt(int row, int column) { return data[column].elementAt(row); } // タイトル部の値をセット public String getColumnName(int column) { switch (column) { case 0: return "名前"; case 1: return "住所"; case 2: return "電話番号"; } return ""; } /******************セルの編集 可/不可を操作するメソッド**********************/ public boolean isCellEditable(int rowIndex, int columnIndex) { /*0が1カラム目 1が2カラム目なのでこの場合電話番号だけ編集可*/ if (columnIndex == 0 || columnIndex ==1) { /*falseは編集不可*/ return false; } else /*trueは編集可*/ return true; } }; JLabel label = new JLabel("電話番号だけがセルを編集することができます"); label.setLocation(10, 10); label.setSize(300, 20); JButton button = new JButton("Click Me!"); button.setLocation(10, 400); button.setSize(20, 20); //button.addActionListener(); JTable table = new JTable(tableModel); JScrollPane scrollPane = new JScrollPane(table); scrollPane.setLocation(10, 40); scrollPane.setSize(750, 180); panel1.add(button); panel1.add(label); panel1.add(scrollPane); panel1.setBounds(10, 10, 800, 230); frame.add(panel1); frame.setSize(800, 600); frame.setVisible(true); } public void actionPerformed(ActionEvent e) { System.out.println("test"); } }

    • ベストアンサー
    • Java
  • JTableにおけるTABイベント取得について

    現在JTableを勉強しているのですが、 JTalbeでセルにフォーカスがある場合普通「TABキー」を押したときはフォーカスは右に移動すると思います。(右端にに到達したときは一段下がって左端といったように) そのイベント(タブ移動)使ってTABでフォーカスが移ったCellを編集できるようにEditモードにしたいと考えています。現在JTABEを以下のように実装しています -------ソース------- resultTable = new ETable(vecResult,clmName); ListSelectionModel cellSelectionModel = resultTable.getSelectionModel(); cellSelectionModel.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); cellSelectionModel.addListSelectionListener(this); * 内部テーブルクラス class ETable extends JTable{ public ETable( Vector rowList, Vector clmnList ){ super(rowList,clmnList); DefaultTableColumnModel colModel = (DefaultTableColumnModel)getColumnModel(); //0番目のカラムを取得する for (int i=0;i<clmnList.size();i++){ TableColumn col0 = colModel.getColumn( i ); //0番目のカラムにMyCellEditorをセットする col0.setCellEditor( new MyCellEditor( new JTextField() ) ); } } } public void valueChanged(ListSelectionEvent e) {   //Cellの値が変わったときのイベント(APIによると…)   *実際はセルをクリックするたびに走ってしまう(不思議)  }   このソースに追加して実現することはできるでしょうか? よきアドバイスをよろしくお願いします。

  • SwingでJtableのヘッダ行が表示されません

    SwingでJtableのヘッダ行が表示されません 解決方法とどうして表示されなかったのか理由もできればお願いします。 import java.util.Vector; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JTable; import javax.swing.table.AbstractTableModel; import javax.swing.table.TableModel; public class Table_Calendar extends JFrame{ Vector<String>[] data = new Vector[3]; public static void main(String args[]){ new Table_Calendar(); } public Table_Calendar(){ super(); // ウィンドウサイズ this.setSize(800, 600); // レイアウト this.setLayout(null); // ウィンドウクローズ時の処理 this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // セルのデータ作成 for (int i = 0; i < 3; i++) { data[i] = new Vector<String>(); } // data[0]に名前、data[1]に住所、data[2]に電話番号 data[0].addElement("鈴木一郎"); data[1].addElement("東京都"); data[2].addElement("xxxxxxxxxx"); // テーブル作成 TableModel tableModel = new AbstractTableModel() { // 行数 public int getRowCount() { return 1; } // 列数 public int getColumnCount() { return 3; } // row行column列の値をセット public Object getValueAt(int row, int column) { return data[column].elementAt(row); } // タイトル部の値をセット public String getColumnName(int column) { switch (column) { case 0: return "名前"; case 1: return "住所"; case 2: return "電話番号"; } return ""; } }; JTable table = new JTable(tableModel); table.setLocation(10, 20); table.setSize(600,500); JPanel panel2 = new JPanel(); panel2.setLayout(null); panel2.add(table); /*setBounds(int x,int y,int width,int height)*/ panel2.setBounds(10, 10, 700,700); this.add(panel2); this.setVisible(true); } }

    • ベストアンサー
    • Java
  • javaのJTableのupdateについて

    javaのJTableについて質問します。 Q1)下記のコードは元のtabledataをupdateしていますが、updateの内容を元のtabledataに 反映する設定はありますか(元のtabledataの内容は変化します)? =========================================== import javax.swing.*; import java.awt.event.*; import java.awt.BorderLayout; import java.awt.Dimension; import javax.swing.table.DefaultTableModel; public class SwingTest extends JFrame{ private String[][] tabledata = { {"日本", "3勝", "0敗", "1分"}, {"クロアチア", "3勝", "1敗", "0分"}, {"ブラジル", "1勝", "2敗", "1分"}, {"オーストラリア", "2勝", "2敗", "0分"}}; private String[] tabledata2 = {"イギリス", "2勝", "0敗", "2分"}; private String[] columnNames = {"COUNTRY", "WIN", "LOST", "EVEN"}; public static void main(String[] args){ SwingTest test = new SwingTest("SwingTest"); test.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); test.setVisible(true); } SwingTest(String title){ setTitle(title); setBounds( 10, 10, 300, 200); DefaultTableModel tableModel = new DefaultTableModel(columnNames, 0); JTable table = new JTable(tableModel); for(int i = 0 ; i < 4 ; i++){ tableModel.addRow(tabledata[i]); } tableModel.setValueAt("2勝", 1, 1); tableModel.setValueAt("2敗", 1, 2); JScrollPane sp = new JScrollPane(table); sp.setPreferredSize(new Dimension(250, 90)); JPanel p = new JPanel(); p.add(sp); getContentPane().add(p, BorderLayout.CENTER); } }

    • ベストアンサー
    • Java
  • JTableでスクロールバーが表示されない

    JTableで表を作成しました。 表示はされているのですが、 スクロールバーが表示されません。 コードは下記の通りです。 どうか宜しくお願いいたします。 ■Java import java.awt.*; import java.awt.event.*; import javax.swing.*; import javax.swing.table.*; public class ren32 extends JApplet{ Container c; public void init(){ c = this.getContentPane(); c.setLayout(null); String[] cname = { "name","comment","test1","test2", "(0)","(1)","(2)","(3)","(4)", }; Object[][] cell = { {"","","","","","","","",""}, }; JTable table = new JTable(cell, cname); JScrollPane sp = new JScrollPane(table); sp.setBounds(10,10,750,380); c.add(sp); } } ■html <html> <head> <title>Ren1</title> <body bgcolor=white text=black> <applet code="ren32.class" width="800" height="500"> </applet> </head> </html>

    • ベストアンサー
    • Java
  • JTableとJScrollPaneの問題

    JTableとJScrollPaneを使って、Excelのsheetのような表を作成したいのですが、 列の入れ替えが可能になっています。 列の入れ替えを出来ないようにしたいのですが、どうしたら良いのでしょうか? 教えて下さい。 また、各セルをセンターリングで表示したいです。 (以下の例の場合、Aと×とかです。) テストプログラム import java.awt.*; import javax.swing.JTable; import javax.swing.JPanel; import javax.swing.JFrame; import javax.swing.JScrollPane; public class testTable extends JFrame { public testTable() { Object[][] data = { {"A","B","×","A","A","×","B",}, {"C","C","C","C","C","×","B",}, {"×","×","×","A","A","×","B",}, {"F","F","F","A","A","×","B",}, }; String[] columnNames = {"日", "月", "火", "水", "木", "金", "土"}; JTable tblSchedule = new JTable(data, columnNames); JScrollPane scrollPane = new JScrollPane(tblSchedule); getContentPane().add(scrollPane, BorderLayout.CENTER); } public static void main(String[] args) { testTable frame = new testTable(); frame.pack(); frame.setVisible(true); } }

  • プログラムを補って下さい(swing)

    下記のプログラムで実装できない所がありますので補える方は教えてください 1.チェックボックスで削除を選択した、行番号をコンソールに表示したい。 2.コンボボックスで選択されたコンボボックスの文字列と選択されたコンボボックス   のインデックス番号が知りたい 以上です。 import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.lang.Class; import javax.swing.DefaultCellEditor; import javax.swing.JComboBox; import javax.swing.JFrame; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.table.DefaultTableModel; import javax.swing.table.TableCellEditor; import javax.swing.table.TableModel; public class JTableSample1 implements ActionListener{ JComboBox comboBox; public static void main(String[] args) { new JTableSample1().init(); } public void init() { String[] title = { "削除", "String", "Integer", "JComboBox" }; String prompt = "選んで下さい"; Object[][] records = { { Boolean.FALSE, "Rachel Green", new Integer(1970), prompt }, { Boolean.FALSE, "Monica Geller", new Integer(1969), prompt }, { Boolean.FALSE, "Phoebe Buffay", new Integer(1967), prompt }, { Boolean.FALSE, "Joey Tribbiani", new Integer(1967), prompt }, { Boolean.FALSE, "Chandler Bing", new Integer(1968), prompt }, { Boolean.FALSE, "Ross Geller", new Integer(1967), prompt } }; TableModel model = new DefaultTableModel(records, title) { public Class<?> getColumnClass(int column) { return getValueAt(0, column).getClass(); } }; JTable table = new JTable(model); comboBox = new JComboBox(); comboBox.addItem("ごはん食べてる"); comboBox.addItem("テレビみてる"); comboBox.addItem("仕事してる"); comboBox.addItem("寝てる"); TableCellEditor editor = new DefaultCellEditor(comboBox); table.getColumnModel().getColumn(3).setCellEditor(editor); JFrame frame = new JFrame("Joey Table"); frame.getContentPane().add(new JScrollPane(table)); frame.setSize(640, 240); frame.setVisible(true); } public void actionPerformed(ActionEvent e) { System.out.println("選択されたコンボボックス:"+(String)comboBox.getSelectedItem()); System.out.println("選択されたコンボボックスのインデックス番号:"+comboBox.getSelectedIndex()); } }

    • ベストアンサー
    • Java
  • JavaのJTableのセル単体の色設定

    今日は JavaのJtableの『マウスで選択したセル』の色を赤色に設定するコードを書きましたが、セル単体でバックグランドの色が変更できまず、行単位で変更されます。 又、変更のタイミングは、他のセルを、マウス選択したときに、以前のセルの行が赤く変更になります。 Q1)セル単体で、バックグランドの変更を行い、その変更タイミングは、クリックと同時に  行う様に改善したく質問いたします。 注)Java暦は、初心者で約2週間ですが。下記にソースを添付いたしますので、宜しくお願いいたします。 //============================== package packageA; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Component; import java.awt.Dimension; import java.awt.event.MouseEvent; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.table.DefaultTableModel; public class JTableTest2 extends JFrame{ public static void main(String[] args){ JTableTest2 test = new JTableTest2("T"); test.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); test.setVisible(true); } JTableTest2(String name){ setBounds( 0, 0, 400, 200); setTitle(name); String d[][] = { {"A","8","7"}, {"B","6","5"}, {"C","7","6"} }; String t[] = {"名","数","英"}; DefaultTableModel tm = new DefaultTableModel(d,t); final JTable tablex = new JTable(tm); /* final JTable tablex = new JTable(tm){ @Override public Component prepareRenderer(TableCellRenderer tcr, int row, int column) { Component c = super.prepareRenderer(tcr, row, column); if (row == 2 && column == 2) { c.setForeground(Color.BLUE); c.setBackground(Color.RED); } else { c.setForeground(getForeground()); c.setBackground(getBackground()); } return c; } }; */ tablex.addMouseListener( new java.awt.event.MouseAdapter() { public void mousePressed(MouseEvent e) { int row=tablex.getSelectedRow(); int col=tablex.getSelectedColumn(); // TableCellRenderer tcr = tablex.getCellRenderer(row,col); // Component c = tablex.prepareRenderer(tcr,row,col); Component c = tablex.getComponentAt(row,col); c.setForeground(Color.BLUE); c.setBackground(Color.RED); System.out.println(" "+row+" "+col); } } ); JPanel p1 = new JPanel(); JScrollPane sp1 = new JScrollPane(tablex); sp1.setPreferredSize(new Dimension(250, 80)); p1.add(sp1); getContentPane().add(p1, BorderLayout.NORTH); } }

    • ベストアンサー
    • Java
  • JavaでJTableの行の追加方法について

    今、Javaの勉強をEclopse3.2で勉強している者ですが、 JTableにてEnterを押したら次の行が追加されるという、 プログラムを作りたいのですが、どうしたら良いでしょうか? 自分はaddRow()を使ってみたのですが、うまく動きませんでした。 何が動かない原因なのかわかりません。 わかる人よろしくお願いします。 他のやり方も教えてください。 private JTable getJTable2() { int po =1; if (jTable == null) { model = new DefaultTableModel(po,2); jTable = new JTable(model); jTable.addKeyListener(new java.awt.event.KeyAdapter() { private int po; public void keyPressed(java.awt.event.KeyEvent e) { System.out.println("keyPressed()"); // TODO Auto-generated Event stub keyPressed() public addRow() String[] data = { "A5", "B5" }; jTable.addRow(data); System.out.println("po="+this.po); po += 1; System.out.println("po="+po); jTable.setValueAt("aikai",po,1); return; } });

    • ベストアンサー
    • Java
  • スクロール表示

    お願いします。 初めてswingに挑戦中なのですが・・・ tableをスクロール表示させたいのですがどうしてもできません。どうしたらよいでしょうか?教えてください import java.lang.*; import javax.swing.*; import javax.swing.table.*; import java.awt.*; public class SwingTableApp extends JFrame { public JTable table; public JLabel label; public SwingTableApp(String[][] data) { super("parallel Machine Scheduling"); setLocation(50,50); setSize(400,700); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); getContentPane().setLayout(null); DefaultTableModel tableModel = new DefaultTableModel(); for(int k=0; k<data[0].length; k++){ tableModel.addColumn("TEST"); }//列の設定 for(int j=0; j<data.length; j++){ tableModel.addRow(data[j]); }//行の設定 table = new JTable(tableModel); table.setLocation(10,10); table.setSize(2000,200); getContentPane().add(table); label = new JLabel("目的関数"); label.setLocation(10,210); label.setSize(100,25); getContentPane().add(label); } }

    • ベストアンサー
    • Java

専門家に質問してみよう