このページで解決しない高度なJavaのシステム障害はJaTSにお任せください

Trouble 16: SWT/JFaceに関する問題



<Q16-1>パスワードフィールドを利用したい。

パスワード入力欄に文字を打つと,ふつう「*」を 表示させると思います。SwingではJPasswordFieldクラスで実現できましたが、SWTで同じようなクラスが見当たりません。どうすれば実現できるでしょうか?

<A16-1>
SWT 3.0以前では、Textウィジットに対して setEchoCharメソッドを以下のように呼び出すことで、入力した文字のかわりに引数で指定した文字を表示することができました。

text.setEchoChar('*');

SWT 3.0では、さらに簡単に実現できるようになっています。Textウィジットのインスタンスを生成するときに、コンストラクタの引数にSWT.PASSWORDを指定します(PasswordFieldSample.javaの①)。こうすると、図1のようにパスワードフィールド実現することができます。


■PasswordFieldSample.java
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;

public class PasswordFieldSample
{
  public static void main(String[] args)
  {
    Display display = new Display();
    Shell shell = new Shell(display);
    shell.setText("パスワードフィールドサンプル");
    shell.setSize(240, 60);

    // SWT.PASSWORDを指定する
    Text text =
      new Text(shell, SWT.PASSWORD | SWT.BORDER); // ①
    text.setBounds(10, 10, 210, 15);

    shell.open();

    while (!shell.isDisposed())
    {
      display.readAndDispatch();
      display.sleep();
    }
    display.dispose();
  }
}

Page Top

<Q16-2>リストの項目数を変更したい。

Comboクラスで表示するコンボボックスにいくつ項目を追加しても、ドロップダウンリストに一度に表示される項目数は5個までです。使い勝手をよくするために表示数を増やすことができないでしょうか?

<A16-2>
SWT 3.0で新たなAPIが追加され、一度に表示できる項目数が変更できるようになりました。項目数を引数としてComboクラスのsetVisibleItemCount()メソッドを呼び出すことで設定することができます(図2)。

表示項目数を増やしたコンボボックス
図2●表示項目数を増やしたコンボボックス

Page Top

<Q16-3>「新しいウィンドウで開く」をフックしたい。

BrowserクラスでWebブラウザを作ったはいいのですが、『新しいウィンドウで開く』機能は無効になっているようです。そこで、このメニューがクリックされた場合に別ウィンドウを表示させるようにしたいのですが、クリック操作を検知するにはどうすればよいでしょうか?

<A16-3>
Browserクラスでは、ウィンドウの生成、最大・最小化、終了時にorg.eclipse.swt.browser.WindowEventが発生します。そこで、Browserクラスのインスタンスに対して、org.eclipse.swt.browser.OpenWindowListenerの実装クラスをセットしておくことで、このイベントを検知できるようになります。
なお、上記処理を実装したサンプルコードはWindowEventのAPIリファレンスに載っていますので、参考にしてください。
Page Top

<Q16-4>IMEのON/OFFを自動で行いたい。

気の利いたアプリケーションでは、日本語を入力すべきテキストフィールドにフォーカスが移ったとき、自動的にIMEの状態を変更して日本語入力できるようにしてくれます。SWTで同じようなことが実現できないでしょうか。

<A16-4>
ShellクラスのsetImeInputMode()メソッドを使用することで、IMEの状態を制御できます。引数で変更したいIMEの状態を指定します。定数と状態の関係を表にまとめましたので参考にしてください。通常はSWT.NATIVEを指定すればよいでしょう。
実際にはTextウィジットに以下のようなFocusListenerを追加し、その中でIMEの状態を変更するようにすれば、テキストフィールドにフォーカスが移ったタイミングでIMEの状態を制御することができます。

●setImeInputModeに指定する定数
定数 状態
SWT.NONE OFF
SWT.ROMAN OFF
SWT.DBCS 全角英数
SWT.PHONETIC 半角カナ
SWT.NATIVE ひらがな
SWT.ALPHA 半角英数

■FocusListenerの例

FocusListenertext.addFocusListener(
  new FocusListener()
  {
    public void focusGained(FocusEvent event)
    {
      getShell().setImeInputMode(SWT.NATIVE);
    }

    public void focusLost(FocusEvent event)
    {
    }
  }
);

