• 締切済み

JTableでのCellRendererについて

お世話になります。 CellRendererの実装についてどうしてもうまくいかず、 一人で考えていても時間を使ってしまうだけと思い、 質問させていただきました。 現在ある2つの値を比較して、その値が違う場合に テーブルの特定のセルの背景色を変更したいと考えていて CellRendererを使用しているのですが、DefaultTableCellRendererを 継承した自作RendererクラスのgetTableCellRendererComponent メソッドでは特定のカラムしか選択、背景色の変更が 行われません。 (getTableCellRendererComponentのcolumnパラメータに 特定の値しかわたってこない) こういったご経験がある方がおりましたら打開策をご教授いただければと 思います。 よろしくお願いします。

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

みんなの回答

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

レンダラーの設定はカラムに対して行っていませんか? 設定されたカラムからしかレンダラーが呼ばれないでいるのだと推測できます。 全部のカラムの表示を自作のレンダラーで行うのであれば、全部のカラムに対してレンダラーを設定する必要があります。 TablecellRenderer ren0 = new MyRenderer0(); TablecellRenderer ren1 = new MyRenderer1(); jtable.getColumnModel().getColumn(0).setCellRenderer(ren0); jtable.getColumnModel().getColumn(1).setCellRenderer(ren1); とした場合、ren0はカラム0の表示の時だけ呼び出され、 ren1はカラム1の表示の時だけ呼び出されます。 全て同じレンダラーを使うのであれば、 jtable.getColumnModel().getColumn(0).setCellRenderer(ren0); jtable.getColumnModel().getColumn(1).setCellRenderer(ren0); としなければなりません。 これですと、カラム0、カラム1の表示にren0が呼び出されます。

関連するQ&A

  • JTableのカラム移動の抑止方法

    現在スクロールペイン(JScrollPane)上にテーブル(JTable)を乗せたGUI構成にしております。 そこで質問なのですが、この構成にすると、画面上でカラムの移動が出来ます。 (カラムヘッダー上でクリックし、そのまま左右に動かすと該当位置にカラム全体が移動します) これを抑止したいのですが、そういう事は可能ですか? または、今現在、そのテーブルのカラム背景色はDefaultTableCellRendererから派生させた独自クラス 内のgetTableCellRendererComponentをオーバーライドしたメソッド内で固定的に5列目だったら 赤みたいな処理を行っていますが、これをカラム移動されたイベントを拾って、動的に変更する事 は可能ですか? 現状、たとえば5列目(赤)を1列目などに移動させると当然、背景色は赤ではなくなって しまっています。 仕様的にカラム移動はマストでは無い為、このオペレーション自体の抑止、あるいは動的に背景色 を切り替えるどちらでも方法は構わないと思っております。 以上、よろしくお願いします。

    • ベストアンサー
    • Java
  • jtableの色付け

    swing初心者です。 以下のような、3×4の表 | 1 | 2 | 3 | 6 | | 2 | 3 | 4 | 9 | | 3 | 4 | 5 | 12 | を考えていて、(i,4)は(i,1)~(i,3)の値の合計が表示されます。(もし、(i,1)から(i,3)の値を変更すると、それに応じて、(i,4)の値も変わります。) このとき、(i,4)の値が20を超えたら、(i,4)の文字色を赤くしたいと思っています。 この(i,4)セルへの色付けができなくて、困っています。 *tableChangedを使って、条件(20を超えたら)を満たしたら該当セルの文字色を変更させる、というのを考えているのですが、tableChangedの内で特定のセルだけを変更するやり方がわかりません。 *DefaultTableCellRendererのgetTableCellRendererについても調べたのですが、今考えている問題の場合、どう使ったらよいのかわかりません。 宜しくお願いします。

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

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

    • ベストアンサー
    • Java
  • JTableでの入力規則に関して

    javaで作られる表(JTableなど)で、Excelでいうところの入力規則の様な事を実現したいです。 具体的に言うと、table上の1つの特定のセルを選択した後に、セルの内容を複数の選択肢の中(入力規則)から選んで、セルの内容を変更できる様なプログラムを作成したいです。 その様なことはおそらく可能であろうと予想しますが、具体的にどの様にやれば良いのかわからず、困っております。 ぜひともお力を貸していただきたいと考えております。

    • ベストアンサー
    • Java
  • Jtableの特定のセルの背景色や文字色について

    Jtable内部の特定のセルの背景色や文字色、フォントの変更に関して質問があります。25行30列のJtableの20行20列目のセルの背景色だけ赤色にしたい場合、具体的にどの様にプログラミングすれば良いでしょうか? サンプルソースなどを教えてくださるとありがたいです! javaに関して詳しい方、ぜひともお力を貸してください!

    • ベストアンサー
    • Java
  • JTableの特定セルの背景色を変更

    現在swingを勉強中です。 よろしくお願いします。 JTableで例えば、ある列の値が 1行目:10~100 2行目:20~40 3行目:80~120 4行目:150~200 のような範囲を持った値のとき、 範囲が重なっている1行目から3行目のセルの背景色を変更したいのですが、可能でしょうか。 おそらくTableCellRender等を使用するのかとは思うのですが…

    • ベストアンサー
    • Java
  • データベース(テーブル情報)操作方法に関して

    まだJAVAを初めて1ヶ月ちょいの初心者です。ぜひ教えて頂きたいことがあります。 データベースのテーブル操作に関してなんですが、どうコーディングしたら効率のよいプログラムになるのか検討段階でつまずいています。 今考えているのが、スーパークラスにてテーブルの各カラム変数を宣言し、そのサブクラスにてテーブル操作毎のSQL発行(スーパークラスから継承した抽象メソッドを用いて)をしたほうがいいのかなと考えてます。 つまり・・・ ----<<super class(抽象クラス)>>----- public abstract class InfoTable { private String name; private int age; : public String getName() { return Staff_ID; } public String setName(String name){ this.name = name } //抽象クラス(SQLを発行しテーブルを操 //作する抽象メソッド) public abstract boolean exec(); } とし、サブクラスにて継承&実装すればよいのかと・・・。 実際にテーブルのカラムが多くなれば、setter・getterを多く繰り替えし処理をしなければならなくなり、それは大変だし、プログラム的にもよくないんじゃないかと考えています。実際にサブクラスはサーブレットからデータを取得してから処理を行う予定なので、Vectorを使えばいいのかなとは思いますが、どう使ったらよいのか検討がつきません。 長々と書いてしまい申し訳ございません。 どなたか良い知恵をお貸し下さい!

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