<前の日記(2009年11月29日) 次の日記(2009年12月20日)> 最新 編集

高木浩光@自宅の日記

目次 はじめに 連絡先:blog@takagi-hiromitsu.jp
訪問者数 本日: 1330   昨日: 3744

2009年12月19日

久しぶりのSwing開発で躓いたところ

10年ぶりにSwingでデスクトップアプリを開発し、いつのまにか本格的に実用に耐えるフレームワークに仕上がっていたのを知った。NetBeans IDEはとても快適で、API仕様の確認やAPIライブラリのソースコードの確認も簡単にできる。わからない部分があっても、Web検索をすればたいていのことが解説されているのを発見できた。しかし、それでもいくつか、解決策がすぐには見つからない点があった。せっかくなのでここに書き残しておく。

1. テキストコンポーネントのHTML機能を殺す

Swingでは、登場した当初からテキストコンポーネントでHTMLが使えるようになっていた。つまり、テキストの冒頭が「<html>」で始まっていると、それ以降のテキストがHTMLとして解釈される。IEでセキュリティ問題を引き起こしたのと同根のうざい仕様だ。JavaScriptは使えないのでXSS脆弱性になることはないものの、表示するデータの出所によっては予期しないみっともない結果が生じ得る(巨大な文字を表示させられるとか)。

こういう前世紀的な悪仕様は廃止してもらいたい(デフォルトで無効に)ところだが、既に使われているものはそうもいかないのか、コンポーネントごとに putClientProperty で "html.disable" を Boolean.TRUE にすることで解決する策が、JDK 1.5になって導入されていた(Bug ID 4652898)。JTableでは各セルでセットしないといけないので、TableCellRenderer で putClientProperty して解決した。

import javax.swing.table.DefaultTableCellRenderer;
import java.awt.Component;
import javax.swing.JTable;

class HtmlDisabledTableCellRenderer extends DefaultTableCellRenderer {
    @Override
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
        super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
        putClientProperty("html.disable", Boolean.TRUE);
        return this;
    }
}

ところが、JTable の JToolTip にセルの内容を表示するようにしていたため、そっちも対策しないといけない。そこで、JTableをサブクラス化して createToolTip() メソッドをオーバーライドし、そこで putClientProperty するようにした。

import java.swing.JToolTip;

public JToolTip createToolTip() {
    JToolTip tip = new JToolTip();
    tip.setComponent(this);
    tip.putClientProperty("html.disable", Boolean.TRUE);
    return tip;
}

外部入力に依存する部分か否かに関わらず全てに対して無効化したいところなのに、こういう泥縄なやり方では気持ち悪い。Bug ID 4652898のコメント欄で指摘されているように、一括で無効化する手段を用意してほしいものだ。

2. Windowsでフォントを奇麗にする

Windowsで日本語を使うとフォントのかっこ悪さにげんなり。awt.useSystemAAFontSettings プロパティをセットし、各コンポーネントのフォントをメイリオにすることで、奇麗にできた。

System.setProperty("awt.useSystemAAFontSettings", "lcd");

import javax.swing.UIDefaults;
import javax.swing.UIManager;
import java.awt.Font;

UIDefaults ud = UIManager.getLookAndFeel().getDefaults();
ud.put("Panel.font", new Font("Meiryo", Font.PLAIN, 12));
ud.put("Label.font", new Font("Meiryo", Font.PLAIN, 12));
ud.put("TextField.font", new Font("Meiryo", Font.PLAIN, 11));
ud.put("TextArea.font", new Font("Meiryo", Font.PLAIN, 11));
ud.put("ToolTip.font", new Font("Meiryo", Font.PLAIN, 12));
ud.put("Button.font", new Font("Meiryo", Font.PLAIN, 12));
ud.put("Table.font", new Font("Meiryo", Font.PLAIN, 11));
ud.put("TableHeader.font", new Font("Meiryo", Font.PLAIN, 11));
ud.put("CheckBox.font", new Font("Meiryo", Font.PLAIN, 12));
(以下略)

参照

3. JLabelで省略表示「…」を左側に出したい

JLabelで表示するテキストがコンポーネントの幅を超えるとき、「…」で省略表示が出るようになっていて、通常、右側で省略されるようになっているが、これを左側で省略するようにしたい。

これがわからなかった。NetBeans IDEでもファイルのパス名表示で左側が「…」になっているのでできるはずなのだが、方法が見つからなかった。未だ解決していない。誰か教えて。

(解決策予定地) (追記)はてブコメントで教えて頂いた。以下の例のように、Rendererを自作するしかないみたい。

検索

<前の日記(2009年11月29日) 次の日記(2009年12月20日)> 最新 編集

最近のタイトル

2017年12月29日

2017年10月29日

2017年10月22日

2017年07月22日

2017年06月04日

2017年05月13日

2017年05月05日

2017年04月08日

2017年03月10日

2017年03月05日

2017年02月18日

2017年01月08日

2017年01月04日

2016年12月30日

2016年12月04日

2016年11月29日

2016年11月23日

2016年11月05日

2016年10月25日

2016年10月10日

2016年08月23日

2016年07月23日

2016年07月16日

2016年07月02日

2016年06月12日

2016年06月03日

2016年04月23日

2016年04月06日

2016年03月27日

2016年03月14日

2016年03月06日

2016年02月24日

2016年02月20日

2016年02月11日

2016年02月05日

2016年01月31日

2015年12月12日

2015年12月06日

2015年11月23日

2015年11月21日

2015年11月07日

2015年10月20日

2015年07月02日

2015年06月14日

2015年03月15日

2015年03月10日

2015年03月08日

2015年01月05日

2014年12月27日

2014年11月12日

2014年09月07日

2014年07月18日

2014年04月23日

2014年04月22日

2000|01|
2003|05|06|07|08|09|10|11|12|
2004|01|02|03|04|05|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|05|06|07|08|09|10|11|12|
2010|01|02|03|04|05|06|07|08|09|10|11|12|
2011|01|02|03|05|06|07|08|09|10|11|12|
2012|02|03|04|05|06|07|08|09|
2013|01|02|03|04|05|06|07|
2014|01|04|07|09|11|12|
2015|01|03|06|07|10|11|12|
2016|01|02|03|04|06|07|08|10|11|12|
2017|01|02|03|04|05|06|07|10|12|
<前の日記(2009年11月29日) 次の日記(2009年12月20日)> 最新 編集