Page Top

<Q16-5>ちらつきを回避するためにダブルバッファリングを利用したい。

Canvasクラスに図を描画しているのですが、再描画時に画面がちらついてしまいます。ちらつきを回避するためのダブルバッファリングを実現するにはどうすればよいですか?

<A16-5>
ダブルバッファリングを実現するには、PaintListenerのpaintControl()メソッドを実装する必要があります。ダブルバッファリングを実現するために、一時的に描画するためのImageインスタンスを生成しておき、描画時にインスタンスを差し替えます(ダブルバッファリングのコードの①)。
また、描画対象となるCompositeのスタイルにSWT.NO_BACKGROUNDを指定しておかないと、画面のちらつきは発生してしまいます。通常、Compositeは子Compositeを再描画する前に、自身の背景色によって領域を再描画する仕組みとなっています。そこで、スタイルにSWT.NO_BACKGROUNDを指定することで、背景色による描画処理を抑制することができるのです。

■ダブルバッファリングのコード
control.addPaintListener(new PaintListener()
{
  public void paintControl(PaintEvent event)
  {
    Image bufferedImage = new Image(display, width, height); // ①
    GC bufferedGC = new GC(bufferedImage);
    event.gc.drawImage(bufferedImage, 0, 0);
  }
}


■描画対象へのスタイル指定
Canvas canvas = new Canvas(parent, SWT.NO_BACKGROUND);

Page Top

<Q16-6>テーブル描画を高速にしたい。

SWTのテーブルは描画速度が遅いため、アプリケーションのパフォーマンスを向上させられません。改善できないでしょうか。

<A16-6>
Tableインスタンス生成時に、スタイルに、SWT.VIRTUALを指定してください。従来はTableインスタンス生成と同時に、内部のTableItemもすべて生成されていたため、大量のデータを扱う場合に、性能が著しく低下していました。しかし、SWT 3.0から加えられたこのスタイルを指定すると、TableItemは必要に応じて生成されることになります。
参考までに、SWT.VIRTUALを指定した場合/しなかった場合での、100万件のデータ表示処理時間を表に示します。なお、実行環境は次のとおりです。

<実行環境>
CPU
メモリ
OS
Athlon XP 2200+
1Gバイト
Windows XP SP1

このように、大量のデータを表示しなければならない場合、表示パフォーマンスが大きく向上するようです。

SWT.VIRTUAL 1回目 2回目 3回目
指定あり 29.001 (sec) 28.720 (sec) 28.782 (sec)
指定なし 49.658 (sec) 49.517 (sec) 49.564 (sec)

注)Table に対して100 万個のランダムな数値を表示するサンプルプログラムにおいて、SWT.VIRTUAL を指定した場合とそうでない場合で表示に要する時間を計測しています。

■SWT.VIRTUALのスタイル指定

Table table = new Table(parent, SWT.VIRTUAL);

Page Top

<Q16-7>ウィンドウの左上のアイコンを独自のアイコン画像へ変更したい。

ウィンドウの左上に表示されるアイコンを独自のアイコン画像へ変更したいのですが、どうすればよいのでしょうか?

<A16-7>
ウィンドウアイコン変更の例
図3●ウィンドウアイコン変更の例

この例ではEclipseのアイコンを拝借しています。
また、該当ファイルの置き場所はプロジェクトフォルダ\imageとしています。

■WindowIconSample.java
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.ImageData;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;

public class WindowIconSample
{
  public static void main(String[] args)
  {
    Display display = new Display();
    Shell shell = new Shell(display);
    shell.setText("Windowアイコン設定");
    shell.setSize(200, 50);

    ImageData imgData =
      new ImageData("image/eclipse.gif");
    Image img =
      new Image(shell.getDisplay(), imgData); // ① Imageオブジェクトを生成
    shell.setImage(img);

    shell.open();

    while (!shell.isDisposed())
    {
      display.readAndDispatch();
      display.sleep();
    }

    // ② 明示的なオブジェクト破棄処理
    img.dispose();
    display.dispose();
  }
}

Page Top

