質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

2回答

4602閲覧

JTable ソート指定時の ヘッダーカラムの背景色指定の方法

taka_miyata

総合スコア18

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2016/02/13 08:31

編集2016/02/14 09:07

Java 1.6 で JTableを使用しています。

JTableのヘッダーカラムでのソートを setAutoCreateRowSorterや
TableRowSorter を使用し、ソート可能にしました。

すると、カラム名に ソートのアイコン(△)が表示されるようになり、
ソート可能となりました。
ですが、ヘッダーカラムの背景色を設定しようとし、setBackgroundで
Colorを指定しても、効果がありません。

以下のコードです。

java

1 JTableHeader tableHeader = jTable.getTableHeader(); 2 tableHeader.setBackground( Color.BLACK ); // これは効かない 3 tableHeader.setForeground( Color.BLACK ); // これは効く 4 tableHeader.setBorder( // これは効いてそう 5 javax.swing.BorderFactory.createEtchedBorder( 6 javax.swing.border.EtchedBorder.RAISED, colors[2], null ) ); 7 8 tableHeader.setFont( font ); // これは効く 9 tableHeader.setOpaque( true ); 10

この他に、TableCellRenderer をJLabel 継承で実装したし、内部で色を指定したりしました。
この場合、背景色を設定可能でしたが、ソートアイコンがカラム名より
消えてしまいました。

そもそも、実装が間違っていますか。

実行すると、このようになります。
これは、tableHeader.setBackground( Color.BLUE );
tableHeader.setForeground( Color.WHITE ); です。
java( ビルド 1.6.0_13-b03)
バージョンが古い為でしょうか。

java

1 JTable jTable = new JTable( 3,3 ); 2 jTable.setAutoCreateRowSorter( true ); 3 JTableHeader head = jTable.getTableHeader(); 4 head.setBackground( Color.BLUE ); 5 head.setForeground( Color.WHITE ); 6 head.setOpaque( true ); 7 jScrollPane1.setViewportView( jTable ); 8

この後、java1.8 Update40 64-bitで、同様のコードを実装しましたが、
残念ながら、結果は一緒でした。
JScrollPaneは、JPanelに addしています。
これが、問題でしょうか。

イメージ説明

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

(解決後の追記)

NetBeansで開発していたため、NimbusLookAndFeelで動作してしたことが原因だったようです。

NetBeansで「JFrameフォーム」を追加して作成すると、作成したJFrameフォームクラスにNimbusLookAndFeelを優先して使用するコードが追加されます。
ただ、おそらくですがWindowsLookAndFeelNimbusLookAndFeelではJTableHeaderの背景色は変えることはできません。



(最初の回答)

特別おかしなところは無いと思いますが、他にも複合的な要素が入ってきたりすると、どうなるかは分かりません。

試しに、下記コードをWindows7 64bitのJDK6u45で実行したところ、画像のようになりました。

レンダラーをJLabelなどで実装した場合は、そちらで上書きされてしまうので、何かしらの考慮が必要です。

  • 実行結果

  • サンプルコード

lang

1import java.awt.*; 2import javax.swing.*; 3import javax.swing.table.JTableHeader; 4 5public final class App { 6 7 static JComponent buildComponent() { 8 JTable jTable = new JTable(3, 3); 9 jTable.setAutoCreateRowSorter(true); 10 JTableHeader tableHeader = jTable.getTableHeader(); 11 tableHeader.setBackground(Color.GREEN); 12 tableHeader.setForeground(Color.WHITE); 13 tableHeader.setBorder(javax.swing.BorderFactory.createEtchedBorder(javax.swing.border.EtchedBorder.RAISED, 14 Color.RED, null)); 15 tableHeader.setFont(Font.getFont("serif")); 16 tableHeader.setOpaque(true); 17 JScrollPane sp = new JScrollPane(jTable); 18 return sp; 19 } 20 21 public static void main(String[] args) { 22 SwingUtilities.invokeLater(new Runnable() { 23 public void run() { 24 JFrame f = new JFrame("test"); 25 f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 26 f.setSize(300, 200); 27 f.setLocationRelativeTo(null); 28 f.add(buildComponent(), BorderLayout.CENTER); 29 f.setVisible(true); 30 } 31 }); 32 } 33 34}

投稿2016/02/13 14:20

編集2016/02/15 05:37
argius

総合スコア9388

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

taka_miyata

2016/02/14 08:20

ありがとうございます。 こちらで、一度、同じように単純なコードを試してみました。 どうしても、上手く行きません。 javaのバージョンと、こちらで再度確認したソースを記述させていただきました。
argius

2016/02/14 09:00

ソースを掲載していただきありがとうございます。 同じくWindows7のJDK6u45で試したところ、ちゃんとヘッダーが青くなりました。 OSも違うみたいですね。Look&Feelのバグなのかも知れません。 OSのバージョンも教えていただけますか?
argius

2016/02/14 09:41

追加情報です。 Windows7 64bitと最新のJava(JRE8u73)で、Look&FeelをWindowsLookAndFeelやNimbusLookAndFeelにしてみたところ、再現しました。 Look&Feelによっては、テーブルヘッダーの背景色がサポートされていないのかもしれません。 私の上手く行っているケースはWindowsの場合の標準のMetalLookAndFeelを使ったものです。
taka_miyata

2016/02/14 11:31

ありがとうございます。 こちらのOS環境は、java1.6 がwindows7, java1.8がwindows10です。 また、開発環境は、netbeans 6.5 と netbeans8.0です。 無知で、申し訳ありませんが、Look&Feel の指定は、どのように行うのでしょうか。 また、JTableのみ、Look&Feelを MetalLookAndFeel に 指定できるものなのでしょうか。 いろいろ、検証していただき、大変ありがたいです。
argius

2016/02/15 05:16 編集

なるほど、NetBeansの新規JFrameフォーム追加からJFrameを作成しているんですね。 その作成したJFrameのクラスのソースを見ると分かりますが、Nimbus(NimbusLookAndFeel)が有効な場合はそれを採用するようなコードが設定されています。 これをtry文ごとコメントアウトしてみれば、MetalLookAndFeelで動作するようになると思います。
guest

0

客先に、現状では、背景色が変えられない旨を説明し、
了解を得る事で、今回は通せました。

色々、検証ありがとうございました。

投稿2016/02/15 04:46

taka_miyata

総合スコア18

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

argius

2016/02/15 05:15

NimbusLookAndFeelで作るのが要件だったんですね。 解決ではなかったですが、了承を得られて良かったですね。 なお、コメントに今回のポイントが記載されていると思いますので、 回答欄にもその要約を記載させていただきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問