• 締切済み

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によると…)   *実際はセルをクリックするたびに走ってしまう(不思議)  }   このソースに追加して実現することはできるでしょうか? よきアドバイスをよろしくお願いします。

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

みんなの回答

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

こんな感じで実装してみましたがどうでしょう? /** * 内部テーブルクラス */ class MyTable extends JTable{ public MyTable(){ super(); } public MyTable( TableModel ml ){ super( ml ); } /*行が変わったときに呼ばれる*/ public void valueChanged( ListSelectionEvent e ){ int nRow = this.getSelectedRow(); int nCol = this.getSelectedColumn(); if ( (nRow != -1) && (nCol != -1) ){ this.editCellAt( nRow, nCol ); } super.valueChanged( e ); } /*列が変わったとき*/ public void columnSelectionChanged( ListSelectionEvent e ){ int nRow = this.getSelectedRow(); int nCol = this.getSelectedColumn(); if ( (nRow != -1) && (nCol != -1) ){ this.editCellAt( nRow, nCol ); } super.columnSelectionChanged( e ); } } ちなみにコメントにも記述しましたが、valueChangedは行が変わったときに 走り、columnSelectionChangedは列が変わったときに走るので両方書いて おくと矢印キーを押して上下に移動したときにもedit状態になります。

noname#1752
質問者

補足

列が変わったときや行が変わったときのイベントは拾得るのですがやはり、Tabややじるしキーでフォーカスがセル単位で変わった時にフォーカスのあるセルをエディットモード(セルがへこんでそこにカーソルが存在する状態)にすることができないです。 ありがとうございました。申し少しがんばってみます。

関連するQ&A

  • 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("セルの編集をしました。"); } } 現在以上のようなソースになっています。 よろしくお願いします。

    • ベストアンサー
    • Java
  • Swing 編集不可でも選択可能なJTableセルの設定方法

    テーブルデータ編集不可でも行選択可能なJTableの設定方法をお教えいただきたいです。 私が試した方法では一つ問題点があり困っております。 その問題点とは、 セルをダブルクリックするとセルがへこみ、 そのまま別イベントでプログラム内部からテーブルへ書き込みをすると、 上記へこんだセルのみ変更が反映されないのです。 JTableを継承したJTableCustomクラスを作成し、 テーブルセル編集の不可設定を行うsetEditFalseメソッドを作成しました。 (補足:JTableのEnabledをfalseにすると行選択ができなくなってしまうので、  CellEditerを使用しています) public class JTableCustom extends JTable { public JTableCustom() { super(); this.setModel(new DefaultTableModel()); this.setSize(300,200); } /** * テーブルセルの編集ができないように設定します。<br> */ public void setEditFalse(){ JTextField tf = new JTextField(""); tf.setEditable(false); DefaultCellEditor dce = new DefaultCellEditor(tf); TableColumnModel tcm = this.getColumnModel(); for (int i = 0; i < tcm.getColumnCount(); i++){ tcm.getColumn(i).setCellEditor(dce); } } } JTableCostomインスタンス作成後、上記メソッドを呼び設定を行います。 上記メソッドにセルがへこまないように設定する方法、 もしくは別の方法で上記機能を満たすものがあれば教えていただきたいです。 よろしくお願い致します。

    • ベストアンサー
    • Java
  • JavaのjTableに関する質問です

    以下の様にプログラムを書いた所、「jTable3が見つかりません」と出力されました。 for文をつける以前は何も問題なく動いていたいのに、どうしてfor文を付けたことによって、このようなエラーが起きたのでしょうか? private void jButton19MouseClicked(java.awt.event.MouseEvent evt) { // TODO add your handling code here: for(int i=0;i<10;i++) NewJFrame.jTable3.getColumnModel().getColumn(20).setCellRenderer(new MyTableCellRenderer()); } }

    • ベストアンサー
    • Java
  • JTableのセルとコラムについて

    以下の(1)、(2)の方法を知っている方がいらしたら教えてください。 (1)JTableではテーブル内のセルをクリックした時に、クリックされたセルを含む行全体が選択状態になりますが、選択状態時にこの選択されているのがどの行なのかを調べる方法はありませんか? (2)WindowsMediaPlayerのように"アーティスト"のコラムを選択すると名前順にソートされますが、それをJTableで実現するために、JTableのコラムを選択したらイベントを発生させてその選択されたコラムを特定する方法はありませんか?

    • ベストアンサー
    • Java
  • フォーカスのあるセルを中心に表示したい

    こんにちは。 JTable table = new JTable(); JScrollPane sp = new JScrollPane(); sp.getViewport().setView(table); という感じでテーブルを表示しています。 テーブルのカラム数が多く、セルをタブ移動させていくと、 フレームの右側に常にフォーカスを持ったセルが来るようになりますが、フォーカスを持ったセルがフレームの中心に表示されるようにしたいです。 説明が下手で申し訳ございません。 用はスクロールが自動的にされるみたいなイメージです。 宜しくお願いします。

  • 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
  • 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
  • Swing/JTableのカラム幅の変更について

    お世話になります。ついこの前にも質問したのですが、 さらにわからないことがでてきたので質問させていただきます。 AUTO_RESIZE_OFFにしておいてユーザーがテーブルのカラム幅を変更した際や最大化/元に戻す(縮小)した際、セットされているJScrollPaneのViewportがあまっていたら最後の行で調節する(AUTO_RESIZE_LAST_COLUMN相当)ということをしたいのです AUTO_RESIZE_LAST_COLUMNにしないのは最大化/縮小のときにはカラム幅を変更しないためです。 以下のようなコードを組んだのですが幅を変更した際には微妙にずれてしまいます。 また、最大化はできるのですが、縮小するとうまくいきません。 よろしくお願いします。 ****** for(int i=0;i<8;i++){//列は8列です table.getColumnModel().getColumn(i).addPropertyChangeListener(new PropertyChangeListener(){ public void propertyChange(PropertyChangeEvent e) { if (e.getPropertyName().equals("width")) { adjustOnLastColumn(); } } });} jScrollPane1.addComponentListener(new ComponentAdapter(){ @Override public void componentResized(ComponentEvent e){ adjustOnLastColumn(); } }); public void adjustOnLastColumn(){ int widthSum = 0; for(int i = 0;i<8;i++){ widthSum += table.getColumnModel().getColumn(i).getWidth(); } table.getColumnModel().getColumn(8).setMaxWidth( jScrollPane1.getViewport().getSize().width - widthSum); table.getColumnModel().getColumn(8).setMinWidth( jScrollPane1.getViewport().getSize().width - widthSum); }

    • ベストアンサー
    • Java
  • 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でスクロールバーが表示されない

    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

専門家に質問してみよう