<Q16-8>テーブル列幅を自動調整したい。

テーブルに表示する文字列を変更すると、列の幅が不足して、表示している文字列が欠けてしまいます(図4)。
これを自動的に適切な幅に調整することはできないでしょうか。

列幅が不足しているテーブルの例
図4●列幅が不足しているテーブルの例

<A16-8>
TableColumn#pack()メソッドを呼び出すことで調整できます。
具体的には下のコードのように、TableオブジェクトからgetColumns()メソッドを使用してTableColumn オブジェクトの配列を取得し、そのpack()メソッドを順次呼び出します(①)。
これで、テーブルの列幅を表示内容に合わせた最適な幅に設定することができます(図5)。
表示データの多いテーブルでちらつきが気になる場合は、処理の前後でsetVisible( )メソッドを使用して一時的に描画を止めておくとよいでしょう(②)。

列幅調整後のテーブルの例
図5●列幅調整後のテーブルの例

■テーブルの列幅を調整するコード
// ② 一時的に描画を止める。
table.setVisible(false);

// ① 最適な列幅に設定する。
TableColumn[] columns = table.getColumns();
for (int cnt = 0; cnt < columns.length; cnt++) 
{
  columns[cnt].pack();
}

// ② 描画を再開する。
table.setVisible(true);

Page Top

<Q16-9>SWT上でグラフを作成したい。

SWT上でグラフを作成したいのですが、何か簡単な方法はありませんか?

<A16-9>
SWT 3.0で追加されたAWT/Swingウィジット表示機能により、SwingベースのクラスライブラリであるJFreeChart(注1)を利用すると、容易に実現できます。
図6に示す例では、左のディレクトリツリーはSWT、右のグラフはSwingコンポーネントであるJFreeChartで描画されています。

SWT上にJFreeChartを表示したサンプル
図6●SWT上にJFreeChartを表示したサンプル

まずSWT_AWT.new_Frame()でjava.awt.Frameを取得します(①)。
ここでnew_Frame()に引数として渡しているのはグラフ描画用のCompositeです。
次にグラフを作り(②)、グラフからorg.jfree.chart.ChartPanelを作ります(③)。
ChartPanel はjavax.swing.JPanel を継承しており、JFreeChartで実装されているチャートを表示するためのクラスです。
最後にnew_Frame()メソッドで取得したFrameにChartPanelを貼り付けます(④)。
その他、SWT上でAWT/Swingコンポーネントを利用する方法については、本特集第1章を参考にしてください。

注1)http://www.jfree.org/jfreechart/

■SWTにJFreeChartを表示するコード
// ① java.awt.Frameの取得
Frame graphFrame = SWT_AWT.new_Frame(graphComp);
Panel panel = new Panel(new BorderLayout());
final DefaultCategoryDataset dataset = new DefaultCategoryDataset();
dataset.addValue(23.0, "Series 1", "London");
~中略~
dataset.addValue(9.0, "Series 3", "Cairo");

// ② パネルを作成する。
final JFreeChart chart = createChart(dataset);
final ChartPanel chartPanel = new ChartPanel(chart);
chartPanel.setPreferredSize(new java.awt.Dimension(500, 270));

// ③ パネルにグラフを追加する。
panel.add(chartPanel);
graphFrame.add(panel);

Page Top

<Q16-10>図形描画に使用するための、高度な機能を備えたクラスやライブラリはありませんか?

Canvasクラスに対して、図形を描画しようとしているのですが、GCクラスには直線や楕円など基本的なものしか用意されていないようです。
もう少し高度な機能を備えたクラスやライブラリはないですか?

<A16-10>
Eclipseの標準プラグインとしては含まれていませんが、Draw2dパッケージが存在します。
EclipseサブプロジェクトであるGEFのプラグイン(注1)に含まれています。
Draw2dでは、図形の移動や回転、レイアウト、レイヤ構造といった機能をサポートしています。
図7は、eclipse.orgのCVSリポジトリ(注2)で提供されているDraw2dのサンプル例です。
Web上ではお伝えしにくいのですが、ツリー構造となっている図形のレイアウト変更やツリー開閉アニメーションを確認することができます。
また、Java2D の機能を利用して生成した画像をSWTやDraw2dの画素に表示させることも可能です。
オフスクリーンレンダリングによって生成した画像をSWTのウィジットに貼り付けることになります。
具体的な方法については、次のサイトが参考になります。

