- PR -

JTableのヘッダーの左寄せの文字欠け

1
投稿者投稿内容
tsuyori
常連さん
会議室デビュー日: 2002/06/18
投稿数: 23
投稿日時: 2006-02-16 14:07
つよりと申します。
お世話になっております。

JTableを使っているのですが、ヘッダーの項目名を左寄せにしようとしていました。

項目の左寄せはできるのですが、左寄せした文字の一部が項目の区切り線にかぶってしまい、欠けてしまいます。
「開始」の開のように左いっぱいにある文字が欠けてしまいます。

Look&FeelはMetalです。
JDKは1.5です。

Look&FeelがWindowsであれば、問題がないのですが、Metalのときはこの欠ける現象が発生してしまいます。

コードは以下の通りです。

CellRendererを使用しての回避方法を考えたのですが、背景色や枠がなくなってしまいうまく描画することができませんでした。

解決策をご存知の方はおりますでしょうか。


/* テーブルの生成 */
JTable jTable1 = new JTable();

/* ヘッダーの取得 */
JTableHeader header = jTable1.getTableHeader();
TableColumnModel columnModel = header.getColumnModel();
/* ヘッダーの左寄せ */
DefaultTableCellRenderer headerRenderer = ( DefaultTableCellRenderer )
header.getDefaultRenderer();
headerRenderer.setHorizontalAlignment( SwingConstants.LEFT );

nekoyama
ベテラン
会議室デビュー日: 2005/03/12
投稿数: 71
投稿日時: 2006-02-16 17:36
Look&FeelがMetalの場合、確かに文字が欠けますね。

私が簡単に思いつく解決方法は、以下の3つです。

1.TableCellRendererを実装したクラスの描画で解決
2.DefaultTableCellRenderer を継承したレンダラを使うのであれば、
paint系メソッドのオーバーライドで解決
3.DefaultTableCellRendererでアイコンを使用しないか、Iconをラップしたり、
小細工して使用することを前提とすれば、下記でも解決できるでしょう。
あまり、お勧めできませんが。
setIcon(getIconWidth()で左のボーダーとかぶらない適当な値を返すIconを
実装したダミーのIconオブジェクト、またはアイコンの幅に適当な値を加算した値を返すgetIconWidth()メソッドを実装したIcon実装オブジェクト),
setHorizontalTextPosition(DefaultTableCellRenderer.RIGHT),//アイコンの右側に文字列を表示
setHorizontalAlignment(DefaultTableCellRenderer.LEFT) //文字列の左寄せ

>CellRendererを使用しての回避方法を考えたのですが、背景色や枠がなくなってしまい
>うまく描画することができませんでした。
DefaultTableCellRendererのソースを読めば、適切な使用方法が分かると思います。
tsuyori
常連さん
会議室デビュー日: 2002/06/18
投稿数: 23
投稿日時: 2006-02-17 18:36
ありがとうごさいます。

1.TableCellRendererをの実装で対応してみます。
DefaultTableCellRendererのクラスを確認してみます。

ありがとうごさいました。
tsuyori
常連さん
会議室デビュー日: 2002/06/18
投稿数: 23
投稿日時: 2006-03-13 18:33
TableCellRendererを以下のように実装したところできました。
ありがとうございました。

public Component getTableCellRendererComponent(
JTable table,
Object value,
boolean isSelected,
boolean hasFocus,
int row,
int column ){

setFont( table.getFont() );
/* 境界線の設定、左寄せ時のスペースを確保する */
Border border = UIManager.getBorder( "TableHeader.cellBorder" );
Border setBorder = BorderFactory.createCompoundBorder( border, new EmptyBorder( 0, 1, 0, 0 ) );
setBorder( setBorder );

setValue( value );

/* 左寄せ */
setHorizontalAlignment( SwingConstants.LEFT );

return this;
}
1

スキルアップ/キャリアアップ(JOB@IT)