ログインしてさらにmixiを楽しもう

コメントを投稿して情報交換!
更新通知を受け取って、最新情報をゲット!

Java質問&情報提供サイトコミュのテーブルモデルに色付け

  • mixiチェック
  • このエントリーをはてなブックマークに追加
いつもお世話になっております。

今回テーブルモデルを使い、セルの行毎に色を変えたいです。が、
それが出来ません><
例えば、学校のテストなどで、合格点が60点以上とし、
60点以上の学生は黒文字で表示、60点未満の学生は赤文字で表示させたいです。
この文字は、ユーザがセルをクリックしたときに色を変えるのではなく、
プログラムで判定させて、自動的に色付けを行いたいです。

色々調べてみたのですが、
オーバーライドさせるとか、レンダラがキーになるように書いてあるのですが、
いまいち分かりません。
テーブルモデルは、実はJLabelの集まりみたいな感じらしく、
今のままでは、全体の文字を赤、全体の背景を赤とかならできるのですが、
部分的に色変更させることがどうしても出来ません。
お手数をお掛けして申し訳ありませんが、よろしくお願いいたします。

テーブルモデルは、テーブルモデルクラスにAbstractTableModelを継承させてやっています。

コメント(5)

もう解決しちゃったかな。。。

    // JTable作成
    tb = new JTable(new StudentTableModel()); // テーブルモデルは適当
    // 得点の列を取得
    TableColumn scoreColumn = tb.getColumnModel().getColumn(1);
    // レンダラーを設定
    scoreColumn.setCellRenderer(new ScoreCellRenderer());


------------------------------------
  // セルレンダラー
  class ScoreCellRenderer extends DefaultTableCellRenderer {
    
    @Override
    public Component getTableCellRendererComponent(JTable table,
        Object value, boolean isSelected, boolean hasFocus, int row, int column) {
      // 得点
      int score = (Integer)value;
      // 60点以下の場合
      if(score <= 60) {
        setForeground(Color.red);
      } else {
        setForeground(table.getForeground());
      }
      return super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
    }
  }
素晴らしいです!(コ´ω`ジ)ノ 様ありがとうございます^^
すごく大きく前進することができました^^
あと少し手を加えたいですのが、簡単そうでなかなか上手くいきません><

テーブルに、学生の名前、得点、偏差値とあるのですが、
60点以下の学生の行単位で色を変えていきたいです。

行単位に変えたいので、
TableColumn scoreColumn = tbl.getColumnModel().getColumn(1);
を触ってみたのですが、やり方が悪いせいか、なかなかうまくいきません。 

// 60点以下の場合
if(score <= 60)
{
    setForeground(Color.red);
}
else
{
    setForeground(table.getForeground());
}

これを参考に、この処理を追加してみました。
if(score <= 60)
{
    setForeground(Color.red);
    row ++; //次の行指定(偏差値)
    setForeground(Color.red);
}
else
{
    setForeground(table.getForeground());
}

ですが、上手くいきませんでした><

再度お手数をお掛けいたしますが、よろしくお願いいたします。
前回は、カラムに対してレンダラーを指定しています。
今回は、行単位なのでテーブルに対してレンダラーを指定します。


    /*
    // 得点の列を取得
    TableColumn scoreColumn = tb.getColumnModel().getColumn(1);
    // レンダラーを設定
    scoreColumn.setCellRenderer(new ScoreCellRenderer());
    */
    tb.setDefaultRenderer(Object.class, new ScoreCellRenderer());

--------------------------------------------

行、列に関係なく呼び出されるので
処理する行の得点列の値を取得して判定します。

  class ScoreCellRenderer extends DefaultTableCellRenderer {

    @Override
    public Component getTableCellRendererComponent(JTable table,
        Object value, boolean isSelected, boolean hasFocus, int row, int column) {
      // 得点
      //int score = (Integer)value;
      int score = (Integer)table.getValueAt(row, 1);
      // 60点以下の場合
      if(score <= 60) {
        setForeground(Color.red);
      } else {
        setForeground(table.getForeground());
      }
      return super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
    }
  }

DefaultTableCellRendererがどう呼ばれているかは
http://java.sun.com/javase/ja/6/docs/ja/api/javax/swing/table/DefaultTableCellRenderer.html
などを読んでください。
(コ´ω`ジ)ノ 様、ありがとうございます^^

実行してみたのですが、テーブル全体の色が変わってしまいました。
この土日に、(コ´ω`ジ)ノ 様のソースを参考に、
色々調べてやってみます。

もし、どうしても行き詰った時は申し訳ありませんが、
またお力を貸して下さると助かります。よろしくお願いいたします。
本日、無事、色付けを完成させることができました。
(コ´ω`ジ)ノ 様、ありがとうございます^^
またよろしくお願いいたします。

ログインすると、みんなのコメントがもっと見れるよ

mixiユーザー
ログインしてコメントしよう!

Java質問&情報提供サイト 更新情報

Java質問&情報提供サイトのメンバーはこんなコミュニティにも参加しています

星印の数は、共通して参加しているメンバーが多いほど増えます。