http://www-6.ibm.com/jp/developerworks/java/040702/j_j-2dswt.html

注1)GEFのサイト:http://www.eclipse.org/gef/
注2):pserver:anonymous@dev.eclipse.org:/home/tools

Draw2d サンプル例
図7●Draw2d サンプル例

Page Top

<Q16-11>ステータスバーを実現したい。

多くのアプリケーションで採用されているようなステータスバーを表示したいのですが、レイアウトが面倒でなかなかうまくできません。
簡単に実現できる方法はないでしょうか。

<A16-11>
JFaceでは、メソッド1つでステータスバーを実現できます。
まず、ApplicationWindowを継承したクラスのコンストラクタで、addStatusLine()メソッドを呼び出します(①)。
ステータスバーへ文字列を表示するには、setStatus()メソッドを使用します(②)。
これで、図8のようにステータスバーを持つウィンドウを簡単に実現することができます。

■StatusLineTest.java
public class StatusLineTest extends ApplicationWindow
{
  public StatusLineTest()
  {
    super(null);

    // ① ステータスバーを追加する。
    addStatusLine();
  }

  protected Control createContents(Composite parent)
  {
    Label label = new Label(parent, SWT.BORDER);
    label.setBackground(parent.getDisplay().getSystemColor(SWT.COLOR_WHITE));

    // ② ステータスバーに文字列を表示する。
    setStatus("This is status line.");
    return parent;
  }
(中略)
}

JFaceで作成したステータスバー
図8●JFaceで作成したステータスバー

Page Top

<Q16-12>メニュー項目に対するキーボードショートカットを設定したい。

多くのアプリケーションが実装しているように、メニュー項目に対するキーボードショートカットを設定したいのですが、どのようにすればよいでしょうか。

<A16-12>
たとえば、「ファイル(F)」と表示されたメニューは「Alt+F」キーで呼び出せます。
このようなメニュー開くためのAltとキーの組み合わせをニーモニックと呼びます。
また、「Ctrl+O」キーで「ファイルを開く」ダイアログを開くといった、メニュー項目を直接選択するためのキーボードショートカットをアクセラレータと呼びます(図9)。
ニーモニックは、MenuItemに対してsetTextメソッドで表示名称を設定する際に、以下のように&に続けて英数字を一文字記述することで指定できます。

menuItem.setText("ファイル(&F)");

この場合は、Alt+Fでファイルメニューを開くことができます。
アクセラレータの設定については、SWTとJFaceで指定方法が異なります。
SWTの場合は、以下のようにしてMenuItemに対するsetAccelerator( )メソッドを使用して設定します。

menuItem.setText("終了\tCtrl+Q");
menuItem.setAccelerator(SWT.CTRL |'Q');

これでCtrl+Qキーで終了メニューを直接呼び出すことができます。
ニーモニックはAltキーとの組み合わせしか利用できないのに比べ、アクセラレータではShiftキーやCtrlキーなど、さまざまなキーとの組み合わせを指定することができます。
JFaceの場合は、MenuManagerへセットするActionクラスの中でアクセラレータの設定を行います。
Actionクラスのコンストラクタなどで、setTextメソッドを使用して表示名称を設定する際、以下のようにして@に続けてアクセラレータキーを表記することで、アクセラレータを指定することができます。

super.setText("終了@Ctrl + Q");

SWTと比較するとJFaceではsetText( )のみでアクセラレータを設定できるのが利点です。

ニーモニックとアクセラレータ
図9●ニーモニックとアクセラレータ

Page Top

<Q16-13>ツリーの展開状態を保持したい。

ユーザから『アプリケーションで表示しているツリーの展開状態を再起動後も同じように表示してほしい』という要望が挙がっています。
アプリケーション終了時にツリーの展開状態を保持しておき、再起動時復帰するような方法はないでしょうか。

