Eclipse/プラグイン開発のTIPS集/TableViewer
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
単語検索
|
最終更新
|
ヘルプ
|
ログイン
]
開始行:
#topicpath
----
//ここにコンテンツを記述します。
#contents
**TableViewerとは [#vff32b94]
TableViewerとは、JFaceのレイヤが提供するビューワクラスで...
#ref(pic01.png)
***ViewPartに配置する [#if260bfa]
ビューに配置するには、ViewpartのcreatePartControl(Compsit...
Composite container = new Composite(parent, SWT.NONE);
container.setLayout(new FillLayout());
viewer = new TableViewer(container, SWT.FULL_SELECTION |...
| SWT.H_SCROLL | SWT.V_SCROLL);
とするだけです。
***カラムを設定する [#tb127cc2]
次にTableViewerにカラム(列)を定義していきます。基本的にTa...
table = viewer.getTable();
TableColumn tc1 = new TableColumn(table, SWT.NONE, 0);
TableColumn tc2 = new TableColumn(table, SWT.NONE, 1);
としていけばよいのですが、Eclipseの[[TaskView:http://www....
ViewPartのフィールドに定義
private final ColumnPixelData[] DEFAULT_COLUMN_LAYOUTS = {
new ColumnPixelData(200), new ColumnPixelData(200),
new ColumnPixelData(200) };
private final IField[] VISIBLE_FIELDS = { new TitleField...
new SummaryField(), new URLField() };
ColumnPixelDataはそのカラムがリサイズ可能かとか、大きさは...
IFieldはヘッダ名やヘッダに表示するアイコンの情報、またビ...
public interface IField {
String getColumnHeaderText();
Image getColumnHeaderImage();
String getValue(Object obj);
Image getImage(Object obj);
}
これを各カラムに沿った形でOverrideすればOKです。
次に ViewPart#createPartControlで以下のinitTalbeメソッド...
private void initTable(Viewer viewer){
Table table = viewer.getTable();
TableLayout layout = new TableLayout();
table.setLayout(layout);
table.setHeaderVisible(true); // ヘッダは表示する
table.setLinesVisible(true); // ラインは表示する
ColumnLayoutData[] columnLayouts = getColumnLayouts();
for (int i = 0; i < columnLayouts.length; i++) {
layout.addColumnData(columnLayouts[i]);
TableColumn tc = new TableColumn(table, SWT.NONE, i);
tc.setText(VISIBLE_FIELDS[i].getColumnHeaderText());
tc.setImage(VISIBLE_FIELDS[i].getColumnHeaderImage());
}
}
private ColumnLayoutData[] getColumnLayouts() {
ColumnPixelData[] result = new ColumnPixelData[DEFAULT...
for (int i = 0; i < DEFAULT_COLUMN_LAYOUTS.length; i++...
int width = DEFAULT_COLUMN_LAYOUTS[i].width;
//////////// ※ /////////////////
result[i] = new ColumnPixelData(width);
}
return result;
}
これでTableにTableColumnがセットされました。getColumnLayo...
***ドメインオブジェクトと2つのProvider [#pbf78763]
ここまででカラムが3つあるTableViewerが構築されました。さ...
-表示したいデータを持つドメインオブジェクト
-ドメインオブジェクトとTableViewerの橋渡しをするContentPr...
-TableViewerに値を表示するためのLabelProvider
という3種類のオブジェクトが重要です。
たとえば、ドメインオブジェクトを
public intarface Model{
getSummary();
getURL();
getTitle();
}
とします。このオブジェクトがたとえば10個(たとえば配列mode...
ContentProviderについてですが、実はドメインオブジェクトが...
viewer.setContentProvider(new ArrayContentProvider());
で終わりです。これで各行に一つのModelオブジェクトを割り当...
つぎにLabelProviderです。LabelProviderはContentProviderが...
以下のように定義しました。
class ViewLabelProvider extends LabelProvider implements
ITableLabelProvider {
private final IField[] fields;
public ViewLabelProvider(IField[] fields) {
this.fields = fields;
}↑ViewPartに定義したIFieldです
public String getColumnText(Object obj, int index) {
if (obj instanceof Model) { ↑indexは左から何番目のカ...
↑ ContentProviderが配列から取り出して渡してくれる
Modelelement = (Model) obj;
return fields[index].getValue(element);
}
return "";
}
public Image getColumnImage(Object element, int column...
return null; <-イメージを使いたい場合には何かを返す
}
}
このクラスを作っておいて、
viewer.setLabelProvider(new ViewLabelProvider(VISIBLE_FI...
としておけばOKです。
IFieldの効能についてですが、このようなクラスがないとLabel...
まとめると
-フィールドの
ColumnPixelData[] DEFAULT_COLUMN_LAYOUTS;
IField[] VISIBLE_FIELDS;
でTableViewerを構築
-TableViewerの行単位のデータを生成するContentProviderを定...
-行単位のデータを実際に各カラムに表示するためのLabelProvi...
という感じですね。
参考~
[[プラグイン開発のTIPS集/GooglePlugin/検索結果一覧を表示...
***IMemmentoを使った、カラム幅を保存してリストアする [#if...
[[org.eclipse.ui.IViewPartの 設定の保存とリストア>Eclipse...
やってみましょう。EclipseにはあらかじめViewを開いたときに...
public void init(IViewSite site, IMemento memento);
というメソッドがあるので、それを以下のように実装しておき...
public void init(IViewSite site, IMemento memento) throw...
this.memento = memento;
super.init(site, memento);
}
Viewが開くときに渡されてきた引数のmementoはフィールドに持...
逆に、ビューを閉じるときには
public void saveState(IMemento memento);
が呼ばれるので、そのメソッドを以下のように実装しておきま...
public void saveState(IMemento memento) {
super.saveState(memento);
saveColumnWidth(memento);
}
このメソッドの引数のmementoは、次にこのViewを開いたときに...
private void saveColumnWidth(IMemento memento) {
TableColumn[] columns = viewer.getTable().getColumns();
for (int i = 0; i < columns.length; i++) {
memento.putInteger(TAG_COLUMN_WIDTH + i, columns[i]....
} ↑適当な文字列 ↑現在の...
}
現在の各カラム幅を「TAG_COLUMN_WIDTH + i」というキー値でm...
さて、先ほど後述するからとりあえず消しておく、といってい...
private ColumnLayoutData[] getColumnLayouts() {
ColumnPixelData[] result = new ColumnPixelData[DEFAULT...
for (int i = 0; i < DEFAULT_COLUMN_LAYOUTS.length; i++...
int width = DEFAULT_COLUMN_LAYOUTS[i].width;
//////////// ※ /////////////////
result[i] = new ColumnPixelData(width);
}
return result;
}
に修正をかけていきます。これは、カラム幅を保持したクラス...
private ColumnLayoutData[] getColumnLayouts(ColumnPixelD...
ColumnPixelData[] result = new ColumnPixelData[data.le...
for (int i = 0; i < data.length; i++) {
int width = data[i].width;
if (memento != null) {
// メメントから、前回の幅を取得している
Integer widthInt = memento.getInteger(TAG_COLUMN_W...
if (widthInt != null && widthInt.intValue() > 0) {
width = widthInt.intValue();
}
}
result[i] = new ColumnPixelData(width);
}
return result;
}
これで、''あらかじめ、初回のデフォルトのカラム幅はフィー...
***ソート処理 [#fb034da8]
***保存処理 [#kf99e51e]
***DnD [#g8954bdb]
**TIP集 [#lb5222ff]
***どのカラムをクリックしてもその行を選択状態にする [#lee...
viewer = new TableViewer(parent, SWT.MULTI | SWT.H_SCROLL
| SWT.V_SCROLL|SWT.FULL_SELECTION);
SWT.FULL_SELECTION がポイントです((クリックに反応して選択...
***プロパティ値を設定する。 [#nc785d79]
String[] properties = new String[] { "text", "check", "c...
// カラム・プロパティの設定
viewer.setColumnProperties(properties);
は
ICellModifier#getValue(Object element, String property)
のproperty値になります。
ICellModifierなどについては[[編集機能付きテーブルとは>Ecl...
***参考1 ColumnPixelDataのJavaDocコメント [#e1b3d231]
/**
* Creates a resizable column width of the given number ...
*
* @param widthInPixels the width of column in pixels
*/
public ColumnPixelData(int widthInPixels) {
this(widthInPixels, true, false);
}
/**
* Creates a column width of the given number of pixels.
*
* @param widthInPixels the width of column in pixels
* @param resizable <code>true</code> if the column is r...
* and <code>false</code> if size of the column is fixed
*/
public ColumnPixelData(int widthInPixels, boolean resiza...
this(widthInPixels, resizable, false);
}
/**
* Creates a column width of the given number of pixels.
*
* @param widthInPixels
* the width of column in pixels
* @param resizable
* <code>true</code> if the column is resizable, and
* <code>false</code> if size of the column is fixed
* @param addTrim
* <code>true</code> to allocate extra width to the...
* account for trim taken by the column itself,
* <code>false</code> to use the given width exactly
* @since 3.1
*/
public ColumnPixelData(int widthInPixels, boolean resiza...
super(resizable);
Assert.isTrue(widthInPixels >= 0);
this.width = widthInPixels;
this.addTrim = addTrim;
}
***各カラムの背景色や文字の色、フォントなどを設定する [#x...
いろいろサイトを探して、みつかんねえなあ直接Tableをいじる...
----
この記事は
#vote(おもしろかった[23],そうでもない[1])
#comment
#topicpath
SIZE(10){現在のアクセス:&counter;}
終了行:
#topicpath
----
//ここにコンテンツを記述します。
#contents
**TableViewerとは [#vff32b94]
TableViewerとは、JFaceのレイヤが提供するビューワクラスで...
#ref(pic01.png)
***ViewPartに配置する [#if260bfa]
ビューに配置するには、ViewpartのcreatePartControl(Compsit...
Composite container = new Composite(parent, SWT.NONE);
container.setLayout(new FillLayout());
viewer = new TableViewer(container, SWT.FULL_SELECTION |...
| SWT.H_SCROLL | SWT.V_SCROLL);
とするだけです。
***カラムを設定する [#tb127cc2]
次にTableViewerにカラム(列)を定義していきます。基本的にTa...
table = viewer.getTable();
TableColumn tc1 = new TableColumn(table, SWT.NONE, 0);
TableColumn tc2 = new TableColumn(table, SWT.NONE, 1);
としていけばよいのですが、Eclipseの[[TaskView:http://www....
ViewPartのフィールドに定義
private final ColumnPixelData[] DEFAULT_COLUMN_LAYOUTS = {
new ColumnPixelData(200), new ColumnPixelData(200),
new ColumnPixelData(200) };
private final IField[] VISIBLE_FIELDS = { new TitleField...
new SummaryField(), new URLField() };
ColumnPixelDataはそのカラムがリサイズ可能かとか、大きさは...
IFieldはヘッダ名やヘッダに表示するアイコンの情報、またビ...
public interface IField {
String getColumnHeaderText();
Image getColumnHeaderImage();
String getValue(Object obj);
Image getImage(Object obj);
}
これを各カラムに沿った形でOverrideすればOKです。
次に ViewPart#createPartControlで以下のinitTalbeメソッド...
private void initTable(Viewer viewer){
Table table = viewer.getTable();
TableLayout layout = new TableLayout();
table.setLayout(layout);
table.setHeaderVisible(true); // ヘッダは表示する
table.setLinesVisible(true); // ラインは表示する
ColumnLayoutData[] columnLayouts = getColumnLayouts();
for (int i = 0; i < columnLayouts.length; i++) {
layout.addColumnData(columnLayouts[i]);
TableColumn tc = new TableColumn(table, SWT.NONE, i);
tc.setText(VISIBLE_FIELDS[i].getColumnHeaderText());
tc.setImage(VISIBLE_FIELDS[i].getColumnHeaderImage());
}
}
private ColumnLayoutData[] getColumnLayouts() {
ColumnPixelData[] result = new ColumnPixelData[DEFAULT...
for (int i = 0; i < DEFAULT_COLUMN_LAYOUTS.length; i++...
int width = DEFAULT_COLUMN_LAYOUTS[i].width;
//////////// ※ /////////////////
result[i] = new ColumnPixelData(width);
}
return result;
}
これでTableにTableColumnがセットされました。getColumnLayo...
***ドメインオブジェクトと2つのProvider [#pbf78763]
ここまででカラムが3つあるTableViewerが構築されました。さ...
-表示したいデータを持つドメインオブジェクト
-ドメインオブジェクトとTableViewerの橋渡しをするContentPr...
-TableViewerに値を表示するためのLabelProvider
という3種類のオブジェクトが重要です。
たとえば、ドメインオブジェクトを
public intarface Model{
getSummary();
getURL();
getTitle();
}
とします。このオブジェクトがたとえば10個(たとえば配列mode...
ContentProviderについてですが、実はドメインオブジェクトが...
viewer.setContentProvider(new ArrayContentProvider());
で終わりです。これで各行に一つのModelオブジェクトを割り当...
つぎにLabelProviderです。LabelProviderはContentProviderが...
以下のように定義しました。
class ViewLabelProvider extends LabelProvider implements
ITableLabelProvider {
private final IField[] fields;
public ViewLabelProvider(IField[] fields) {
this.fields = fields;
}↑ViewPartに定義したIFieldです
public String getColumnText(Object obj, int index) {
if (obj instanceof Model) { ↑indexは左から何番目のカ...
↑ ContentProviderが配列から取り出して渡してくれる
Modelelement = (Model) obj;
return fields[index].getValue(element);
}
return "";
}
public Image getColumnImage(Object element, int column...
return null; <-イメージを使いたい場合には何かを返す
}
}
このクラスを作っておいて、
viewer.setLabelProvider(new ViewLabelProvider(VISIBLE_FI...
としておけばOKです。
IFieldの効能についてですが、このようなクラスがないとLabel...
まとめると
-フィールドの
ColumnPixelData[] DEFAULT_COLUMN_LAYOUTS;
IField[] VISIBLE_FIELDS;
でTableViewerを構築
-TableViewerの行単位のデータを生成するContentProviderを定...
-行単位のデータを実際に各カラムに表示するためのLabelProvi...
という感じですね。
参考~
[[プラグイン開発のTIPS集/GooglePlugin/検索結果一覧を表示...
***IMemmentoを使った、カラム幅を保存してリストアする [#if...
[[org.eclipse.ui.IViewPartの 設定の保存とリストア>Eclipse...
やってみましょう。EclipseにはあらかじめViewを開いたときに...
public void init(IViewSite site, IMemento memento);
というメソッドがあるので、それを以下のように実装しておき...
public void init(IViewSite site, IMemento memento) throw...
this.memento = memento;
super.init(site, memento);
}
Viewが開くときに渡されてきた引数のmementoはフィールドに持...
逆に、ビューを閉じるときには
public void saveState(IMemento memento);
が呼ばれるので、そのメソッドを以下のように実装しておきま...
public void saveState(IMemento memento) {
super.saveState(memento);
saveColumnWidth(memento);
}
このメソッドの引数のmementoは、次にこのViewを開いたときに...
private void saveColumnWidth(IMemento memento) {
TableColumn[] columns = viewer.getTable().getColumns();
for (int i = 0; i < columns.length; i++) {
memento.putInteger(TAG_COLUMN_WIDTH + i, columns[i]....
} ↑適当な文字列 ↑現在の...
}
現在の各カラム幅を「TAG_COLUMN_WIDTH + i」というキー値でm...
さて、先ほど後述するからとりあえず消しておく、といってい...
private ColumnLayoutData[] getColumnLayouts() {
ColumnPixelData[] result = new ColumnPixelData[DEFAULT...
for (int i = 0; i < DEFAULT_COLUMN_LAYOUTS.length; i++...
int width = DEFAULT_COLUMN_LAYOUTS[i].width;
//////////// ※ /////////////////
result[i] = new ColumnPixelData(width);
}
return result;
}
に修正をかけていきます。これは、カラム幅を保持したクラス...
private ColumnLayoutData[] getColumnLayouts(ColumnPixelD...
ColumnPixelData[] result = new ColumnPixelData[data.le...
for (int i = 0; i < data.length; i++) {
int width = data[i].width;
if (memento != null) {
// メメントから、前回の幅を取得している
Integer widthInt = memento.getInteger(TAG_COLUMN_W...
if (widthInt != null && widthInt.intValue() > 0) {
width = widthInt.intValue();
}
}
result[i] = new ColumnPixelData(width);
}
return result;
}
これで、''あらかじめ、初回のデフォルトのカラム幅はフィー...
***ソート処理 [#fb034da8]
***保存処理 [#kf99e51e]
***DnD [#g8954bdb]
**TIP集 [#lb5222ff]
***どのカラムをクリックしてもその行を選択状態にする [#lee...
viewer = new TableViewer(parent, SWT.MULTI | SWT.H_SCROLL
| SWT.V_SCROLL|SWT.FULL_SELECTION);
SWT.FULL_SELECTION がポイントです((クリックに反応して選択...
***プロパティ値を設定する。 [#nc785d79]
String[] properties = new String[] { "text", "check", "c...
// カラム・プロパティの設定
viewer.setColumnProperties(properties);
は
ICellModifier#getValue(Object element, String property)
のproperty値になります。
ICellModifierなどについては[[編集機能付きテーブルとは>Ecl...
***参考1 ColumnPixelDataのJavaDocコメント [#e1b3d231]
/**
* Creates a resizable column width of the given number ...
*
* @param widthInPixels the width of column in pixels
*/
public ColumnPixelData(int widthInPixels) {
this(widthInPixels, true, false);
}
/**
* Creates a column width of the given number of pixels.
*
* @param widthInPixels the width of column in pixels
* @param resizable <code>true</code> if the column is r...
* and <code>false</code> if size of the column is fixed
*/
public ColumnPixelData(int widthInPixels, boolean resiza...
this(widthInPixels, resizable, false);
}
/**
* Creates a column width of the given number of pixels.
*
* @param widthInPixels
* the width of column in pixels
* @param resizable
* <code>true</code> if the column is resizable, and
* <code>false</code> if size of the column is fixed
* @param addTrim
* <code>true</code> to allocate extra width to the...
* account for trim taken by the column itself,
* <code>false</code> to use the given width exactly
* @since 3.1
*/
public ColumnPixelData(int widthInPixels, boolean resiza...
super(resizable);
Assert.isTrue(widthInPixels >= 0);
this.width = widthInPixels;
this.addTrim = addTrim;
}
***各カラムの背景色や文字の色、フォントなどを設定する [#x...
いろいろサイトを探して、みつかんねえなあ直接Tableをいじる...
----
この記事は
#vote(おもしろかった[23],そうでもない[1])
#comment
#topicpath
SIZE(10){現在のアクセス:&counter;}
ページ名: