- ベストアンサー
JavaのJTableのセル単体の色設定
- JavaのJtableの『マウスで選択したセル』の色を赤色に設定するコードを紹介しているが、セル単体でバックグランドの色が変更できず、行単位で変更される問題がある。
- 質問者はセル単体でのバックグランドの変更を行いたいが、クリックと同時に変更されるように改善したいと質問している。
- 質問者はJavaの初心者であり、コードを添付している。
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
(1) 意図したとおりに色が変わらない理由 質問者さんのコードではmousePressedでクリック位置のComponentを取得し、それが一つのセルを表現するJTableの子供コンポーネントであろうと想像して実装しているようですが、JTableは一つ一つのセルに個別のComponentを配置しているわけではないのでこれではうまくいきません。通常、JTableは描画専用のダミーのComponentのインスタンスを密かに保持しており、再描画するセルの領域位置にこのダミーComponentを位置付けてからそれを通じてセル領域を描画するという若干トリッキーなことをしています。(こうしている理由は多分性能的なオーバーヘッドを避けるためだと思います。) (2) どうすればよいか - JTableのセル状態と描画 JTableのセルで言えば「選択状態」「フォーカス状態」「どちらでもない状態」があります。デフォルトの選択モデルでは複数の行を選択するようになっています。質問者さんの意図はマウスクリックした単一セルということなので、「選択状態」を行ではなく単体のセルにするか、フォーカス状態のセルの描画を変更するかのどちらかになります。 選択状態のセルの前景色と背景色はそれをずばり設定するメソッドがあるので、選択対象を単一セルにすれば一番簡単なようですが自分ではやったことがないのでその方法は後述するページなどで調べてみてください。 もう一つのフォーカス状態の色を変える方法は簡単に設定するメソッドがないのですが自前のTableCellRendererを定義してセルの状態に応じて前景色と背景色を変えれば実現できます。(おそらくデフォルトのLook&Feelではフォーカス状態のセルをアウトライン表示していると思いますが下記のコードでは省略しています) JTableTest2(String name) { ... final JTable tablex = new JTable(tm); tablex.setDefaultRenderer(Object.class, new MyTableCellRenderer()); ... } private class MyTableCellRenderer extends JLabel implements TableCellRenderer { @Override public Component getTableCellRendererComponent( JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { setText(value.toString()); if (hasFocus) { // フォーカス状態のセル=最後にマウスクリックしたセル setForeground(Color.BLUE); setBackground(Color.RED); } else if (isSelected) { // 選択状態のセル setForeground(table.getSelectionForeground()); setBackground(table.getSelectionBackground()); } else { // それ以外のセル setForeground(table.getForeground()); setBackground(table.getBackground()); } setOpaque(true); // こうしないと背景が透明の扱いになるので return this; } } なお、選択対象をどのようにカスタマイズ可能かはAPI Documentや下記のOracleのサンプルを参考にしてみてください。 http://docs.oracle.com/javase/tutorial/uiswing/components/table.html#selection
補足
コメント有難う御座います。 説明して頂きました、JTableの構造(「選択状態」「フォーカス状態」「どちらでもない状態」)につきましては、これから勉強しなければなりません。この構造が理解できますと、多分貴方のコメントが 理解できる様になるとおもいます。 私は、まだAPIのDocumentやOracleのサンプルを参考を拝見したことが無いので、これから 少しづつ、出来るだけ早く調べてみます。 その前に、Javaの入門書を理解しなければなりません。 何れにしても、セル単位のバックグランドの設定が可能な情報を頂きまして有難う御座います。 以上