<A16-13>
TreeViewerのgetExpandedElements( )メソッドを利用することで実現できます。
このメソッドは戻り値として、現在開いているノードに関連づけられたObjectの配列を返します(①)。
これにより、ツリーの展開状態を知ることができます。
この情報をファイル等に保存しておき、setExpandedElements( )メソッドで展開したいノードに関連づけられたオブジェクトを渡すことで、ツリーの展開状態を復帰させることができます(②)。

■ツリーの展開状態を取得/設定する
// ①ツリーの展開状態を取得
Object[] expandedNodes =
  treeViewer.getExpandElements();

// ②ツリーの展開状態を設定する
treeViewer.setExpandedElements(expandedNodes);

Page Top

<Q16-14>ツリーを指定階層分だけ展開して初期表示したい。

TreeViewerを使ってツリーを表示するとき、初期状態では最上位の1階層のみが表示されます(図10)。
ユーザインタフェースとしては最初に何階層か開いた状態で表示したほうが親切だと思うのですが、どのようにすれば実現できるでしょうか。

AutoExpandLevelを設定しないツリー
図10● AutoExpandLevelを設定しないツリー

<A16-14>
TreeViewerのsetAutoExpandLevel( )メソッドを利用することで解決できます。
引数に何階層目まで展開するかを指定します。
たとえば、3階層目まで展開したい場合は、setAutoExpandLevel(3)とします(図11)。
あらかじめ全階層を開いた状態にしたい場合は引数 にAbstractTreeViewer.ALL_LEVELSを渡します。
ただし大量のデータを表示する場合は、表示するまでに時間がかかりますので注意してください。

AutoExpandLevelを設定したツリー
図11●AutoExpandLevelを設定したツリー

Page Top

<Q16-15>Imageオブジェクトの管理を行いたい。

SWTでアイコンをはじめとする画像を表示する際に使用するImageオブジェクトは、OSのリソースを使用するため使い終わったら必ずdispose( )メソッドを呼び出して破棄しなければなりません。
しかし、ツリーやテーブルにアイコンを表示するようなアプリケーションでは、毎回Imageオブジェクトを生成してしまうと管理がたいへんです。
何かよい方法はないでしょうか。

<A16-15>
JFaceでは、Imageオブジェクトを管理するためのImageRegistryというユーティリティクラスが提供されています。
ImageRegistryでは、任意の文字列をキーとしてImageを管理することができます。
ImageRegistry へ画像リソースを登録するには、ImageではなくImageDescriptorのインスタンスを生成する必要があります。
ImageDescriptorはImageRegistryと共にJFaceの一部として提供されているクラスで、実際に必要となるまでイメージの読み込みを行わない点がImageクラスとは違います。
ImageDescriptor のファクトリメソッドであるcreateFromURL( )を使用して、インスタンスを生成し(①)、ImageRegistryのput( )メソッドでキー(この場合は“FileIcon”)と共にImageDescriptorのインスタンスを登録します(②)。
一度登録したリソースは、キーを指定してget( )メソッドを呼び出すことで、Imageオブジェクトとして取得することができます(③)。
このようにすることでImageオブジェクトを一括管理することができますので、ツリーやテーブルなどで同じアイコンを大量に表示するときに威力を発揮できるでしょう。

■ImageRegistry の使用例
// ①ImageRegistryの生成
ImageRegistry imageRegistry = new ImageRegistry();
// ②ImageRegistryへの登録
ImageDescriptor fileIcon = ImageDescriptor.createFromURL(new URL("icons/file.gif"));
imageRegistry.put("FileIcon", fileIcon);
// ③ImageRegistryからの取得
Image fileIconImage = imageRegistry.get("FileIcon");

Page Top

<Q16-16>テーブルをヘッダクリックによってソートしたい。

テーブルのヘッダをクリックすると、表示内容をソートする機能を実現しているアプリケーションをよく見かけます。
このような機能を実現するにはどうしたらよいでしょうか。

<A16-16>
残念ながら、現在のSWT/JFaceではテーブルのソート機能そのものは提供されていませんので、自作する必要があります。
しかし、JFaceでViewerフレームワークの一部として提供されているViewerSorterを使用すれば、比較的楽に実現することができます。
リスト16-1 はランダムな30個の整数をTableViewerを使用して表示するサンプルプログラムです。
実行結果は図12のようになります。

