FC2ブログ

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

[JavaFX] TableView 列数を可変にする


テーブルの列数があらかじめ分かっているなら、前回のような実装で対応できるが、
列数が不明(可変)な場合、そう簡単にはいかない。

で、下記のサイトにそのあたりの対処方法が書いてあったので参考にして、実装してみた。
http://d.hatena.ne.jp/ats337/20111012/1318440993

■ソース

//★1. レコード用のクラスを作る。
//この部分のポイントは、ObjectPropertyにMap持たせるあたり。
//1つのインスタンスで、列名をキーにして値を取得できるようにしておく。
class RData{
private ObjectProperty<Map<String, String>> prop =
new SimpleObjectProperty<Map<String, String>>();

public RData setData(Map<String,String> dataMap){
prop.set(dataMap);
return this;
}

public String getData(String key){
return prop.get().get(key);
}
}

@FXML
void initialize() {

// とりあえず、例として10列の場合
// 実際には、DBから取得したテーブルの列数とか、実行時に変更されることを想定
int colNum = 10;

for(int i =0; i< colNum; i++){
//★2. TableColumn(列)を作る
TableColumn<RData, String> col =
new TableColumn<RData, String>("列" + i);

//★3. TableColumn(列)とレコード用クラスを関連付ける

// RDataのMapから値を取り出すためのキーをfinalで作成。
final String key = "列" + i;

// CallbackをPropertyValueFactoryで作るのではなく、自前で実装する
col.setCellValueFactory(
new Callback<CellDataFeatures<RData, String>, ObservableValue<String>>() {
@Override
public ObservableValue<String> call( CellDataFeatures<RData, String> p) {
// 列名をキーに、値を返す。
return new SimpleStringProperty(p.getValue().getData(key));
}
});

//★4. TableView(表)にTableColumn(列)をセットする
table.getColumns().add(col);
}

//★5. TableView(表)にデータをセットする。
Map<String, String> data = new HashMap<String,String>();
for(int i =0; i< colNum; i++){
data.put("列"+i, "値"+i);
}
table.getItems().add(new RData().setData(data));


//参考までに、列数が半分のレコードデータもセットしてみる
Map<String, String> data2 = new HashMap<String,String>();
for(int i =0; i< colNum-5; i++){
data2.put("列"+i, "値"+i);
}
table.getItems().add(new RData().setData(data2));
}


■実行結果


以上。
スポンサーサイト

テーマ : プログラミング
ジャンル : コンピュータ

[JavaFX] TableViewの使い方 基礎の基礎

TableViewでのデータ表示。
  Cells(2, 1) = "田中"
というような感じで簡単にデータ入れられるのかと思ったらそんなこと無かった。


手順としては
1. レコード用のクラスを作る。
2. TableColumn(列)を作る
3. TableColumn(列)とレコード用クラスを関連付ける
4. TableView(表)にTableColumn(列)をセットする
5. TableView(表)にデータをセットする。
って感じ。
意外と面倒。


■画面イメージ
JavaFX_TableView

■ソース(抜粋)

//fxmlファイルのTableViewと関連付けておく
@FXML
private TableView<RData1> table = new TableView<RData1>();

//★1. レコード用のクラスを作る。
public class RData1{

//これがセルに表示するデータ。StringではなくStringPropertyであることに注意
private StringProperty data;

//getterも用意する必要がある。get~ではなく、~Property。
public StringProperty dataProperty(){
return data;
}

public RData1(String data){
this.data = new SimpleStringProperty(data);
}
}

@FXML
void initialize() {

//★2. TableColumn(列)を作る
TableColumn<RData1, String> col =
new TableColumn<RData1, String>("列名");

//★3. TableColumn(列)とレコード用クラスを関連付ける
col.setCellValueFactory(
new PropertyValueFactory<RData1,String>("data"));

//★4. TableView(表)にTableColumn(列)をセットする
table.getColumns().add(col);

//★5. TableView(表)にデータをセットする。
table.getItems().add(new RData1("1行目"));
table.getItems().add(new RData1("2行目"));
table.getItems().add(new RData1("3行目"));

}


■Fxmlファイル(抜粋)

