« July 2006 | Main | September 2006 »

August 2006

2006.08.30

Trac 0.10beta1

 Trac0.10b1リリース。

 結構いろいろとパワーアップしています。
 バックエンドとしてSubversion以外を使うつもりはないのですが、リポジトリブラウザでZipダウンロードがサポートされていたりしますし(TortoiseSVNを入れていない環境でファイルをまとめてダウンロードする場合に楽)。
 とはいうものの、まぁ、まだしばらくは様子見かなぁ。普段使用しているプラグインが動いてくれるかどうか、っていうのもありますし(^^;

#微妙にあれこれ手を加えて使用しているので、頻繁にバージョンアップするのが手間っていうのもあるのですが。

| | Comments (0) | TrackBack (0)

2006.08.21

JUnit4&Eclipse&djUnit(JUnit4TestAdapter)

 JUnit4を使うと、アノテーションでサクッとテストを作成することが出来ますが、そのままではdjUnitが使えないことが難点。

 ただ、さすがにその辺はちゃんと考えられているようで、JUnit4のテストケースをJUnit3までしか対応していないツール(Eclipse3.1とか)で実行するためのAdapterが存在します。

package test;
import org.junit.Test;
import static org.junit.Assert.*;

public class HogeTest {
  public static junit.framework.Test suite() {
    return new JUnit4TestAdapter(HogeTest.class);
  }

  @Test
  public void hogeTest() throws Exception {
    assertEquals("hoge", Hoge.hoge());
  }
}

こんな感じ。
djUnitも問題なく実行でき、カバレッジ情報を取得することが出来ます。

| | Comments (0) | TrackBack (1)

2006.08.13

Acrobat&AdobeReader

 Acrobat6とAdobeReader7が同居しているPC(PDFを開く場合、通常はAdobeReader7を使用)。
 PDFを編集しようと、Explorerのコンテキストメニューの「送る」からAcrobat6を選択。・・・なぜかReader7が起動してしまう??
 試しにProgram Filesフォルダ内のAcrobat6のフォルダから直接起動しても、Reader7が起動。

 う~ん・・・と悩みつつ、ふとタスクマネージャに居座っているAcroRd32.exeを強制終了すると、問題なくAcrobat6が起動するように。一度Reader7でPDFを閲覧してしまうとこんな現象が発生してしまうのかなぁ? これまではそんなことなかったような気がするんですが・・・(PDF閲覧にAcrobat6は起動が遅すぎるし、Acrobat7を買えばいいのかもしれませんが、それだけの必然性が(^^;)。

| | Comments (0) | TrackBack (0)

2006.08.05

Tableの内容をソート

 Java6からRowSorterを用いることで、(Javaの標準コンポーネントの範囲内で)簡単にソート機能付きのテーブルを作成できるようになりました。実際にJTableと組み合わせるとなると、DefaultRowSorter(フィルタリング用のメソッド等が追加されている)かTableRowSorter(Modelとの組み合わせ)をベースに使用することになるかと思いますが。

 とりあえずの基本形は(JavaDocにも記載されていますが)こんな感じ(b86の場合)。

TableModel model = new HogeTableModel();
JTable table = new JTable(model);
RowSorter sorter = new TableRowSorter(model);
table.setRowSorter(sorter);

 複数列のソートを使用する場合は、DefaultRowSorterあるいはTableRowSorterを使用して、

TableRowSorter sorter = new TableRowSorter(model);
sorter.setMaxSortKeys(3);  //3つまでをキーとする場合
table.setRowSorter(sorter);

といった感じ。

 ただ、この場合、ヘッダー部分は最後に選択した列にしかマークが付かないため、第2のキーがどの列かっていうのがわかりにくいのが難点です(^^;
 ちなみに、並び順の初期状態をセットする場合は、

List s = new ArrayList();
s.add(new RowSorter.SortKey(0, SortOrder.DESCENDING));
sorter.setSortKeys(s);

ってやると、最初の列を降順で並べ替えた状態となります。

 余談ですが、RowSorterをセットした状態でテーブルの内容が0行になってしまった場合、ArrayIndexOutOfBoundsExceptionがスローされてしまうようです。ソースを見た感じ、bugのような気がするので、最新版では修正されているかもしれませんが・・・。
 とりあえずごまかす場合は、

sorter = new TableRowSorter(model) {
  @Override
  public int convertRowIndexToView(int index) {
    if (super.getModel().getRowCount() == 0) return 0;
    return super.convertRowIndexToView(index);
  }
  @Override
  public int convertRowIndexToModel(int index) {
    if (super.getModel().getRowCount() == 0) return 0;
    return super.convertRowIndexToModel(index);
  }
};

ってな感じで「見た目の行番号」「内部(model)の行番号」を変換する部分をオーバーライドしてあげると回避できるようです。

| | Comments (0) | TrackBack (0)

2006.08.04

JOptionPaneでカーソルキーを反応させる

 JOptionPaneを使用すると、「はい」「いいえ」の2択ダイアログなどを

int ret = JOptionPane.showConfirmDialog(
  this,
  "終了します。\nよろしいですか?",
  "確認",
  JOptionPane.YES_NO_OPTION,
  JOptionPane.QUESTION_MESSAGE);

ってな感じでサクッと作ることが出来ますが、デフォルトの状態ではいくつか難点が。

  • 左右のカーソルキーでフォーカスが移動しない。
  • ボタンにはY/Nが表示されているが、そのままでは反応しない(ALT+Y/ALT+Nは反応します)。

     んなわけで、何とかならないかなぁ、ということでこんなの作ってみました。無名インナークラスとして作成していますが、単独のクラスとして切り出すことによりいろんなところで使い回すことが出来ると思います。

    private KeyEventDispatcher dialogKeyEventDispatcher = new KeyEventDispatcher() {
      public boolean dispatchKeyEvent(KeyEvent e) {
        if (e.getID() == KeyEvent.KEY_PRESSED) {
          if (e.getKeyCode() == KeyEvent.VK_RIGHT) {
            KeyboardFocusManager.getCurrentKeyboardFocusManager().focusNextComponent();
            return true;
          } else if (e.getKeyCode() == KeyEvent.VK_LEFT) {
            KeyboardFocusManager.getCurrentKeyboardFocusManager().focusPreviousComponent();
            return true;
          } else if (e.getKeyCode() == KeyEvent.VK_Y || e.getKeyCode() == KeyEvent.VK_N) {
            // ALTをマスクした状態で新しいイベントとして処理を委譲します。
            KeyboardFocusManager.getCurrentKeyboardFocusManager().dispatchKeyEvent(
              new KeyEvent(
                (Component)e.getSource(),
                e.getID(),
                e.getWhen(),
                KeyEvent.ALT_DOWN_MASK,
                e.getKeyCode(),
                e.getKeyChar()));
            return true;
          }
        }
      return KeyboardFocusManager.getCurrentKeyboardFocusManager().dispatchKeyEvent(e);
      }
    };

    新しいイベントを作り直してそれを投げ直しているのが、果たして行儀がいいのかどうか(^^;

  • | | Comments (0) | TrackBack (0)

    « July 2006 | Main | September 2006 »