■リスト16-1 TableSort.java
public class TableSort extends ApplicationWindow {
  private TableViewer tableViewer_;

  public TableSort() {
    super(null);
  }

  protected Control createContents(Composite parent) {
    tableViewer_ = new TableViewer(parent);

    // テーブルの生成
    TableColumn column = new TableColumn(tableViewer_.getTable(), SWT.CENTER);
    column.setText("列1");
    column.pack();
    tableViewer_.getTable().setHeaderVisible(true);

    // ContentProviderの設定
    tableViewer_.setContentProvider(new TableContentProvider());
    tableViewer_.setInput(this);

    return parent;
  }

  // テーブル表示用ContentProvider
  class TableContentProvider implements IStructuredContentProvider {
    static final int ROW_NUMBER = 30;
    public Object[] getElements(Object inputElement) {
      // 1~100までの数をランダムに30個表示する
      Integer[] contents = new Integer[ROW_NUMBER];
      for (int cnt = 0; cnt < ROW_NUMBER; cnt++) {
      contents[cnt] = new Integer((int) (Math.random() * 100));
    }

    return contents;

  }

  public void dispose() {}

  public void inputChanged(Viewer viewer,
    Object oldInput, Object newInput) {}
  }

  public static void main(String[] args) {
    TableSort window = new TableSort();
    window.setBlockOnOpen(true);
    window.open();
    Display.getCurrent().dispose();
  }
}


ソートなしテーブル
図12●ソートなしテーブル
この段階では、表示内容はソートされていません。
このプログラムにソート機能を追加することを考えましょう。
Viewerに対してソート機能を追加するには、JFaceが提供するViewerSorterというクラスを利用します。
ViewerSorterを継承したクラスを用意し、compare( )メソッドをオーバーライドします。
ここではTableSorterというクラスを内部クラスとして作成しました(リスト16-2)。

■リスト16-2 TableSorter.java
class TableSorter extends ViewerSorter {
  // ソート順正の値:正順、負の値:逆順
  private int sortOrder_ = 1;

  public int compare(Viewer viewer, Object e1, Object e2) {
    // テーブルに格納されたモデルを比較して順序を決定する
    int value1 = ((Integer) e1).intValue();
    int value2 = ((Integer) e2).intValue();
    return (value1 - value2) * sortOrder_;
  }

  public void changeSortMode() {
    // ソート順を逆転する
    sortOrder_ *= -1;
  }
}
ContentProvider のgetElements()メソッドでViewerへ返したオブジェクトが、compare()メソッドの引数e1、e2として渡されていますので、これらを比較して結果を返します(リスト16-2-①)。
ここでは、Integerクラスのオブジェクトがモデルになっているので、差分をとった結果を戻り値として返しています。
このとき、順番を制御できるようにsortOrder_フィールドにソート順を持たせています。
このようにして作成したTableSorterを、ViewerのsetSorter( )メソッドを使用してViewerへ設定します(リスト16-3-①)。
これで、テーブルの内容があらかじめソートされて表示されるようになります(図12)。
さらに、ヘッダをクリックしたときにソート順が反転するようにするためには、もう一工夫必要です。
テーブルの列を表すTableColumnオブジェクトに対してSelectionListenerを追加して、ヘッダがクリックされたときに、TableSorter に用意したchangeSortMode()メソッドを呼び出す必要があります(リスト16-4-①)。
また、これだけではテーブルの状態が再表示されませんので、TableViewer#refresh( )メソッドを呼び出して、テーブルを再表示します(リスト16-4-②)。
このようにすればテーブルにソート機能を追加することができます。
列が複数ある場合、ViewerSorterを工夫すれば列ごとにソートすることも可能です。

■リスト16-3 ViewerSorter の設定
tableSorter_ = new TableSorter();
// ViewerSorterの設定
tableViewer_.setSorter(tableSorter_);

■リスト16-4 ヘッダをクリックしたときの処理
// ヘッダをクリックしたときの処理
column.addSelectionListener(new SelectionAdapter() {
  public void widgetSelected(SelectionEvent e){
    tableSorter_.changeSortMode();
    tableViewer_.refresh();
  }
}

ソート付きテーブル
図12 ● ソート付きテーブル

Page Top

<Q16-17>EclipseのJFace設定情報を再利用したい。

JFaceを利用したアプリケーションを開発するたびに必須JARファイルを登録するのは手間がかかります。
一度設定した情報を使いまわす方法はありませんか。

<A16-17>
Eclipse 3.0からはユーザライブラリという仕組みが導入されました。
任意のJARファイルをライブラリとしてまとめて参照できる仕組みです。
Preference画面のツリーを「Java」>「Build Path 」>「User Libraries」の順にたどってください。
ユーザライブラリを新規に作成する場合は、「New」ボタンを押下します。
あとは「Add JARs」ボタンを押下して、追加するJARファイルを選択します(図13)。
ユーザライブラリの設定
図13 ● ユーザライブラリの設定

こうして作成したユーザライブラリは各プロジェクトのビルドパスに再利用することができます。
開発時に必要となる独自ライブラリをユーザライブラリとして登録しておくと、ビルドパスの設定ミスを防ぐことができますので、Eclipse 3.0への移行後は積極的に利用していきましょう。
また、ビルドパスやユーザライブラリの設定を億劫に思い、JDKの自動参照パス(JAVA_HOME\jre\lib\ext)にJARファイルを配置してしまうと、ライブラリのバージョンアップ時に、古いJARファイルを参照し続けてしまうことがあります。
くれぐれも注意してください。
Eclipseのヘルプから、「Platform Plug-in DeveloperGuide> Reference > API Reference」とたどることで参照することができます。
SWTはorg.eclipse.swtパッケージ配下、JFaceはorg.eclipse.jfaceパッケージ配下を参照してください。
しかし、EclipseのヘルプはEclipse起動中しか表示できませんので、ちょっと参照したいときなどは不便です。
そこで、APIリファレンスの元となるHTMLファイルを取り出しておくことにしましょう。
先ほど紹介したヘルプファイル中のAPIリファレンスは以下のZIPファイルへ格納されています。
ECLIPSE_HOME\plugins\org.eclipse.plat
form.doc.isv_3.0.0\doc.zip

ECLIPSE_HOMEはみなさんのEclipseインストールディレクトリに合わせて読み替えてください。
このファイルを解凍してできたフォルダのreference\apiディレクトリにあるindex.htmlがAPIリファレンスのトップページです。
ソースコードを参照したい場合には、以下のディレクトリにプラグインごとに圧縮されています。

ECLIPSE_HOME\plugins\org.eclipse.plat
form.source_3.0.0\src

ソースコードの参照場所設定
図14 ● ソースコードの参照場所設定

なお、Eclipseプラグイン開発時にCtrl+左クリックでEclipseが提供するAPIのソースコードへ移動できる理由は、先のディレクトリがソースコード参照先として設定されているためです。
設定されているすべてのソースパスを確認するには、Preference画面のツリーを「Plug-in Development」> 「Source CodeLocations」の順にたどってください(図14)。
独自にプラグインを作成した場合などには、ここにソースパスを追加することで、Ctrl+左クリックでの参照が可能となります。
Page Top

注意:本文書の内容に誤りがあり、またこの文書によって不利益を被っても、
Acroquest Technology 株式会社は一切関知いたしません。

  • 現象別Index
  • 原因別Index

Find Bugsバグ詳細

Find Bugs Bug Descriptions日本語版

RSSで更新情報を取得する

RSSとは、ホームページの更新情報を配信する為のフォーマットです。
RSSを利用すると、登録したページの情報が更新された場合に、更新情報を自動的に受け取る事ができます。

詳細

弊社小森が執筆致しました

Javaでオブジェクト指向開発

Javaプログラミング言語習得において、新人プログラマーの最初の障害は「オブジェクト指向の壁」です。
本書は、Javaのソフトウェア開発を中心に事業を発展させてきたAcroquest社の新人教育セミナーを加筆・書籍化したもので、大卒の新人に対して、ゼロからJava言語を教えてきた実績をフィードバックしています。

メールマガジン配信中

Javaトラブルシューティングのメルマガをはじめました!是非ご購読ください

詳細