<AnchorPane minHeight="0.0" minWidth="0.0" prefHeight="332.0" prefWidth="505.0">
<children>
<TableView id="tablea" fx:id="table" disable="false" prefHeight="249.0" prefWidth="449.0" visible="true" AnchorPane.bottomAnchor="-2.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="-6.0" />
</children>
<padding>
<Insets />
</padding>
</AnchorPane>


■参考
http://www.02.246.ne.jp/~torutk/javafx2/table/tableview-memo.html
http://kazyury.hatenadiary.jp/entry/2013/04/08/225253

以上。

テーマ : プログラミング
ジャンル : コンピュータ

[JavaFX] ダイアログの閉じ方

メインウィンドウから表示したダイアログなんかを閉じる方法。

Platform.exit() だと、親ごと終了してしまうので、Window.hide()を使えばいいみたい。

	public void close(ActionEvent event){
// (Platform.exit();
((Node)event.getSource()).getScene().getWindow().hide();
}

テーマ : プログラミング
ジャンル : コンピュータ

[JavaFX] Menuからモーダルダイアログ呼び出し

http://stackoverflow.com/questions/10486731/how-to-create-a-modal-window-in-javafx-2-1
を参考にモーダルダイアログを作ろうとしたけど、Menuから呼び出していたのでサンプルのままだとキャストでエラーになった。

MenuItemはNodeの子供ではないので当然の結果。
とりあえず、MenuItemにキャストして、.getParentPopup().getOwnerWindow()したら動いた。
これであっているかは分からないけど。

■参考にしたURLのコード
stage.initOwner(((Node)event.getSource()).getScene().getWindow() );

■変更後のコード
stage.initOwner(((MenuItem)event.getSource()).getParentPopup().getOwnerWindow());


■修正後のモーダルダイアログを表示するメソッド全体

  @FXML
  public void show(ActionEvent event) throws IOException{
      Stage stage = new Stage();
      Parent root = FXMLLoader.load(
          getClass().getResource("Modal.fxml"));
      stage.setScene(new Scene(root));
      stage.setTitle("test");
      stage.initModality(Modality.WINDOW_MODAL);
      stage.initOwner(((MenuItem)event.getSource()).getParentPopup().getOwnerWindow());
      stage.show();
  }


■エラー時のスタックトレース
java.lang.RuntimeException: java.lang.reflect.InvocationTargetException
at javafx.fxml.FXMLLoader$ControllerMethodEventHandler.handle(Unknown Source)
at com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(Unknown Source)
at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(Unknown Source)
at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(Unknown Source)
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(Unknown Source)
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(Unknown Source)
at com.sun.javafx.event.EventUtil.fireEventImpl(Unknown Source)
at com.sun.javafx.event.EventUtil.fireEvent(Unknown Source)
at javafx.event.Event.fireEvent(Unknown Source)
at javafx.scene.control.MenuItem.fire(Unknown Source)
at com.sun.javafx.scene.control.skin.ContextMenuContent$MenuItemContainer.doSelect(Unknown Source)
at com.sun.javafx.scene.control.skin.ContextMenuContent$MenuItemContainer$6.handle(Unknown Source)
at com.sun.javafx.scene.control.skin.ContextMenuContent$MenuItemContainer$6.handle(Unknown Source)
at com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(Unknown Source)
at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(Unknown Source)
at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(Unknown Source)
at com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(Unknown Source)
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(Unknown Source)
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(Unknown Source)
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(Unknown Source)
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(Unknown Source)
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(Unknown Source)
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(Unknown Source)
at com.sun.javafx.event.EventUtil.fireEventImpl(Unknown Source)
at com.sun.javafx.event.EventUtil.fireEvent(Unknown Source)
at javafx.event.Event.fireEvent(Unknown Source)
at javafx.scene.Scene$MouseHandler.process(Unknown Source)
at javafx.scene.Scene$MouseHandler.process(Unknown Source)
at javafx.scene.Scene$MouseHandler.access$1900(Unknown Source)
at javafx.scene.Scene.impl_processMouseEvent(Unknown Source)
at javafx.scene.Scene$ScenePeerListener.mouseEvent(Unknown Source)
at com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(Unknown Source)
at com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at com.sun.javafx.tk.quantum.GlassViewEventHandler.handleMouseEvent(Unknown Source)
at com.sun.glass.ui.View.handleMouseEvent(Unknown Source)
at com.sun.glass.ui.View.notifyMouse(Unknown Source)
at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
at com.sun.glass.ui.win.WinApplication.access$100(Unknown Source)
at com.sun.glass.ui.win.WinApplication$3$1.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
Caused by: java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at sun.reflect.misc.Trampoline.invoke(Unknown Source)
at sun.reflect.GeneratedMethodAccessor1.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at sun.reflect.misc.MethodUtil.invoke(Unknown Source)
... 41 more
Caused by: java.lang.ClassCastException: javafx.scene.control.MenuItem cannot be cast to javafx.scene.Node
at application.Main.show(Main.java:59)
... 50 more

