Swing 編集不可でも選択可能なJTableセルの設定方法

このQ&Aのポイント
  • JTableのセルを編集不可にしつつ行選択可能にする方法を教えてください
  • JTableCustomクラスを作成し、setEditFalseメソッドを使用することでセルの編集を不可にすることができます
  • 他の方法でJTableのセルを編集不可にしつつ行選択可能にする方法を教えてください
回答を見る
  • ベストアンサー

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
  • 回答数1
  • ありがとう数3

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

  • ベストアンサー
  • ngsvx
  • ベストアンサー率49% (157/315)
回答No.1

編集を不可にするのなら、TableModel#isCellEditable(int rowIndex, int columnIndex) を調整してください。 全てのセルを編集不可にするなら、DefaultTableModelのisCellEditable(int rowIndex, int columnIndex)を常にfalseを返すようにオーバーライドすればいいでしょう。

artemis_diana
質問者

お礼

回答ありがとうございます。 なるほど、そのような方法があったんですね。 先ほどDefaultTableModelのオーバーライドしで試したところ、表題の問題が解決しました。 大変助かりました、ありがとうございました。

関連する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のイベント取得方法

    お世話になります 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のヘッダ行が表示されません

    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
  • JTable で複数行の編集

    JTable で複数行の編集ができるようにしたいと思っています。 JTextArea を使う独自の CellEditor を作ることで、できました。 ただ、編集を開始するのにマウスでダブルクリックする必要があります。 セルにフォーカスがある状態で、キーボード入力で編集を開始できないでしょうか? ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ JTextField を使った DefaultCellEditor はできます。 自作の JTextArea を使う CellEditor でもできました。 しかし、JScrollPane を付けるとできなくなります。 解決策をご存知の方がいらっしゃいましたら、よろしくお願いします。 public class TextAreaCellEditor extends AbstractCellEditor implements TableCellEditor { private JTextArea textArea = new JTextArea(); private JScrollPane scroll = new JScrollPane(textArea); public TextAreaCellEditor() { scroll.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER); scroll.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_NEVER); } public Object getCellEditorValue() { return textArea.getText(); } public boolean isCellEditable(EventObject anEvent) { if (anEvent instanceof MouseEvent) { return ((MouseEvent) anEvent).getClickCount() >= 2; } return true; } public boolean shouldSelectCell(EventObject anEvent) { return true; } public boolean stopCellEditing() { fireEditingStopped(); return true; } public void cancelCellEditing() { fireEditingCanceled(); } public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) { textArea.setText((value != null) ? value.toString() : ""); return scroll; // JScrollPane を付けなければ可能 // return textArea; } }

    • ベストアンサー
    • 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
  • JTableで値を右寄せ表示する方法

    やりたい事はJTableのカラム内の値を右寄せにしたいだけです。 APIマニュアルのJTableの項の「How to use table」を読むと、 その方法は、設定する値をObjectではなく、Integerオブジェクトに するだけで、右寄せになるとの事。早速やってみたところ、Integer あるいはFloat(多分Double)オブジェクトでも確かに右寄せになりました。 これはこれでいいのですが、それでは、Stringを右寄せにしたい時は どうするの?という疑問が湧きました。どなたか、ご存知の方いらっしゃいますか? また、そういうメソッドが別にあるのならば教えてください。

    • ベストアンサー
    • Java
  • getTableCellRendererComponentについて

    こんにちは。 JTableのレンダラを使った処理を作っているのですが どうしても分からないことがあったので、質問させていただきます。 テーブルセルの表示コンポーネントを取得する際に、 この表示コンポーネントが最後ということを知る手段を探しております。 以下に例を示します。 =========================================== 1.以下のような1~9までの数字を格納したJTableがあるとします。 1 2 3 4 5 6 7 8 9 2.このJTableをスクロールペインに格納します。 すると7,8,9が完全に隠れて、残りの数字が表示されるようになりました。 1 2 3 4 5 6 =========================================== このJTableを表示する際に1~6までのgetTableCellRendererComponentが呼び出されますが、 6が呼び出されたタイミングで特別な処理を実行したいのです。 なお、テーブルセルの高さは不定です。セル毎に任意の高さに調整することが可能なので、 必ずしも同じ行数が表示されるとは限りません。 処理の内容やソースを公開できればいいのですが、 当方の事情によりできませんので、 分かり辛い説明で恐縮ですが、 何かアドバイスがあれば教えてください。 別の方法を考えてみたらどうかという意見でも構いません。 以上です、宜しくお願いします。

    • ベストアンサー
    • Java
  • InputVerifierのフォーカス遷移について

    正しい入力を促すため、テキストフィールドにInputVerifierを設定しました。 以下に動作を記載致します。 【Tabで遷移を行った場合】 入力が"OK"の場合、遷移先へ遷移 入力が"OK"以外の場合、遷移しない(フォーカスは留まる) 【Tab+Shiftで遷移を行った場合】 入力が"OK"の場合、遷移先へ遷移 入力が"OK"以外の場合、フォーカスがどこかへ行ってしまう 入力が正しくない場合で、Tab+Shiftで遷移を行った場合もフォーカスが留まるようにしたいのですが、 何かいい方法はありますでしょうか? 以下がサンプルです。 ------------------------------------------------------------ import java.awt.*; import java.util.*; import java.awt.event.*; import javax.swing.*; public class VerifierTest extends JFrame { public VerifierTest() { JTextField tf1 = new JTextField ("入力"); getContentPane().add (tf1, BorderLayout.NORTH); tf1.setInputVerifier(new PassVerifier()); JTextField tf2 = new JTextField ("遷移先"); getContentPane().add (tf2, BorderLayout.SOUTH); WindowListener l = new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } }; addWindowListener(l); } class PassVerifier extends InputVerifier { public boolean verify(JComponent input) { JTextField tf = (JTextField) input; return "OK".equals(tf.getText()); } } public static void main(String[] args) { Frame f = new VerifierTest(); f.pack(); f.setVisible(true); } } ------------------------------------------------------------ 以上です。 よろしくお願いします。

    • ベストアンサー
    • Java
  • 複数の変数宣言を、for文で一気にやる方法ってありますでしょうか?

    複数の変数宣言を、for文で一気にやる方法ってありますでしょうか? たとえば、tfという変数を3つ作りたいとき、 var tf1:TextField = new TextField(); var tf2:TextField = new TextField(); var tf3:TextField = new TextField(); ↑このように普通に書くのではなく for(var i:int=0; i<3; i++){  var this["tf" + i]:TextField = new TextField(); } ↑このようにfor文で一気に書こうとしたのですがエラーになります。 複数の変数宣言を、for文で一気にやる方法ってありますでしょうか? ご存知のかたいらっしゃいましたら、よろしくお願いいたします。

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