テーマ : プログラミング
ジャンル : コンピュータ

e(fx)clipseインストール時のエラーメモ

e(fx)clipseのインストールでエラーでたので、その時のメモ。

インストール方法は、
Eclipseのマーケットプレースから e(fx)clipse - Composite -FX Tooling を選択。

すると、以下のエラーが出た。

Cannot complete the install because one or more required items could not be found.
Software being installed: e(fx)clipse - Composite - FX Tooling 0.8.1.201303112105 (at.bestsolution.efxclipse.tooling.feature.feature.group 0.8.1.201303112105)
Missing requirement: Jemmy 0.8.1.201303112105 (at.bestsolution.efxclipse.runtime.jemmy 0.8.1.201303112105) requires 'bundle org.junit4 4.8.1' but it could not be found
Cannot satisfy dependency:
From: e(fx)clipse - Jemmy FX to Junit Test OSGi-Apps 0.8.1.201303112105 (at.bestsolution.efxclipse.runtime.jemmy.junit.feature.feature.group 0.8.1.201303112105)
To: at.bestsolution.efxclipse.runtime.jemmy [0.8.1.201303112105]
Cannot satisfy dependency:
From: e(fx)clipse - Composite - FX Tooling 0.8.1.201303112105 (at.bestsolution.efxclipse.tooling.feature.feature.group 0.8.1.201303112105)
To: at.bestsolution.efxclipse.runtime.jemmy.junit.feature.feature.group 0.8.1



下記を参照して、やり直してみたが、やっぱりダメだった。
http://www.eclipse.org/forums/index.php/t/501444/

新しいソフトのインストールのほうで、Wrok with に
http://downloads.efxclipse.org/p2-repos/releases/latest/

e(fx)clipse - install
+ e(fx)clipse - Composite -FX Tooling を選択。

Cannot complete the install because one or more required items could not be found.
Software being installed: e(fx)clipse - Composite - FX Tooling 0.8.1.201303112105 (at.bestsolution.efxclipse.tooling.feature.feature.group 0.8.1.201303112105)
Missing requirement: Jemmy 0.8.1.201303112105 (at.bestsolution.efxclipse.runtime.jemmy 0.8.1.201303112105) requires 'bundle org.junit4 4.8.1' but it could not be found
Cannot satisfy dependency:
From: e(fx)clipse - Jemmy FX to Junit Test OSGi-Apps 0.8.1.201303112105 (at.bestsolution.efxclipse.runtime.jemmy.junit.feature.feature.group 0.8.1.201303112105)
To: at.bestsolution.efxclipse.runtime.jemmy [0.8.1.201303112105]
Cannot satisfy dependency:
From: e(fx)clipse - Composite - FX Tooling 0.8.1.201303112105 (at.bestsolution.efxclipse.tooling.feature.feature.group 0.8.1.201303112105)
To: at.bestsolution.efxclipse.runtime.jemmy.junit.feature.feature.group 0.8.1



最終的に Wrok with に下記を入れたら、ようやく成功!
http://download.eclipse.org/efxclipse/updates-nightly/site

e(fx)clipse - IDE -Kepler を選択
(Junoを使用している場合はJunoのほうを選択する必要があると思います)

テーマ : プログラミング
ジャンル : コンピュータ

検索フォーム
プロフィール

takuan93

Author:takuan93
本ブログの説明書→「ReadMe」

管理者に連絡

カテゴリ
WiX (5)
Ant (1)
フリーエリア
最新記事
カウンター
カレンダー
08 | 2018/09 | 10
- - - - - - 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 - - - - - -
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。